comparison gcc/config/m68k/m68k.c @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 77e2b8dfacca
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
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, 2007, 2008
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 3, 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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "function.h"
29 #include "regs.h"
30 #include "hard-reg-set.h"
31 #include "real.h"
32 #include "insn-config.h"
33 #include "conditions.h"
34 #include "output.h"
35 #include "insn-attr.h"
36 #include "recog.h"
37 #include "toplev.h"
38 #include "expr.h"
39 #include "reload.h"
40 #include "tm_p.h"
41 #include "target.h"
42 #include "target-def.h"
43 #include "debug.h"
44 #include "flags.h"
45 #include "df.h"
46 /* ??? Need to add a dependency between m68k.o and sched-int.h. */
47 #include "sched-int.h"
48 #include "insn-codes.h"
49
50 enum reg_class regno_reg_class[] =
51 {
52 DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
53 DATA_REGS, DATA_REGS, DATA_REGS, DATA_REGS,
54 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
55 ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS,
56 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
57 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
58 ADDR_REGS
59 };
60
61
62 /* The minimum number of integer registers that we want to save with the
63 movem instruction. Using two movel instructions instead of a single
64 moveml is about 15% faster for the 68020 and 68030 at no expense in
65 code size. */
66 #define MIN_MOVEM_REGS 3
67
68 /* The minimum number of floating point registers that we want to save
69 with the fmovem instruction. */
70 #define MIN_FMOVEM_REGS 1
71
72 /* Structure describing stack frame layout. */
73 struct m68k_frame
74 {
75 /* Stack pointer to frame pointer offset. */
76 HOST_WIDE_INT offset;
77
78 /* Offset of FPU registers. */
79 HOST_WIDE_INT foffset;
80
81 /* Frame size in bytes (rounded up). */
82 HOST_WIDE_INT size;
83
84 /* Data and address register. */
85 int reg_no;
86 unsigned int reg_mask;
87
88 /* FPU registers. */
89 int fpu_no;
90 unsigned int fpu_mask;
91
92 /* Offsets relative to ARG_POINTER. */
93 HOST_WIDE_INT frame_pointer_offset;
94 HOST_WIDE_INT stack_pointer_offset;
95
96 /* Function which the above information refers to. */
97 int funcdef_no;
98 };
99
100 /* Current frame information calculated by m68k_compute_frame_layout(). */
101 static struct m68k_frame current_frame;
102
103 /* Structure describing an m68k address.
104
105 If CODE is UNKNOWN, the address is BASE + INDEX * SCALE + OFFSET,
106 with null fields evaluating to 0. Here:
107
108 - BASE satisfies m68k_legitimate_base_reg_p
109 - INDEX satisfies m68k_legitimate_index_reg_p
110 - OFFSET satisfies m68k_legitimate_constant_address_p
111
112 INDEX is either HImode or SImode. The other fields are SImode.
113
114 If CODE is PRE_DEC, the address is -(BASE). If CODE is POST_INC,
115 the address is (BASE)+. */
116 struct m68k_address {
117 enum rtx_code code;
118 rtx base;
119 rtx index;
120 rtx offset;
121 int scale;
122 };
123
124 static int m68k_sched_adjust_cost (rtx, rtx, rtx, int);
125 static int m68k_sched_issue_rate (void);
126 static int m68k_sched_variable_issue (FILE *, int, rtx, int);
127 static void m68k_sched_md_init_global (FILE *, int, int);
128 static void m68k_sched_md_finish_global (FILE *, int);
129 static void m68k_sched_md_init (FILE *, int, int);
130 static void m68k_sched_dfa_pre_advance_cycle (void);
131 static void m68k_sched_dfa_post_advance_cycle (void);
132 static int m68k_sched_first_cycle_multipass_dfa_lookahead (void);
133
134 static bool m68k_handle_option (size_t, const char *, int);
135 static rtx find_addr_reg (rtx);
136 static const char *singlemove_string (rtx *);
137 #ifdef M68K_TARGET_COFF
138 static void m68k_coff_asm_named_section (const char *, unsigned int, tree);
139 #endif /* M68K_TARGET_COFF */
140 static void m68k_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
141 HOST_WIDE_INT, tree);
142 static rtx m68k_struct_value_rtx (tree, int);
143 static tree m68k_handle_fndecl_attribute (tree *node, tree name,
144 tree args, int flags,
145 bool *no_add_attrs);
146 static void m68k_compute_frame_layout (void);
147 static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
148 static bool m68k_ok_for_sibcall_p (tree, tree);
149 static bool m68k_rtx_costs (rtx, int, int, int *, bool);
150 #if M68K_HONOR_TARGET_STRICT_ALIGNMENT
151 static bool m68k_return_in_memory (const_tree, const_tree);
152 #endif
153
154
155 /* Specify the identification number of the library being built */
156 const char *m68k_library_id_string = "_current_shared_library_a5_offset_";
157
158 /* Nonzero if the last compare/test insn had FP operands. The
159 sCC expanders peek at this to determine what to do for the
160 68060, which has no fsCC instructions. */
161 int m68k_last_compare_had_fp_operands;
162
163 /* Initialize the GCC target structure. */
164
165 #if INT_OP_GROUP == INT_OP_DOT_WORD
166 #undef TARGET_ASM_ALIGNED_HI_OP
167 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
168 #endif
169
170 #if INT_OP_GROUP == INT_OP_NO_DOT
171 #undef TARGET_ASM_BYTE_OP
172 #define TARGET_ASM_BYTE_OP "\tbyte\t"
173 #undef TARGET_ASM_ALIGNED_HI_OP
174 #define TARGET_ASM_ALIGNED_HI_OP "\tshort\t"
175 #undef TARGET_ASM_ALIGNED_SI_OP
176 #define TARGET_ASM_ALIGNED_SI_OP "\tlong\t"
177 #endif
178
179 #if INT_OP_GROUP == INT_OP_DC
180 #undef TARGET_ASM_BYTE_OP
181 #define TARGET_ASM_BYTE_OP "\tdc.b\t"
182 #undef TARGET_ASM_ALIGNED_HI_OP
183 #define TARGET_ASM_ALIGNED_HI_OP "\tdc.w\t"
184 #undef TARGET_ASM_ALIGNED_SI_OP
185 #define TARGET_ASM_ALIGNED_SI_OP "\tdc.l\t"
186 #endif
187
188 #undef TARGET_ASM_UNALIGNED_HI_OP
189 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
190 #undef TARGET_ASM_UNALIGNED_SI_OP
191 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
192
193 #undef TARGET_ASM_OUTPUT_MI_THUNK
194 #define TARGET_ASM_OUTPUT_MI_THUNK m68k_output_mi_thunk
195 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
196 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
197
198 #undef TARGET_ASM_FILE_START_APP_OFF
199 #define TARGET_ASM_FILE_START_APP_OFF true
200
201 #undef TARGET_SCHED_ADJUST_COST
202 #define TARGET_SCHED_ADJUST_COST m68k_sched_adjust_cost
203
204 #undef TARGET_SCHED_ISSUE_RATE
205 #define TARGET_SCHED_ISSUE_RATE m68k_sched_issue_rate
206
207 #undef TARGET_SCHED_VARIABLE_ISSUE
208 #define TARGET_SCHED_VARIABLE_ISSUE m68k_sched_variable_issue
209
210 #undef TARGET_SCHED_INIT_GLOBAL
211 #define TARGET_SCHED_INIT_GLOBAL m68k_sched_md_init_global
212
213 #undef TARGET_SCHED_FINISH_GLOBAL
214 #define TARGET_SCHED_FINISH_GLOBAL m68k_sched_md_finish_global
215
216 #undef TARGET_SCHED_INIT
217 #define TARGET_SCHED_INIT m68k_sched_md_init
218
219 #undef TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE
220 #define TARGET_SCHED_DFA_PRE_ADVANCE_CYCLE m68k_sched_dfa_pre_advance_cycle
221
222 #undef TARGET_SCHED_DFA_POST_ADVANCE_CYCLE
223 #define TARGET_SCHED_DFA_POST_ADVANCE_CYCLE m68k_sched_dfa_post_advance_cycle
224
225 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
226 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
227 m68k_sched_first_cycle_multipass_dfa_lookahead
228
229 #undef TARGET_HANDLE_OPTION
230 #define TARGET_HANDLE_OPTION m68k_handle_option
231
232 #undef TARGET_RTX_COSTS
233 #define TARGET_RTX_COSTS m68k_rtx_costs
234
235 #undef TARGET_ATTRIBUTE_TABLE
236 #define TARGET_ATTRIBUTE_TABLE m68k_attribute_table
237
238 #undef TARGET_PROMOTE_PROTOTYPES
239 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
240
241 #undef TARGET_STRUCT_VALUE_RTX
242 #define TARGET_STRUCT_VALUE_RTX m68k_struct_value_rtx
243
244 #undef TARGET_CANNOT_FORCE_CONST_MEM
245 #define TARGET_CANNOT_FORCE_CONST_MEM m68k_illegitimate_symbolic_constant_p
246
247 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
248 #define TARGET_FUNCTION_OK_FOR_SIBCALL m68k_ok_for_sibcall_p
249
250 #if M68K_HONOR_TARGET_STRICT_ALIGNMENT
251 #undef TARGET_RETURN_IN_MEMORY
252 #define TARGET_RETURN_IN_MEMORY m68k_return_in_memory
253 #endif
254
255 static const struct attribute_spec m68k_attribute_table[] =
256 {
257 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
258 { "interrupt", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
259 { "interrupt_handler", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
260 { "interrupt_thread", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
261 { NULL, 0, 0, false, false, false, NULL }
262 };
263
264 struct gcc_target targetm = TARGET_INITIALIZER;
265
266 /* Base flags for 68k ISAs. */
267 #define FL_FOR_isa_00 FL_ISA_68000
268 #define FL_FOR_isa_10 (FL_FOR_isa_00 | FL_ISA_68010)
269 /* FL_68881 controls the default setting of -m68881. gcc has traditionally
270 generated 68881 code for 68020 and 68030 targets unless explicitly told
271 not to. */
272 #define FL_FOR_isa_20 (FL_FOR_isa_10 | FL_ISA_68020 \
273 | FL_BITFIELD | FL_68881)
274 #define FL_FOR_isa_40 (FL_FOR_isa_20 | FL_ISA_68040)
275 #define FL_FOR_isa_cpu32 (FL_FOR_isa_10 | FL_ISA_68020)
276
277 /* Base flags for ColdFire ISAs. */
278 #define FL_FOR_isa_a (FL_COLDFIRE | FL_ISA_A)
279 #define FL_FOR_isa_aplus (FL_FOR_isa_a | FL_ISA_APLUS | FL_CF_USP)
280 /* Note ISA_B doesn't necessarily include USP (user stack pointer) support. */
281 #define FL_FOR_isa_b (FL_FOR_isa_a | FL_ISA_B | FL_CF_HWDIV)
282 /* ISA_C is not upwardly compatible with ISA_B. */
283 #define FL_FOR_isa_c (FL_FOR_isa_a | FL_ISA_C | FL_CF_USP)
284
285 enum m68k_isa
286 {
287 /* Traditional 68000 instruction sets. */
288 isa_00,
289 isa_10,
290 isa_20,
291 isa_40,
292 isa_cpu32,
293 /* ColdFire instruction set variants. */
294 isa_a,
295 isa_aplus,
296 isa_b,
297 isa_c,
298 isa_max
299 };
300
301 /* Information about one of the -march, -mcpu or -mtune arguments. */
302 struct m68k_target_selection
303 {
304 /* The argument being described. */
305 const char *name;
306
307 /* For -mcpu, this is the device selected by the option.
308 For -mtune and -march, it is a representative device
309 for the microarchitecture or ISA respectively. */
310 enum target_device device;
311
312 /* The M68K_DEVICE fields associated with DEVICE. See the comment
313 in m68k-devices.def for details. FAMILY is only valid for -mcpu. */
314 const char *family;
315 enum uarch_type microarch;
316 enum m68k_isa isa;
317 unsigned long flags;
318 };
319
320 /* A list of all devices in m68k-devices.def. Used for -mcpu selection. */
321 static const struct m68k_target_selection all_devices[] =
322 {
323 #define M68K_DEVICE(NAME,ENUM_VALUE,FAMILY,MULTILIB,MICROARCH,ISA,FLAGS) \
324 { NAME, ENUM_VALUE, FAMILY, u##MICROARCH, ISA, FLAGS | FL_FOR_##ISA },
325 #include "m68k-devices.def"
326 #undef M68K_DEVICE
327 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
328 };
329
330 /* A list of all ISAs, mapping each one to a representative device.
331 Used for -march selection. */
332 static const struct m68k_target_selection all_isas[] =
333 {
334 { "68000", m68000, NULL, u68000, isa_00, FL_FOR_isa_00 },
335 { "68010", m68010, NULL, u68010, isa_10, FL_FOR_isa_10 },
336 { "68020", m68020, NULL, u68020, isa_20, FL_FOR_isa_20 },
337 { "68030", m68030, NULL, u68030, isa_20, FL_FOR_isa_20 },
338 { "68040", m68040, NULL, u68040, isa_40, FL_FOR_isa_40 },
339 { "68060", m68060, NULL, u68060, isa_40, FL_FOR_isa_40 },
340 { "cpu32", cpu32, NULL, ucpu32, isa_20, FL_FOR_isa_cpu32 },
341 { "isaa", mcf5206e, NULL, ucfv2, isa_a, (FL_FOR_isa_a
342 | FL_CF_HWDIV) },
343 { "isaaplus", mcf5271, NULL, ucfv2, isa_aplus, (FL_FOR_isa_aplus
344 | FL_CF_HWDIV) },
345 { "isab", mcf5407, NULL, ucfv4, isa_b, FL_FOR_isa_b },
346 { "isac", unk_device, NULL, ucfv4, isa_c, (FL_FOR_isa_c
347 | FL_CF_HWDIV) },
348 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
349 };
350
351 /* A list of all microarchitectures, mapping each one to a representative
352 device. Used for -mtune selection. */
353 static const struct m68k_target_selection all_microarchs[] =
354 {
355 { "68000", m68000, NULL, u68000, isa_00, FL_FOR_isa_00 },
356 { "68010", m68010, NULL, u68010, isa_10, FL_FOR_isa_10 },
357 { "68020", m68020, NULL, u68020, isa_20, FL_FOR_isa_20 },
358 { "68020-40", m68020, NULL, u68020_40, isa_20, FL_FOR_isa_20 },
359 { "68020-60", m68020, NULL, u68020_60, isa_20, FL_FOR_isa_20 },
360 { "68030", m68030, NULL, u68030, isa_20, FL_FOR_isa_20 },
361 { "68040", m68040, NULL, u68040, isa_40, FL_FOR_isa_40 },
362 { "68060", m68060, NULL, u68060, isa_40, FL_FOR_isa_40 },
363 { "cpu32", cpu32, NULL, ucpu32, isa_20, FL_FOR_isa_cpu32 },
364 { "cfv1", mcf51qe, NULL, ucfv1, isa_c, FL_FOR_isa_c },
365 { "cfv2", mcf5206, NULL, ucfv2, isa_a, FL_FOR_isa_a },
366 { "cfv3", mcf5307, NULL, ucfv3, isa_a, (FL_FOR_isa_a
367 | FL_CF_HWDIV) },
368 { "cfv4", mcf5407, NULL, ucfv4, isa_b, FL_FOR_isa_b },
369 { "cfv4e", mcf547x, NULL, ucfv4e, isa_b, (FL_FOR_isa_b
370 | FL_CF_USP
371 | FL_CF_EMAC
372 | FL_CF_FPU) },
373 { NULL, unk_device, NULL, unk_arch, isa_max, 0 }
374 };
375
376 /* The entries associated with the -mcpu, -march and -mtune settings,
377 or null for options that have not been used. */
378 const struct m68k_target_selection *m68k_cpu_entry;
379 const struct m68k_target_selection *m68k_arch_entry;
380 const struct m68k_target_selection *m68k_tune_entry;
381
382 /* Which CPU we are generating code for. */
383 enum target_device m68k_cpu;
384
385 /* Which microarchitecture to tune for. */
386 enum uarch_type m68k_tune;
387
388 /* Which FPU to use. */
389 enum fpu_type m68k_fpu;
390
391 /* The set of FL_* flags that apply to the target processor. */
392 unsigned int m68k_cpu_flags;
393
394 /* The set of FL_* flags that apply to the processor to be tuned for. */
395 unsigned int m68k_tune_flags;
396
397 /* Asm templates for calling or jumping to an arbitrary symbolic address,
398 or NULL if such calls or jumps are not supported. The address is held
399 in operand 0. */
400 const char *m68k_symbolic_call;
401 const char *m68k_symbolic_jump;
402
403 /* Enum variable that corresponds to m68k_symbolic_call values. */
404 enum M68K_SYMBOLIC_CALL m68k_symbolic_call_var;
405
406
407 /* See whether TABLE has an entry with name NAME. Return true and
408 store the entry in *ENTRY if so, otherwise return false and
409 leave *ENTRY alone. */
410
411 static bool
412 m68k_find_selection (const struct m68k_target_selection **entry,
413 const struct m68k_target_selection *table,
414 const char *name)
415 {
416 size_t i;
417
418 for (i = 0; table[i].name; i++)
419 if (strcmp (table[i].name, name) == 0)
420 {
421 *entry = table + i;
422 return true;
423 }
424 return false;
425 }
426
427 /* Implement TARGET_HANDLE_OPTION. */
428
429 static bool
430 m68k_handle_option (size_t code, const char *arg, int value)
431 {
432 switch (code)
433 {
434 case OPT_march_:
435 return m68k_find_selection (&m68k_arch_entry, all_isas, arg);
436
437 case OPT_mcpu_:
438 return m68k_find_selection (&m68k_cpu_entry, all_devices, arg);
439
440 case OPT_mtune_:
441 return m68k_find_selection (&m68k_tune_entry, all_microarchs, arg);
442
443 case OPT_m5200:
444 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5206");
445
446 case OPT_m5206e:
447 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5206e");
448
449 case OPT_m528x:
450 return m68k_find_selection (&m68k_cpu_entry, all_devices, "528x");
451
452 case OPT_m5307:
453 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5307");
454
455 case OPT_m5407:
456 return m68k_find_selection (&m68k_cpu_entry, all_devices, "5407");
457
458 case OPT_mcfv4e:
459 return m68k_find_selection (&m68k_cpu_entry, all_devices, "547x");
460
461 case OPT_m68000:
462 case OPT_mc68000:
463 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68000");
464
465 case OPT_m68010:
466 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68010");
467
468 case OPT_m68020:
469 case OPT_mc68020:
470 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68020");
471
472 case OPT_m68020_40:
473 return (m68k_find_selection (&m68k_tune_entry, all_microarchs,
474 "68020-40")
475 && m68k_find_selection (&m68k_cpu_entry, all_devices, "68020"));
476
477 case OPT_m68020_60:
478 return (m68k_find_selection (&m68k_tune_entry, all_microarchs,
479 "68020-60")
480 && m68k_find_selection (&m68k_cpu_entry, all_devices, "68020"));
481
482 case OPT_m68030:
483 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68030");
484
485 case OPT_m68040:
486 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68040");
487
488 case OPT_m68060:
489 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68060");
490
491 case OPT_m68302:
492 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68302");
493
494 case OPT_m68332:
495 case OPT_mcpu32:
496 return m68k_find_selection (&m68k_cpu_entry, all_devices, "68332");
497
498 case OPT_mshared_library_id_:
499 if (value > MAX_LIBRARY_ID)
500 error ("-mshared-library-id=%s is not between 0 and %d",
501 arg, MAX_LIBRARY_ID);
502 else
503 {
504 char *tmp;
505 asprintf (&tmp, "%d", (value * -4) - 4);
506 m68k_library_id_string = tmp;
507 }
508 return true;
509
510 default:
511 return true;
512 }
513 }
514
515 /* Sometimes certain combinations of command options do not make
516 sense on a particular target machine. You can define a macro
517 `OVERRIDE_OPTIONS' to take account of this. This macro, if
518 defined, is executed once just after all the command options have
519 been parsed.
520
521 Don't use this macro to turn on various extra optimizations for
522 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
523
524 void
525 override_options (void)
526 {
527 const struct m68k_target_selection *entry;
528 unsigned long target_mask;
529
530 /* User can choose:
531
532 -mcpu=
533 -march=
534 -mtune=
535
536 -march=ARCH should generate code that runs any processor
537 implementing architecture ARCH. -mcpu=CPU should override -march
538 and should generate code that runs on processor CPU, making free
539 use of any instructions that CPU understands. -mtune=UARCH applies
540 on top of -mcpu or -march and optimizes the code for UARCH. It does
541 not change the target architecture. */
542 if (m68k_cpu_entry)
543 {
544 /* Complain if the -march setting is for a different microarchitecture,
545 or includes flags that the -mcpu setting doesn't. */
546 if (m68k_arch_entry
547 && (m68k_arch_entry->microarch != m68k_cpu_entry->microarch
548 || (m68k_arch_entry->flags & ~m68k_cpu_entry->flags) != 0))
549 warning (0, "-mcpu=%s conflicts with -march=%s",
550 m68k_cpu_entry->name, m68k_arch_entry->name);
551
552 entry = m68k_cpu_entry;
553 }
554 else
555 entry = m68k_arch_entry;
556
557 if (!entry)
558 entry = all_devices + TARGET_CPU_DEFAULT;
559
560 m68k_cpu_flags = entry->flags;
561
562 /* Use the architecture setting to derive default values for
563 certain flags. */
564 target_mask = 0;
565
566 /* ColdFire is lenient about alignment. */
567 if (!TARGET_COLDFIRE)
568 target_mask |= MASK_STRICT_ALIGNMENT;
569
570 if ((m68k_cpu_flags & FL_BITFIELD) != 0)
571 target_mask |= MASK_BITFIELD;
572 if ((m68k_cpu_flags & FL_CF_HWDIV) != 0)
573 target_mask |= MASK_CF_HWDIV;
574 if ((m68k_cpu_flags & (FL_68881 | FL_CF_FPU)) != 0)
575 target_mask |= MASK_HARD_FLOAT;
576 target_flags |= target_mask & ~target_flags_explicit;
577
578 /* Set the directly-usable versions of the -mcpu and -mtune settings. */
579 m68k_cpu = entry->device;
580 if (m68k_tune_entry)
581 {
582 m68k_tune = m68k_tune_entry->microarch;
583 m68k_tune_flags = m68k_tune_entry->flags;
584 }
585 #ifdef M68K_DEFAULT_TUNE
586 else if (!m68k_cpu_entry && !m68k_arch_entry)
587 {
588 enum target_device dev;
589 dev = all_microarchs[M68K_DEFAULT_TUNE].device;
590 m68k_tune_flags = all_devices[dev]->flags;
591 }
592 #endif
593 else
594 {
595 m68k_tune = entry->microarch;
596 m68k_tune_flags = entry->flags;
597 }
598
599 /* Set the type of FPU. */
600 m68k_fpu = (!TARGET_HARD_FLOAT ? FPUTYPE_NONE
601 : (m68k_cpu_flags & FL_COLDFIRE) != 0 ? FPUTYPE_COLDFIRE
602 : FPUTYPE_68881);
603
604 /* Sanity check to ensure that msep-data and mid-sahred-library are not
605 * both specified together. Doing so simply doesn't make sense.
606 */
607 if (TARGET_SEP_DATA && TARGET_ID_SHARED_LIBRARY)
608 error ("cannot specify both -msep-data and -mid-shared-library");
609
610 /* If we're generating code for a separate A5 relative data segment,
611 * we've got to enable -fPIC as well. This might be relaxable to
612 * -fpic but it hasn't been tested properly.
613 */
614 if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY)
615 flag_pic = 2;
616
617 /* -mpcrel -fPIC uses 32-bit pc-relative displacements. Raise an
618 error if the target does not support them. */
619 if (TARGET_PCREL && !TARGET_68020 && flag_pic == 2)
620 error ("-mpcrel -fPIC is not currently supported on selected cpu");
621
622 /* ??? A historic way of turning on pic, or is this intended to
623 be an embedded thing that doesn't have the same name binding
624 significance that it does on hosted ELF systems? */
625 if (TARGET_PCREL && flag_pic == 0)
626 flag_pic = 1;
627
628 if (!flag_pic)
629 {
630 m68k_symbolic_call_var = M68K_SYMBOLIC_CALL_JSR;
631
632 m68k_symbolic_jump = "jra %a0";
633 }
634 else if (TARGET_ID_SHARED_LIBRARY)
635 /* All addresses must be loaded from the GOT. */
636 ;
637 else if (TARGET_68020 || TARGET_ISAB || TARGET_ISAC)
638 {
639 if (TARGET_PCREL)
640 m68k_symbolic_call_var = M68K_SYMBOLIC_CALL_BSR_C;
641 else
642 m68k_symbolic_call_var = M68K_SYMBOLIC_CALL_BSR_P;
643
644 if (TARGET_ISAC)
645 /* No unconditional long branch */;
646 else if (TARGET_PCREL)
647 m68k_symbolic_jump = "bra%.l %c0";
648 else
649 m68k_symbolic_jump = "bra%.l %p0";
650 /* Turn off function cse if we are doing PIC. We always want
651 function call to be done as `bsr foo@PLTPC'. */
652 /* ??? It's traditional to do this for -mpcrel too, but it isn't
653 clear how intentional that is. */
654 flag_no_function_cse = 1;
655 }
656
657 switch (m68k_symbolic_call_var)
658 {
659 case M68K_SYMBOLIC_CALL_JSR:
660 m68k_symbolic_call = "jsr %a0";
661 break;
662
663 case M68K_SYMBOLIC_CALL_BSR_C:
664 m68k_symbolic_call = "bsr%.l %c0";
665 break;
666
667 case M68K_SYMBOLIC_CALL_BSR_P:
668 m68k_symbolic_call = "bsr%.l %p0";
669 break;
670
671 case M68K_SYMBOLIC_CALL_NONE:
672 gcc_assert (m68k_symbolic_call == NULL);
673 break;
674
675 default:
676 gcc_unreachable ();
677 }
678
679 #ifndef ASM_OUTPUT_ALIGN_WITH_NOP
680 if (align_labels > 2)
681 {
682 warning (0, "-falign-labels=%d is not supported", align_labels);
683 align_labels = 0;
684 }
685 if (align_loops > 2)
686 {
687 warning (0, "-falign-loops=%d is not supported", align_loops);
688 align_loops = 0;
689 }
690 #endif
691
692 SUBTARGET_OVERRIDE_OPTIONS;
693
694 /* Setup scheduling options. */
695 if (TUNE_CFV1)
696 m68k_sched_cpu = CPU_CFV1;
697 else if (TUNE_CFV2)
698 m68k_sched_cpu = CPU_CFV2;
699 else if (TUNE_CFV3)
700 m68k_sched_cpu = CPU_CFV3;
701 else if (TUNE_CFV4)
702 m68k_sched_cpu = CPU_CFV4;
703 else
704 {
705 m68k_sched_cpu = CPU_UNKNOWN;
706 flag_schedule_insns = 0;
707 flag_schedule_insns_after_reload = 0;
708 flag_modulo_sched = 0;
709 }
710
711 if (m68k_sched_cpu != CPU_UNKNOWN)
712 {
713 if ((m68k_cpu_flags & (FL_CF_EMAC | FL_CF_EMAC_B)) != 0)
714 m68k_sched_mac = MAC_CF_EMAC;
715 else if ((m68k_cpu_flags & FL_CF_MAC) != 0)
716 m68k_sched_mac = MAC_CF_MAC;
717 else
718 m68k_sched_mac = MAC_NO;
719 }
720 }
721
722 /* Generate a macro of the form __mPREFIX_cpu_NAME, where PREFIX is the
723 given argument and NAME is the argument passed to -mcpu. Return NULL
724 if -mcpu was not passed. */
725
726 const char *
727 m68k_cpp_cpu_ident (const char *prefix)
728 {
729 if (!m68k_cpu_entry)
730 return NULL;
731 return concat ("__m", prefix, "_cpu_", m68k_cpu_entry->name, NULL);
732 }
733
734 /* Generate a macro of the form __mPREFIX_family_NAME, where PREFIX is the
735 given argument and NAME is the name of the representative device for
736 the -mcpu argument's family. Return NULL if -mcpu was not passed. */
737
738 const char *
739 m68k_cpp_cpu_family (const char *prefix)
740 {
741 if (!m68k_cpu_entry)
742 return NULL;
743 return concat ("__m", prefix, "_family_", m68k_cpu_entry->family, NULL);
744 }
745
746 /* Return m68k_fk_interrupt_handler if FUNC has an "interrupt" or
747 "interrupt_handler" attribute and interrupt_thread if FUNC has an
748 "interrupt_thread" attribute. Otherwise, return
749 m68k_fk_normal_function. */
750
751 enum m68k_function_kind
752 m68k_get_function_kind (tree func)
753 {
754 tree a;
755
756 gcc_assert (TREE_CODE (func) == FUNCTION_DECL);
757
758 a = lookup_attribute ("interrupt", DECL_ATTRIBUTES (func));
759 if (a != NULL_TREE)
760 return m68k_fk_interrupt_handler;
761
762 a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
763 if (a != NULL_TREE)
764 return m68k_fk_interrupt_handler;
765
766 a = lookup_attribute ("interrupt_thread", DECL_ATTRIBUTES (func));
767 if (a != NULL_TREE)
768 return m68k_fk_interrupt_thread;
769
770 return m68k_fk_normal_function;
771 }
772
773 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
774 struct attribute_spec.handler. */
775 static tree
776 m68k_handle_fndecl_attribute (tree *node, tree name,
777 tree args ATTRIBUTE_UNUSED,
778 int flags ATTRIBUTE_UNUSED,
779 bool *no_add_attrs)
780 {
781 if (TREE_CODE (*node) != FUNCTION_DECL)
782 {
783 warning (OPT_Wattributes, "%qs attribute only applies to functions",
784 IDENTIFIER_POINTER (name));
785 *no_add_attrs = true;
786 }
787
788 if (m68k_get_function_kind (*node) != m68k_fk_normal_function)
789 {
790 error ("multiple interrupt attributes not allowed");
791 *no_add_attrs = true;
792 }
793
794 if (!TARGET_FIDOA
795 && !strcmp (IDENTIFIER_POINTER (name), "interrupt_thread"))
796 {
797 error ("interrupt_thread is available only on fido");
798 *no_add_attrs = true;
799 }
800
801 return NULL_TREE;
802 }
803
804 static void
805 m68k_compute_frame_layout (void)
806 {
807 int regno, saved;
808 unsigned int mask;
809 enum m68k_function_kind func_kind =
810 m68k_get_function_kind (current_function_decl);
811 bool interrupt_handler = func_kind == m68k_fk_interrupt_handler;
812 bool interrupt_thread = func_kind == m68k_fk_interrupt_thread;
813
814 /* Only compute the frame once per function.
815 Don't cache information until reload has been completed. */
816 if (current_frame.funcdef_no == current_function_funcdef_no
817 && reload_completed)
818 return;
819
820 current_frame.size = (get_frame_size () + 3) & -4;
821
822 mask = saved = 0;
823
824 /* Interrupt thread does not need to save any register. */
825 if (!interrupt_thread)
826 for (regno = 0; regno < 16; regno++)
827 if (m68k_save_reg (regno, interrupt_handler))
828 {
829 mask |= 1 << (regno - D0_REG);
830 saved++;
831 }
832 current_frame.offset = saved * 4;
833 current_frame.reg_no = saved;
834 current_frame.reg_mask = mask;
835
836 current_frame.foffset = 0;
837 mask = saved = 0;
838 if (TARGET_HARD_FLOAT)
839 {
840 /* Interrupt thread does not need to save any register. */
841 if (!interrupt_thread)
842 for (regno = 16; regno < 24; regno++)
843 if (m68k_save_reg (regno, interrupt_handler))
844 {
845 mask |= 1 << (regno - FP0_REG);
846 saved++;
847 }
848 current_frame.foffset = saved * TARGET_FP_REG_SIZE;
849 current_frame.offset += current_frame.foffset;
850 }
851 current_frame.fpu_no = saved;
852 current_frame.fpu_mask = mask;
853
854 /* Remember what function this frame refers to. */
855 current_frame.funcdef_no = current_function_funcdef_no;
856 }
857
858 HOST_WIDE_INT
859 m68k_initial_elimination_offset (int from, int to)
860 {
861 int argptr_offset;
862 /* The arg pointer points 8 bytes before the start of the arguments,
863 as defined by FIRST_PARM_OFFSET. This makes it coincident with the
864 frame pointer in most frames. */
865 argptr_offset = frame_pointer_needed ? 0 : UNITS_PER_WORD;
866 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
867 return argptr_offset;
868
869 m68k_compute_frame_layout ();
870
871 gcc_assert (to == STACK_POINTER_REGNUM);
872 switch (from)
873 {
874 case ARG_POINTER_REGNUM:
875 return current_frame.offset + current_frame.size - argptr_offset;
876 case FRAME_POINTER_REGNUM:
877 return current_frame.offset + current_frame.size;
878 default:
879 gcc_unreachable ();
880 }
881 }
882
883 /* Refer to the array `regs_ever_live' to determine which registers
884 to save; `regs_ever_live[I]' is nonzero if register number I
885 is ever used in the function. This function is responsible for
886 knowing which registers should not be saved even if used.
887 Return true if we need to save REGNO. */
888
889 static bool
890 m68k_save_reg (unsigned int regno, bool interrupt_handler)
891 {
892 if (flag_pic && regno == PIC_REG)
893 {
894 if (crtl->saves_all_registers)
895 return true;
896 if (crtl->uses_pic_offset_table)
897 return true;
898 /* Reload may introduce constant pool references into a function
899 that thitherto didn't need a PIC register. Note that the test
900 above will not catch that case because we will only set
901 crtl->uses_pic_offset_table when emitting
902 the address reloads. */
903 if (crtl->uses_const_pool)
904 return true;
905 }
906
907 if (crtl->calls_eh_return)
908 {
909 unsigned int i;
910 for (i = 0; ; i++)
911 {
912 unsigned int test = EH_RETURN_DATA_REGNO (i);
913 if (test == INVALID_REGNUM)
914 break;
915 if (test == regno)
916 return true;
917 }
918 }
919
920 /* Fixed regs we never touch. */
921 if (fixed_regs[regno])
922 return false;
923
924 /* The frame pointer (if it is such) is handled specially. */
925 if (regno == FRAME_POINTER_REGNUM && frame_pointer_needed)
926 return false;
927
928 /* Interrupt handlers must also save call_used_regs
929 if they are live or when calling nested functions. */
930 if (interrupt_handler)
931 {
932 if (df_regs_ever_live_p (regno))
933 return true;
934
935 if (!current_function_is_leaf && call_used_regs[regno])
936 return true;
937 }
938
939 /* Never need to save registers that aren't touched. */
940 if (!df_regs_ever_live_p (regno))
941 return false;
942
943 /* Otherwise save everything that isn't call-clobbered. */
944 return !call_used_regs[regno];
945 }
946
947 /* Emit RTL for a MOVEM or FMOVEM instruction. BASE + OFFSET represents
948 the lowest memory address. COUNT is the number of registers to be
949 moved, with register REGNO + I being moved if bit I of MASK is set.
950 STORE_P specifies the direction of the move and ADJUST_STACK_P says
951 whether or not this is pre-decrement (if STORE_P) or post-increment
952 (if !STORE_P) operation. */
953
954 static rtx
955 m68k_emit_movem (rtx base, HOST_WIDE_INT offset,
956 unsigned int count, unsigned int regno,
957 unsigned int mask, bool store_p, bool adjust_stack_p)
958 {
959 int i;
960 rtx body, addr, src, operands[2];
961 enum machine_mode mode;
962
963 body = gen_rtx_PARALLEL (VOIDmode, rtvec_alloc (adjust_stack_p + count));
964 mode = reg_raw_mode[regno];
965 i = 0;
966
967 if (adjust_stack_p)
968 {
969 src = plus_constant (base, (count
970 * GET_MODE_SIZE (mode)
971 * (HOST_WIDE_INT) (store_p ? -1 : 1)));
972 XVECEXP (body, 0, i++) = gen_rtx_SET (VOIDmode, base, src);
973 }
974
975 for (; mask != 0; mask >>= 1, regno++)
976 if (mask & 1)
977 {
978 addr = plus_constant (base, offset);
979 operands[!store_p] = gen_frame_mem (mode, addr);
980 operands[store_p] = gen_rtx_REG (mode, regno);
981 XVECEXP (body, 0, i++)
982 = gen_rtx_SET (VOIDmode, operands[0], operands[1]);
983 offset += GET_MODE_SIZE (mode);
984 }
985 gcc_assert (i == XVECLEN (body, 0));
986
987 return emit_insn (body);
988 }
989
990 /* Make INSN a frame-related instruction. */
991
992 static void
993 m68k_set_frame_related (rtx insn)
994 {
995 rtx body;
996 int i;
997
998 RTX_FRAME_RELATED_P (insn) = 1;
999 body = PATTERN (insn);
1000 if (GET_CODE (body) == PARALLEL)
1001 for (i = 0; i < XVECLEN (body, 0); i++)
1002 RTX_FRAME_RELATED_P (XVECEXP (body, 0, i)) = 1;
1003 }
1004
1005 /* Emit RTL for the "prologue" define_expand. */
1006
1007 void
1008 m68k_expand_prologue (void)
1009 {
1010 HOST_WIDE_INT fsize_with_regs;
1011 rtx limit, src, dest, insn;
1012
1013 m68k_compute_frame_layout ();
1014
1015 /* If the stack limit is a symbol, we can check it here,
1016 before actually allocating the space. */
1017 if (crtl->limit_stack
1018 && GET_CODE (stack_limit_rtx) == SYMBOL_REF)
1019 {
1020 limit = plus_constant (stack_limit_rtx, current_frame.size + 4);
1021 if (!LEGITIMATE_CONSTANT_P (limit))
1022 {
1023 emit_move_insn (gen_rtx_REG (Pmode, D0_REG), limit);
1024 limit = gen_rtx_REG (Pmode, D0_REG);
1025 }
1026 emit_insn (gen_cmpsi (stack_pointer_rtx, limit));
1027 emit_insn (gen_conditional_trap (gen_rtx_LTU (VOIDmode,
1028 cc0_rtx, const0_rtx),
1029 const1_rtx));
1030 }
1031
1032 fsize_with_regs = current_frame.size;
1033 if (TARGET_COLDFIRE)
1034 {
1035 /* ColdFire's move multiple instructions do not allow pre-decrement
1036 addressing. Add the size of movem saves to the initial stack
1037 allocation instead. */
1038 if (current_frame.reg_no >= MIN_MOVEM_REGS)
1039 fsize_with_regs += current_frame.reg_no * GET_MODE_SIZE (SImode);
1040 if (current_frame.fpu_no >= MIN_FMOVEM_REGS)
1041 fsize_with_regs += current_frame.fpu_no * GET_MODE_SIZE (DFmode);
1042 }
1043
1044 if (frame_pointer_needed)
1045 {
1046 if (fsize_with_regs == 0 && TUNE_68040)
1047 {
1048 /* On the 68040, two separate moves are faster than link.w 0. */
1049 dest = gen_frame_mem (Pmode,
1050 gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx));
1051 m68k_set_frame_related (emit_move_insn (dest, frame_pointer_rtx));
1052 m68k_set_frame_related (emit_move_insn (frame_pointer_rtx,
1053 stack_pointer_rtx));
1054 }
1055 else if (fsize_with_regs < 0x8000 || TARGET_68020)
1056 m68k_set_frame_related
1057 (emit_insn (gen_link (frame_pointer_rtx,
1058 GEN_INT (-4 - fsize_with_regs))));
1059 else
1060 {
1061 m68k_set_frame_related
1062 (emit_insn (gen_link (frame_pointer_rtx, GEN_INT (-4))));
1063 m68k_set_frame_related
1064 (emit_insn (gen_addsi3 (stack_pointer_rtx,
1065 stack_pointer_rtx,
1066 GEN_INT (-fsize_with_regs))));
1067 }
1068
1069 /* If the frame pointer is needed, emit a special barrier that
1070 will prevent the scheduler from moving stores to the frame
1071 before the stack adjustment. */
1072 emit_insn (gen_stack_tie (stack_pointer_rtx, frame_pointer_rtx));
1073 }
1074 else if (fsize_with_regs != 0)
1075 m68k_set_frame_related
1076 (emit_insn (gen_addsi3 (stack_pointer_rtx,
1077 stack_pointer_rtx,
1078 GEN_INT (-fsize_with_regs))));
1079
1080 if (current_frame.fpu_mask)
1081 {
1082 gcc_assert (current_frame.fpu_no >= MIN_FMOVEM_REGS);
1083 if (TARGET_68881)
1084 m68k_set_frame_related
1085 (m68k_emit_movem (stack_pointer_rtx,
1086 current_frame.fpu_no * -GET_MODE_SIZE (XFmode),
1087 current_frame.fpu_no, FP0_REG,
1088 current_frame.fpu_mask, true, true));
1089 else
1090 {
1091 int offset;
1092
1093 /* If we're using moveml to save the integer registers,
1094 the stack pointer will point to the bottom of the moveml
1095 save area. Find the stack offset of the first FP register. */
1096 if (current_frame.reg_no < MIN_MOVEM_REGS)
1097 offset = 0;
1098 else
1099 offset = current_frame.reg_no * GET_MODE_SIZE (SImode);
1100 m68k_set_frame_related
1101 (m68k_emit_movem (stack_pointer_rtx, offset,
1102 current_frame.fpu_no, FP0_REG,
1103 current_frame.fpu_mask, true, false));
1104 }
1105 }
1106
1107 /* If the stack limit is not a symbol, check it here.
1108 This has the disadvantage that it may be too late... */
1109 if (crtl->limit_stack)
1110 {
1111 if (REG_P (stack_limit_rtx))
1112 {
1113 emit_insn (gen_cmpsi (stack_pointer_rtx, stack_limit_rtx));
1114 emit_insn (gen_conditional_trap (gen_rtx_LTU (VOIDmode,
1115 cc0_rtx, const0_rtx),
1116 const1_rtx));
1117 }
1118 else if (GET_CODE (stack_limit_rtx) != SYMBOL_REF)
1119 warning (0, "stack limit expression is not supported");
1120 }
1121
1122 if (current_frame.reg_no < MIN_MOVEM_REGS)
1123 {
1124 /* Store each register separately in the same order moveml does. */
1125 int i;
1126
1127 for (i = 16; i-- > 0; )
1128 if (current_frame.reg_mask & (1 << i))
1129 {
1130 src = gen_rtx_REG (SImode, D0_REG + i);
1131 dest = gen_frame_mem (SImode,
1132 gen_rtx_PRE_DEC (Pmode, stack_pointer_rtx));
1133 m68k_set_frame_related (emit_insn (gen_movsi (dest, src)));
1134 }
1135 }
1136 else
1137 {
1138 if (TARGET_COLDFIRE)
1139 /* The required register save space has already been allocated.
1140 The first register should be stored at (%sp). */
1141 m68k_set_frame_related
1142 (m68k_emit_movem (stack_pointer_rtx, 0,
1143 current_frame.reg_no, D0_REG,
1144 current_frame.reg_mask, true, false));
1145 else
1146 m68k_set_frame_related
1147 (m68k_emit_movem (stack_pointer_rtx,
1148 current_frame.reg_no * -GET_MODE_SIZE (SImode),
1149 current_frame.reg_no, D0_REG,
1150 current_frame.reg_mask, true, true));
1151 }
1152
1153 if (flag_pic
1154 && !TARGET_SEP_DATA
1155 && crtl->uses_pic_offset_table)
1156 insn = emit_insn (gen_load_got (pic_offset_table_rtx));
1157 }
1158
1159 /* Return true if a simple (return) instruction is sufficient for this
1160 instruction (i.e. if no epilogue is needed). */
1161
1162 bool
1163 m68k_use_return_insn (void)
1164 {
1165 if (!reload_completed || frame_pointer_needed || get_frame_size () != 0)
1166 return false;
1167
1168 m68k_compute_frame_layout ();
1169 return current_frame.offset == 0;
1170 }
1171
1172 /* Emit RTL for the "epilogue" or "sibcall_epilogue" define_expand;
1173 SIBCALL_P says which.
1174
1175 The function epilogue should not depend on the current stack pointer!
1176 It should use the frame pointer only, if there is a frame pointer.
1177 This is mandatory because of alloca; we also take advantage of it to
1178 omit stack adjustments before returning. */
1179
1180 void
1181 m68k_expand_epilogue (bool sibcall_p)
1182 {
1183 HOST_WIDE_INT fsize, fsize_with_regs;
1184 bool big, restore_from_sp;
1185
1186 m68k_compute_frame_layout ();
1187
1188 fsize = current_frame.size;
1189 big = false;
1190 restore_from_sp = false;
1191
1192 /* FIXME : current_function_is_leaf below is too strong.
1193 What we really need to know there is if there could be pending
1194 stack adjustment needed at that point. */
1195 restore_from_sp = (!frame_pointer_needed
1196 || (!cfun->calls_alloca
1197 && current_function_is_leaf));
1198
1199 /* fsize_with_regs is the size we need to adjust the sp when
1200 popping the frame. */
1201 fsize_with_regs = fsize;
1202 if (TARGET_COLDFIRE && restore_from_sp)
1203 {
1204 /* ColdFire's move multiple instructions do not allow post-increment
1205 addressing. Add the size of movem loads to the final deallocation
1206 instead. */
1207 if (current_frame.reg_no >= MIN_MOVEM_REGS)
1208 fsize_with_regs += current_frame.reg_no * GET_MODE_SIZE (SImode);
1209 if (current_frame.fpu_no >= MIN_FMOVEM_REGS)
1210 fsize_with_regs += current_frame.fpu_no * GET_MODE_SIZE (DFmode);
1211 }
1212
1213 if (current_frame.offset + fsize >= 0x8000
1214 && !restore_from_sp
1215 && (current_frame.reg_mask || current_frame.fpu_mask))
1216 {
1217 if (TARGET_COLDFIRE
1218 && (current_frame.reg_no >= MIN_MOVEM_REGS
1219 || current_frame.fpu_no >= MIN_FMOVEM_REGS))
1220 {
1221 /* ColdFire's move multiple instructions do not support the
1222 (d8,Ax,Xi) addressing mode, so we're as well using a normal
1223 stack-based restore. */
1224 emit_move_insn (gen_rtx_REG (Pmode, A1_REG),
1225 GEN_INT (-(current_frame.offset + fsize)));
1226 emit_insn (gen_addsi3 (stack_pointer_rtx,
1227 gen_rtx_REG (Pmode, A1_REG),
1228 frame_pointer_rtx));
1229 restore_from_sp = true;
1230 }
1231 else
1232 {
1233 emit_move_insn (gen_rtx_REG (Pmode, A1_REG), GEN_INT (-fsize));
1234 fsize = 0;
1235 big = true;
1236 }
1237 }
1238
1239 if (current_frame.reg_no < MIN_MOVEM_REGS)
1240 {
1241 /* Restore each register separately in the same order moveml does. */
1242 int i;
1243 HOST_WIDE_INT offset;
1244
1245 offset = current_frame.offset + fsize;
1246 for (i = 0; i < 16; i++)
1247 if (current_frame.reg_mask & (1 << i))
1248 {
1249 rtx addr;
1250
1251 if (big)
1252 {
1253 /* Generate the address -OFFSET(%fp,%a1.l). */
1254 addr = gen_rtx_REG (Pmode, A1_REG);
1255 addr = gen_rtx_PLUS (Pmode, addr, frame_pointer_rtx);
1256 addr = plus_constant (addr, -offset);
1257 }
1258 else if (restore_from_sp)
1259 addr = gen_rtx_POST_INC (Pmode, stack_pointer_rtx);
1260 else
1261 addr = plus_constant (frame_pointer_rtx, -offset);
1262 emit_move_insn (gen_rtx_REG (SImode, D0_REG + i),
1263 gen_frame_mem (SImode, addr));
1264 offset -= GET_MODE_SIZE (SImode);
1265 }
1266 }
1267 else if (current_frame.reg_mask)
1268 {
1269 if (big)
1270 m68k_emit_movem (gen_rtx_PLUS (Pmode,
1271 gen_rtx_REG (Pmode, A1_REG),
1272 frame_pointer_rtx),
1273 -(current_frame.offset + fsize),
1274 current_frame.reg_no, D0_REG,
1275 current_frame.reg_mask, false, false);
1276 else if (restore_from_sp)
1277 m68k_emit_movem (stack_pointer_rtx, 0,
1278 current_frame.reg_no, D0_REG,
1279 current_frame.reg_mask, false,
1280 !TARGET_COLDFIRE);
1281 else
1282 m68k_emit_movem (frame_pointer_rtx,
1283 -(current_frame.offset + fsize),
1284 current_frame.reg_no, D0_REG,
1285 current_frame.reg_mask, false, false);
1286 }
1287
1288 if (current_frame.fpu_no > 0)
1289 {
1290 if (big)
1291 m68k_emit_movem (gen_rtx_PLUS (Pmode,
1292 gen_rtx_REG (Pmode, A1_REG),
1293 frame_pointer_rtx),
1294 -(current_frame.foffset + fsize),
1295 current_frame.fpu_no, FP0_REG,
1296 current_frame.fpu_mask, false, false);
1297 else if (restore_from_sp)
1298 {
1299 if (TARGET_COLDFIRE)
1300 {
1301 int offset;
1302
1303 /* If we used moveml to restore the integer registers, the
1304 stack pointer will still point to the bottom of the moveml
1305 save area. Find the stack offset of the first FP
1306 register. */
1307 if (current_frame.reg_no < MIN_MOVEM_REGS)
1308 offset = 0;
1309 else
1310 offset = current_frame.reg_no * GET_MODE_SIZE (SImode);
1311 m68k_emit_movem (stack_pointer_rtx, offset,
1312 current_frame.fpu_no, FP0_REG,
1313 current_frame.fpu_mask, false, false);
1314 }
1315 else
1316 m68k_emit_movem (stack_pointer_rtx, 0,
1317 current_frame.fpu_no, FP0_REG,
1318 current_frame.fpu_mask, false, true);
1319 }
1320 else
1321 m68k_emit_movem (frame_pointer_rtx,
1322 -(current_frame.foffset + fsize),
1323 current_frame.fpu_no, FP0_REG,
1324 current_frame.fpu_mask, false, false);
1325 }
1326
1327 if (frame_pointer_needed)
1328 emit_insn (gen_unlink (frame_pointer_rtx));
1329 else if (fsize_with_regs)
1330 emit_insn (gen_addsi3 (stack_pointer_rtx,
1331 stack_pointer_rtx,
1332 GEN_INT (fsize_with_regs)));
1333
1334 if (crtl->calls_eh_return)
1335 emit_insn (gen_addsi3 (stack_pointer_rtx,
1336 stack_pointer_rtx,
1337 EH_RETURN_STACKADJ_RTX));
1338
1339 if (!sibcall_p)
1340 emit_jump_insn (gen_rtx_RETURN (VOIDmode));
1341 }
1342
1343 /* Return true if X is a valid comparison operator for the dbcc
1344 instruction.
1345
1346 Note it rejects floating point comparison operators.
1347 (In the future we could use Fdbcc).
1348
1349 It also rejects some comparisons when CC_NO_OVERFLOW is set. */
1350
1351 int
1352 valid_dbcc_comparison_p_2 (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
1353 {
1354 switch (GET_CODE (x))
1355 {
1356 case EQ: case NE: case GTU: case LTU:
1357 case GEU: case LEU:
1358 return 1;
1359
1360 /* Reject some when CC_NO_OVERFLOW is set. This may be over
1361 conservative */
1362 case GT: case LT: case GE: case LE:
1363 return ! (cc_prev_status.flags & CC_NO_OVERFLOW);
1364 default:
1365 return 0;
1366 }
1367 }
1368
1369 /* Return nonzero if flags are currently in the 68881 flag register. */
1370 int
1371 flags_in_68881 (void)
1372 {
1373 /* We could add support for these in the future */
1374 return cc_status.flags & CC_IN_68881;
1375 }
1376
1377 /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL_P. */
1378
1379 static bool
1380 m68k_ok_for_sibcall_p (tree decl, tree exp)
1381 {
1382 enum m68k_function_kind kind;
1383
1384 /* We cannot use sibcalls for nested functions because we use the
1385 static chain register for indirect calls. */
1386 if (CALL_EXPR_STATIC_CHAIN (exp))
1387 return false;
1388
1389 kind = m68k_get_function_kind (current_function_decl);
1390 if (kind == m68k_fk_normal_function)
1391 /* We can always sibcall from a normal function, because it's
1392 undefined if it is calling an interrupt function. */
1393 return true;
1394
1395 /* Otherwise we can only sibcall if the function kind is known to be
1396 the same. */
1397 if (decl && m68k_get_function_kind (decl) == kind)
1398 return true;
1399
1400 return false;
1401 }
1402
1403 /* Convert X to a legitimate function call memory reference and return the
1404 result. */
1405
1406 rtx
1407 m68k_legitimize_call_address (rtx x)
1408 {
1409 gcc_assert (MEM_P (x));
1410 if (call_operand (XEXP (x, 0), VOIDmode))
1411 return x;
1412 return replace_equiv_address (x, force_reg (Pmode, XEXP (x, 0)));
1413 }
1414
1415 /* Likewise for sibling calls. */
1416
1417 rtx
1418 m68k_legitimize_sibcall_address (rtx x)
1419 {
1420 gcc_assert (MEM_P (x));
1421 if (sibcall_operand (XEXP (x, 0), VOIDmode))
1422 return x;
1423
1424 emit_move_insn (gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM), XEXP (x, 0));
1425 return replace_equiv_address (x, gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM));
1426 }
1427
1428 /* Output a dbCC; jCC sequence. Note we do not handle the
1429 floating point version of this sequence (Fdbcc). We also
1430 do not handle alternative conditions when CC_NO_OVERFLOW is
1431 set. It is assumed that valid_dbcc_comparison_p and flags_in_68881 will
1432 kick those out before we get here. */
1433
1434 void
1435 output_dbcc_and_branch (rtx *operands)
1436 {
1437 switch (GET_CODE (operands[3]))
1438 {
1439 case EQ:
1440 output_asm_insn ("dbeq %0,%l1\n\tjeq %l2", operands);
1441 break;
1442
1443 case NE:
1444 output_asm_insn ("dbne %0,%l1\n\tjne %l2", operands);
1445 break;
1446
1447 case GT:
1448 output_asm_insn ("dbgt %0,%l1\n\tjgt %l2", operands);
1449 break;
1450
1451 case GTU:
1452 output_asm_insn ("dbhi %0,%l1\n\tjhi %l2", operands);
1453 break;
1454
1455 case LT:
1456 output_asm_insn ("dblt %0,%l1\n\tjlt %l2", operands);
1457 break;
1458
1459 case LTU:
1460 output_asm_insn ("dbcs %0,%l1\n\tjcs %l2", operands);
1461 break;
1462
1463 case GE:
1464 output_asm_insn ("dbge %0,%l1\n\tjge %l2", operands);
1465 break;
1466
1467 case GEU:
1468 output_asm_insn ("dbcc %0,%l1\n\tjcc %l2", operands);
1469 break;
1470
1471 case LE:
1472 output_asm_insn ("dble %0,%l1\n\tjle %l2", operands);
1473 break;
1474
1475 case LEU:
1476 output_asm_insn ("dbls %0,%l1\n\tjls %l2", operands);
1477 break;
1478
1479 default:
1480 gcc_unreachable ();
1481 }
1482
1483 /* If the decrement is to be done in SImode, then we have
1484 to compensate for the fact that dbcc decrements in HImode. */
1485 switch (GET_MODE (operands[0]))
1486 {
1487 case SImode:
1488 output_asm_insn ("clr%.w %0\n\tsubq%.l #1,%0\n\tjpl %l1", operands);
1489 break;
1490
1491 case HImode:
1492 break;
1493
1494 default:
1495 gcc_unreachable ();
1496 }
1497 }
1498
1499 const char *
1500 output_scc_di (rtx op, rtx operand1, rtx operand2, rtx dest)
1501 {
1502 rtx loperands[7];
1503 enum rtx_code op_code = GET_CODE (op);
1504
1505 /* This does not produce a useful cc. */
1506 CC_STATUS_INIT;
1507
1508 /* The m68k cmp.l instruction requires operand1 to be a reg as used
1509 below. Swap the operands and change the op if these requirements
1510 are not fulfilled. */
1511 if (GET_CODE (operand2) == REG && GET_CODE (operand1) != REG)
1512 {
1513 rtx tmp = operand1;
1514
1515 operand1 = operand2;
1516 operand2 = tmp;
1517 op_code = swap_condition (op_code);
1518 }
1519 loperands[0] = operand1;
1520 if (GET_CODE (operand1) == REG)
1521 loperands[1] = gen_rtx_REG (SImode, REGNO (operand1) + 1);
1522 else
1523 loperands[1] = adjust_address (operand1, SImode, 4);
1524 if (operand2 != const0_rtx)
1525 {
1526 loperands[2] = operand2;
1527 if (GET_CODE (operand2) == REG)
1528 loperands[3] = gen_rtx_REG (SImode, REGNO (operand2) + 1);
1529 else
1530 loperands[3] = adjust_address (operand2, SImode, 4);
1531 }
1532 loperands[4] = gen_label_rtx ();
1533 if (operand2 != const0_rtx)
1534 output_asm_insn ("cmp%.l %2,%0\n\tjne %l4\n\tcmp%.l %3,%1", loperands);
1535 else
1536 {
1537 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[0]))
1538 output_asm_insn ("tst%.l %0", loperands);
1539 else
1540 output_asm_insn ("cmp%.w #0,%0", loperands);
1541
1542 output_asm_insn ("jne %l4", loperands);
1543
1544 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[1]))
1545 output_asm_insn ("tst%.l %1", loperands);
1546 else
1547 output_asm_insn ("cmp%.w #0,%1", loperands);
1548 }
1549
1550 loperands[5] = dest;
1551
1552 switch (op_code)
1553 {
1554 case EQ:
1555 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1556 CODE_LABEL_NUMBER (loperands[4]));
1557 output_asm_insn ("seq %5", loperands);
1558 break;
1559
1560 case NE:
1561 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1562 CODE_LABEL_NUMBER (loperands[4]));
1563 output_asm_insn ("sne %5", loperands);
1564 break;
1565
1566 case GT:
1567 loperands[6] = gen_label_rtx ();
1568 output_asm_insn ("shi %5\n\tjra %l6", loperands);
1569 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1570 CODE_LABEL_NUMBER (loperands[4]));
1571 output_asm_insn ("sgt %5", loperands);
1572 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1573 CODE_LABEL_NUMBER (loperands[6]));
1574 break;
1575
1576 case GTU:
1577 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1578 CODE_LABEL_NUMBER (loperands[4]));
1579 output_asm_insn ("shi %5", loperands);
1580 break;
1581
1582 case LT:
1583 loperands[6] = gen_label_rtx ();
1584 output_asm_insn ("scs %5\n\tjra %l6", loperands);
1585 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1586 CODE_LABEL_NUMBER (loperands[4]));
1587 output_asm_insn ("slt %5", loperands);
1588 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1589 CODE_LABEL_NUMBER (loperands[6]));
1590 break;
1591
1592 case LTU:
1593 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1594 CODE_LABEL_NUMBER (loperands[4]));
1595 output_asm_insn ("scs %5", loperands);
1596 break;
1597
1598 case GE:
1599 loperands[6] = gen_label_rtx ();
1600 output_asm_insn ("scc %5\n\tjra %l6", loperands);
1601 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1602 CODE_LABEL_NUMBER (loperands[4]));
1603 output_asm_insn ("sge %5", loperands);
1604 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1605 CODE_LABEL_NUMBER (loperands[6]));
1606 break;
1607
1608 case GEU:
1609 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1610 CODE_LABEL_NUMBER (loperands[4]));
1611 output_asm_insn ("scc %5", loperands);
1612 break;
1613
1614 case LE:
1615 loperands[6] = gen_label_rtx ();
1616 output_asm_insn ("sls %5\n\tjra %l6", loperands);
1617 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1618 CODE_LABEL_NUMBER (loperands[4]));
1619 output_asm_insn ("sle %5", loperands);
1620 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1621 CODE_LABEL_NUMBER (loperands[6]));
1622 break;
1623
1624 case LEU:
1625 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1626 CODE_LABEL_NUMBER (loperands[4]));
1627 output_asm_insn ("sls %5", loperands);
1628 break;
1629
1630 default:
1631 gcc_unreachable ();
1632 }
1633 return "";
1634 }
1635
1636 const char *
1637 output_btst (rtx *operands, rtx countop, rtx dataop, rtx insn, int signpos)
1638 {
1639 operands[0] = countop;
1640 operands[1] = dataop;
1641
1642 if (GET_CODE (countop) == CONST_INT)
1643 {
1644 register int count = INTVAL (countop);
1645 /* If COUNT is bigger than size of storage unit in use,
1646 advance to the containing unit of same size. */
1647 if (count > signpos)
1648 {
1649 int offset = (count & ~signpos) / 8;
1650 count = count & signpos;
1651 operands[1] = dataop = adjust_address (dataop, QImode, offset);
1652 }
1653 if (count == signpos)
1654 cc_status.flags = CC_NOT_POSITIVE | CC_Z_IN_NOT_N;
1655 else
1656 cc_status.flags = CC_NOT_NEGATIVE | CC_Z_IN_NOT_N;
1657
1658 /* These three statements used to use next_insns_test_no...
1659 but it appears that this should do the same job. */
1660 if (count == 31
1661 && next_insn_tests_no_inequality (insn))
1662 return "tst%.l %1";
1663 if (count == 15
1664 && next_insn_tests_no_inequality (insn))
1665 return "tst%.w %1";
1666 if (count == 7
1667 && next_insn_tests_no_inequality (insn))
1668 return "tst%.b %1";
1669 /* Try to use `movew to ccr' followed by the appropriate branch insn.
1670 On some m68k variants unfortunately that's slower than btst.
1671 On 68000 and higher, that should also work for all HImode operands. */
1672 if (TUNE_CPU32 || TARGET_COLDFIRE || optimize_size)
1673 {
1674 if (count == 3 && DATA_REG_P (operands[1])
1675 && next_insn_tests_no_inequality (insn))
1676 {
1677 cc_status.flags = CC_NOT_NEGATIVE | CC_Z_IN_NOT_N | CC_NO_OVERFLOW;
1678 return "move%.w %1,%%ccr";
1679 }
1680 if (count == 2 && DATA_REG_P (operands[1])
1681 && next_insn_tests_no_inequality (insn))
1682 {
1683 cc_status.flags = CC_NOT_NEGATIVE | CC_INVERTED | CC_NO_OVERFLOW;
1684 return "move%.w %1,%%ccr";
1685 }
1686 /* count == 1 followed by bvc/bvs and
1687 count == 0 followed by bcc/bcs are also possible, but need
1688 m68k-specific CC_Z_IN_NOT_V and CC_Z_IN_NOT_C flags. */
1689 }
1690
1691 cc_status.flags = CC_NOT_NEGATIVE;
1692 }
1693 return "btst %0,%1";
1694 }
1695
1696 /* Return true if X is a legitimate base register. STRICT_P says
1697 whether we need strict checking. */
1698
1699 bool
1700 m68k_legitimate_base_reg_p (rtx x, bool strict_p)
1701 {
1702 /* Allow SUBREG everywhere we allow REG. This results in better code. */
1703 if (!strict_p && GET_CODE (x) == SUBREG)
1704 x = SUBREG_REG (x);
1705
1706 return (REG_P (x)
1707 && (strict_p
1708 ? REGNO_OK_FOR_BASE_P (REGNO (x))
1709 : REGNO_OK_FOR_BASE_NONSTRICT_P (REGNO (x))));
1710 }
1711
1712 /* Return true if X is a legitimate index register. STRICT_P says
1713 whether we need strict checking. */
1714
1715 bool
1716 m68k_legitimate_index_reg_p (rtx x, bool strict_p)
1717 {
1718 if (!strict_p && GET_CODE (x) == SUBREG)
1719 x = SUBREG_REG (x);
1720
1721 return (REG_P (x)
1722 && (strict_p
1723 ? REGNO_OK_FOR_INDEX_P (REGNO (x))
1724 : REGNO_OK_FOR_INDEX_NONSTRICT_P (REGNO (x))));
1725 }
1726
1727 /* Return true if X is a legitimate index expression for a (d8,An,Xn) or
1728 (bd,An,Xn) addressing mode. Fill in the INDEX and SCALE fields of
1729 ADDRESS if so. STRICT_P says whether we need strict checking. */
1730
1731 static bool
1732 m68k_decompose_index (rtx x, bool strict_p, struct m68k_address *address)
1733 {
1734 int scale;
1735
1736 /* Check for a scale factor. */
1737 scale = 1;
1738 if ((TARGET_68020 || TARGET_COLDFIRE)
1739 && GET_CODE (x) == MULT
1740 && GET_CODE (XEXP (x, 1)) == CONST_INT
1741 && (INTVAL (XEXP (x, 1)) == 2
1742 || INTVAL (XEXP (x, 1)) == 4
1743 || (INTVAL (XEXP (x, 1)) == 8
1744 && (TARGET_COLDFIRE_FPU || !TARGET_COLDFIRE))))
1745 {
1746 scale = INTVAL (XEXP (x, 1));
1747 x = XEXP (x, 0);
1748 }
1749
1750 /* Check for a word extension. */
1751 if (!TARGET_COLDFIRE
1752 && GET_CODE (x) == SIGN_EXTEND
1753 && GET_MODE (XEXP (x, 0)) == HImode)
1754 x = XEXP (x, 0);
1755
1756 if (m68k_legitimate_index_reg_p (x, strict_p))
1757 {
1758 address->scale = scale;
1759 address->index = x;
1760 return true;
1761 }
1762
1763 return false;
1764 }
1765
1766 /* Return true if X is an illegitimate symbolic constant. */
1767
1768 bool
1769 m68k_illegitimate_symbolic_constant_p (rtx x)
1770 {
1771 rtx base, offset;
1772
1773 if (M68K_OFFSETS_MUST_BE_WITHIN_SECTIONS_P)
1774 {
1775 split_const (x, &base, &offset);
1776 if (GET_CODE (base) == SYMBOL_REF
1777 && !offset_within_block_p (base, INTVAL (offset)))
1778 return true;
1779 }
1780 return false;
1781 }
1782
1783 /* Return true if X is a legitimate constant address that can reach
1784 bytes in the range [X, X + REACH). STRICT_P says whether we need
1785 strict checking. */
1786
1787 static bool
1788 m68k_legitimate_constant_address_p (rtx x, unsigned int reach, bool strict_p)
1789 {
1790 rtx base, offset;
1791
1792 if (!CONSTANT_ADDRESS_P (x))
1793 return false;
1794
1795 if (flag_pic
1796 && !(strict_p && TARGET_PCREL)
1797 && symbolic_operand (x, VOIDmode))
1798 return false;
1799
1800 if (M68K_OFFSETS_MUST_BE_WITHIN_SECTIONS_P && reach > 1)
1801 {
1802 split_const (x, &base, &offset);
1803 if (GET_CODE (base) == SYMBOL_REF
1804 && !offset_within_block_p (base, INTVAL (offset) + reach - 1))
1805 return false;
1806 }
1807
1808 return true;
1809 }
1810
1811 /* Return true if X is a LABEL_REF for a jump table. Assume that unplaced
1812 labels will become jump tables. */
1813
1814 static bool
1815 m68k_jump_table_ref_p (rtx x)
1816 {
1817 if (GET_CODE (x) != LABEL_REF)
1818 return false;
1819
1820 x = XEXP (x, 0);
1821 if (!NEXT_INSN (x) && !PREV_INSN (x))
1822 return true;
1823
1824 x = next_nonnote_insn (x);
1825 return x && JUMP_TABLE_DATA_P (x);
1826 }
1827
1828 /* Return true if X is a legitimate address for values of mode MODE.
1829 STRICT_P says whether strict checking is needed. If the address
1830 is valid, describe its components in *ADDRESS. */
1831
1832 static bool
1833 m68k_decompose_address (enum machine_mode mode, rtx x,
1834 bool strict_p, struct m68k_address *address)
1835 {
1836 unsigned int reach;
1837
1838 memset (address, 0, sizeof (*address));
1839
1840 if (mode == BLKmode)
1841 reach = 1;
1842 else
1843 reach = GET_MODE_SIZE (mode);
1844
1845 /* Check for (An) (mode 2). */
1846 if (m68k_legitimate_base_reg_p (x, strict_p))
1847 {
1848 address->base = x;
1849 return true;
1850 }
1851
1852 /* Check for -(An) and (An)+ (modes 3 and 4). */
1853 if ((GET_CODE (x) == PRE_DEC || GET_CODE (x) == POST_INC)
1854 && m68k_legitimate_base_reg_p (XEXP (x, 0), strict_p))
1855 {
1856 address->code = GET_CODE (x);
1857 address->base = XEXP (x, 0);
1858 return true;
1859 }
1860
1861 /* Check for (d16,An) (mode 5). */
1862 if (GET_CODE (x) == PLUS
1863 && GET_CODE (XEXP (x, 1)) == CONST_INT
1864 && IN_RANGE (INTVAL (XEXP (x, 1)), -0x8000, 0x8000 - reach)
1865 && m68k_legitimate_base_reg_p (XEXP (x, 0), strict_p))
1866 {
1867 address->base = XEXP (x, 0);
1868 address->offset = XEXP (x, 1);
1869 return true;
1870 }
1871
1872 /* Check for GOT loads. These are (bd,An,Xn) addresses if
1873 TARGET_68020 && flag_pic == 2, otherwise they are (d16,An)
1874 addresses. */
1875 if (flag_pic
1876 && GET_CODE (x) == PLUS
1877 && XEXP (x, 0) == pic_offset_table_rtx
1878 && (GET_CODE (XEXP (x, 1)) == SYMBOL_REF
1879 || GET_CODE (XEXP (x, 1)) == LABEL_REF))
1880 {
1881 address->base = XEXP (x, 0);
1882 address->offset = XEXP (x, 1);
1883 return true;
1884 }
1885
1886 /* The ColdFire FPU only accepts addressing modes 2-5. */
1887 if (TARGET_COLDFIRE_FPU && GET_MODE_CLASS (mode) == MODE_FLOAT)
1888 return false;
1889
1890 /* Check for (xxx).w and (xxx).l. Also, in the TARGET_PCREL case,
1891 check for (d16,PC) or (bd,PC,Xn) with a suppressed index register.
1892 All these modes are variations of mode 7. */
1893 if (m68k_legitimate_constant_address_p (x, reach, strict_p))
1894 {
1895 address->offset = x;
1896 return true;
1897 }
1898
1899 /* Check for (d8,PC,Xn), a mode 7 form. This case is needed for
1900 tablejumps.
1901
1902 ??? do_tablejump creates these addresses before placing the target
1903 label, so we have to assume that unplaced labels are jump table
1904 references. It seems unlikely that we would ever generate indexed
1905 accesses to unplaced labels in other cases. */
1906 if (GET_CODE (x) == PLUS
1907 && m68k_jump_table_ref_p (XEXP (x, 1))
1908 && m68k_decompose_index (XEXP (x, 0), strict_p, address))
1909 {
1910 address->offset = XEXP (x, 1);
1911 return true;
1912 }
1913
1914 /* Everything hereafter deals with (d8,An,Xn.SIZE*SCALE) or
1915 (bd,An,Xn.SIZE*SCALE) addresses. */
1916
1917 if (TARGET_68020)
1918 {
1919 /* Check for a nonzero base displacement. */
1920 if (GET_CODE (x) == PLUS
1921 && m68k_legitimate_constant_address_p (XEXP (x, 1), reach, strict_p))
1922 {
1923 address->offset = XEXP (x, 1);
1924 x = XEXP (x, 0);
1925 }
1926
1927 /* Check for a suppressed index register. */
1928 if (m68k_legitimate_base_reg_p (x, strict_p))
1929 {
1930 address->base = x;
1931 return true;
1932 }
1933
1934 /* Check for a suppressed base register. Do not allow this case
1935 for non-symbolic offsets as it effectively gives gcc freedom
1936 to treat data registers as base registers, which can generate
1937 worse code. */
1938 if (address->offset
1939 && symbolic_operand (address->offset, VOIDmode)
1940 && m68k_decompose_index (x, strict_p, address))
1941 return true;
1942 }
1943 else
1944 {
1945 /* Check for a nonzero base displacement. */
1946 if (GET_CODE (x) == PLUS
1947 && GET_CODE (XEXP (x, 1)) == CONST_INT
1948 && IN_RANGE (INTVAL (XEXP (x, 1)), -0x80, 0x80 - reach))
1949 {
1950 address->offset = XEXP (x, 1);
1951 x = XEXP (x, 0);
1952 }
1953 }
1954
1955 /* We now expect the sum of a base and an index. */
1956 if (GET_CODE (x) == PLUS)
1957 {
1958 if (m68k_legitimate_base_reg_p (XEXP (x, 0), strict_p)
1959 && m68k_decompose_index (XEXP (x, 1), strict_p, address))
1960 {
1961 address->base = XEXP (x, 0);
1962 return true;
1963 }
1964
1965 if (m68k_legitimate_base_reg_p (XEXP (x, 1), strict_p)
1966 && m68k_decompose_index (XEXP (x, 0), strict_p, address))
1967 {
1968 address->base = XEXP (x, 1);
1969 return true;
1970 }
1971 }
1972 return false;
1973 }
1974
1975 /* Return true if X is a legitimate address for values of mode MODE.
1976 STRICT_P says whether strict checking is needed. */
1977
1978 bool
1979 m68k_legitimate_address_p (enum machine_mode mode, rtx x, bool strict_p)
1980 {
1981 struct m68k_address address;
1982
1983 return m68k_decompose_address (mode, x, strict_p, &address);
1984 }
1985
1986 /* Return true if X is a memory, describing its address in ADDRESS if so.
1987 Apply strict checking if called during or after reload. */
1988
1989 static bool
1990 m68k_legitimate_mem_p (rtx x, struct m68k_address *address)
1991 {
1992 return (MEM_P (x)
1993 && m68k_decompose_address (GET_MODE (x), XEXP (x, 0),
1994 reload_in_progress || reload_completed,
1995 address));
1996 }
1997
1998 /* Return true if X matches the 'Q' constraint. It must be a memory
1999 with a base address and no constant offset or index. */
2000
2001 bool
2002 m68k_matches_q_p (rtx x)
2003 {
2004 struct m68k_address address;
2005
2006 return (m68k_legitimate_mem_p (x, &address)
2007 && address.code == UNKNOWN
2008 && address.base
2009 && !address.offset
2010 && !address.index);
2011 }
2012
2013 /* Return true if X matches the 'U' constraint. It must be a base address
2014 with a constant offset and no index. */
2015
2016 bool
2017 m68k_matches_u_p (rtx x)
2018 {
2019 struct m68k_address address;
2020
2021 return (m68k_legitimate_mem_p (x, &address)
2022 && address.code == UNKNOWN
2023 && address.base
2024 && address.offset
2025 && !address.index);
2026 }
2027
2028 /* Legitimize PIC addresses. If the address is already
2029 position-independent, we return ORIG. Newly generated
2030 position-independent addresses go to REG. If we need more
2031 than one register, we lose.
2032
2033 An address is legitimized by making an indirect reference
2034 through the Global Offset Table with the name of the symbol
2035 used as an offset.
2036
2037 The assembler and linker are responsible for placing the
2038 address of the symbol in the GOT. The function prologue
2039 is responsible for initializing a5 to the starting address
2040 of the GOT.
2041
2042 The assembler is also responsible for translating a symbol name
2043 into a constant displacement from the start of the GOT.
2044
2045 A quick example may make things a little clearer:
2046
2047 When not generating PIC code to store the value 12345 into _foo
2048 we would generate the following code:
2049
2050 movel #12345, _foo
2051
2052 When generating PIC two transformations are made. First, the compiler
2053 loads the address of foo into a register. So the first transformation makes:
2054
2055 lea _foo, a0
2056 movel #12345, a0@
2057
2058 The code in movsi will intercept the lea instruction and call this
2059 routine which will transform the instructions into:
2060
2061 movel a5@(_foo:w), a0
2062 movel #12345, a0@
2063
2064
2065 That (in a nutshell) is how *all* symbol and label references are
2066 handled. */
2067
2068 rtx
2069 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
2070 rtx reg)
2071 {
2072 rtx pic_ref = orig;
2073
2074 /* First handle a simple SYMBOL_REF or LABEL_REF */
2075 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
2076 {
2077 gcc_assert (reg);
2078
2079 if (TARGET_COLDFIRE && TARGET_XGOT)
2080 /* When compiling with -mxgot switch the code for the above
2081 example will look like this:
2082
2083 movel a5, a0
2084 addl _foo@GOT, a0
2085 movel a0@, a0
2086 movel #12345, a0@ */
2087 {
2088 rtx pic_offset;
2089
2090 /* Wrap ORIG in UNSPEC_GOTOFF to tip m68k_output_addr_const_extra
2091 to put @GOT after reference. */
2092 pic_offset = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
2093 UNSPEC_GOTOFF);
2094 pic_offset = gen_rtx_CONST (Pmode, pic_offset);
2095 emit_move_insn (reg, pic_offset);
2096 emit_insn (gen_addsi3 (reg, reg, pic_offset_table_rtx));
2097 pic_ref = gen_rtx_MEM (Pmode, reg);
2098 }
2099 else
2100 pic_ref = gen_rtx_MEM (Pmode,
2101 gen_rtx_PLUS (Pmode,
2102 pic_offset_table_rtx, orig));
2103 crtl->uses_pic_offset_table = 1;
2104 MEM_READONLY_P (pic_ref) = 1;
2105 emit_move_insn (reg, pic_ref);
2106 return reg;
2107 }
2108 else if (GET_CODE (orig) == CONST)
2109 {
2110 rtx base;
2111
2112 /* Make sure this has not already been legitimized. */
2113 if (GET_CODE (XEXP (orig, 0)) == PLUS
2114 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
2115 return orig;
2116
2117 gcc_assert (reg);
2118
2119 /* legitimize both operands of the PLUS */
2120 gcc_assert (GET_CODE (XEXP (orig, 0)) == PLUS);
2121
2122 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
2123 orig = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
2124 base == reg ? 0 : reg);
2125
2126 if (GET_CODE (orig) == CONST_INT)
2127 return plus_constant (base, INTVAL (orig));
2128 pic_ref = gen_rtx_PLUS (Pmode, base, orig);
2129 /* Likewise, should we set special REG_NOTEs here? */
2130 }
2131 return pic_ref;
2132 }
2133
2134
2135
2136 #define USE_MOVQ(i) ((unsigned) ((i) + 128) <= 255)
2137
2138 /* Return the type of move that should be used for integer I. */
2139
2140 M68K_CONST_METHOD
2141 m68k_const_method (HOST_WIDE_INT i)
2142 {
2143 unsigned u;
2144
2145 if (USE_MOVQ (i))
2146 return MOVQ;
2147
2148 /* The ColdFire doesn't have byte or word operations. */
2149 /* FIXME: This may not be useful for the m68060 either. */
2150 if (!TARGET_COLDFIRE)
2151 {
2152 /* if -256 < N < 256 but N is not in range for a moveq
2153 N^ff will be, so use moveq #N^ff, dreg; not.b dreg. */
2154 if (USE_MOVQ (i ^ 0xff))
2155 return NOTB;
2156 /* Likewise, try with not.w */
2157 if (USE_MOVQ (i ^ 0xffff))
2158 return NOTW;
2159 /* This is the only value where neg.w is useful */
2160 if (i == -65408)
2161 return NEGW;
2162 }
2163
2164 /* Try also with swap. */
2165 u = i;
2166 if (USE_MOVQ ((u >> 16) | (u << 16)))
2167 return SWAP;
2168
2169 if (TARGET_ISAB)
2170 {
2171 /* Try using MVZ/MVS with an immediate value to load constants. */
2172 if (i >= 0 && i <= 65535)
2173 return MVZ;
2174 if (i >= -32768 && i <= 32767)
2175 return MVS;
2176 }
2177
2178 /* Otherwise, use move.l */
2179 return MOVL;
2180 }
2181
2182 /* Return the cost of moving constant I into a data register. */
2183
2184 static int
2185 const_int_cost (HOST_WIDE_INT i)
2186 {
2187 switch (m68k_const_method (i))
2188 {
2189 case MOVQ:
2190 /* Constants between -128 and 127 are cheap due to moveq. */
2191 return 0;
2192 case MVZ:
2193 case MVS:
2194 case NOTB:
2195 case NOTW:
2196 case NEGW:
2197 case SWAP:
2198 /* Constants easily generated by moveq + not.b/not.w/neg.w/swap. */
2199 return 1;
2200 case MOVL:
2201 return 2;
2202 default:
2203 gcc_unreachable ();
2204 }
2205 }
2206
2207 static bool
2208 m68k_rtx_costs (rtx x, int code, int outer_code, int *total,
2209 bool speed ATTRIBUTE_UNUSED)
2210 {
2211 switch (code)
2212 {
2213 case CONST_INT:
2214 /* Constant zero is super cheap due to clr instruction. */
2215 if (x == const0_rtx)
2216 *total = 0;
2217 else
2218 *total = const_int_cost (INTVAL (x));
2219 return true;
2220
2221 case CONST:
2222 case LABEL_REF:
2223 case SYMBOL_REF:
2224 *total = 3;
2225 return true;
2226
2227 case CONST_DOUBLE:
2228 /* Make 0.0 cheaper than other floating constants to
2229 encourage creating tstsf and tstdf insns. */
2230 if (outer_code == COMPARE
2231 && (x == CONST0_RTX (SFmode) || x == CONST0_RTX (DFmode)))
2232 *total = 4;
2233 else
2234 *total = 5;
2235 return true;
2236
2237 /* These are vaguely right for a 68020. */
2238 /* The costs for long multiply have been adjusted to work properly
2239 in synth_mult on the 68020, relative to an average of the time
2240 for add and the time for shift, taking away a little more because
2241 sometimes move insns are needed. */
2242 /* div?.w is relatively cheaper on 68000 counted in COSTS_N_INSNS
2243 terms. */
2244 #define MULL_COST \
2245 (TUNE_68060 ? 2 \
2246 : TUNE_68040 ? 5 \
2247 : (TUNE_CFV2 && TUNE_EMAC) ? 3 \
2248 : (TUNE_CFV2 && TUNE_MAC) ? 4 \
2249 : TUNE_CFV2 ? 8 \
2250 : TARGET_COLDFIRE ? 3 : 13)
2251
2252 #define MULW_COST \
2253 (TUNE_68060 ? 2 \
2254 : TUNE_68040 ? 3 \
2255 : TUNE_68000_10 ? 5 \
2256 : (TUNE_CFV2 && TUNE_EMAC) ? 3 \
2257 : (TUNE_CFV2 && TUNE_MAC) ? 2 \
2258 : TUNE_CFV2 ? 8 \
2259 : TARGET_COLDFIRE ? 2 : 8)
2260
2261 #define DIVW_COST \
2262 (TARGET_CF_HWDIV ? 11 \
2263 : TUNE_68000_10 || TARGET_COLDFIRE ? 12 : 27)
2264
2265 case PLUS:
2266 /* An lea costs about three times as much as a simple add. */
2267 if (GET_MODE (x) == SImode
2268 && GET_CODE (XEXP (x, 1)) == REG
2269 && GET_CODE (XEXP (x, 0)) == MULT
2270 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
2271 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
2272 && (INTVAL (XEXP (XEXP (x, 0), 1)) == 2
2273 || INTVAL (XEXP (XEXP (x, 0), 1)) == 4
2274 || INTVAL (XEXP (XEXP (x, 0), 1)) == 8))
2275 {
2276 /* lea an@(dx:l:i),am */
2277 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 2 : 3);
2278 return true;
2279 }
2280 return false;
2281
2282 case ASHIFT:
2283 case ASHIFTRT:
2284 case LSHIFTRT:
2285 if (TUNE_68060)
2286 {
2287 *total = COSTS_N_INSNS(1);
2288 return true;
2289 }
2290 if (TUNE_68000_10)
2291 {
2292 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
2293 {
2294 if (INTVAL (XEXP (x, 1)) < 16)
2295 *total = COSTS_N_INSNS (2) + INTVAL (XEXP (x, 1)) / 2;
2296 else
2297 /* We're using clrw + swap for these cases. */
2298 *total = COSTS_N_INSNS (4) + (INTVAL (XEXP (x, 1)) - 16) / 2;
2299 }
2300 else
2301 *total = COSTS_N_INSNS (10); /* Worst case. */
2302 return true;
2303 }
2304 /* A shift by a big integer takes an extra instruction. */
2305 if (GET_CODE (XEXP (x, 1)) == CONST_INT
2306 && (INTVAL (XEXP (x, 1)) == 16))
2307 {
2308 *total = COSTS_N_INSNS (2); /* clrw;swap */
2309 return true;
2310 }
2311 if (GET_CODE (XEXP (x, 1)) == CONST_INT
2312 && !(INTVAL (XEXP (x, 1)) > 0
2313 && INTVAL (XEXP (x, 1)) <= 8))
2314 {
2315 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 1 : 3); /* lsr #i,dn */
2316 return true;
2317 }
2318 return false;
2319
2320 case MULT:
2321 if ((GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
2322 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
2323 && GET_MODE (x) == SImode)
2324 *total = COSTS_N_INSNS (MULW_COST);
2325 else if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
2326 *total = COSTS_N_INSNS (MULW_COST);
2327 else
2328 *total = COSTS_N_INSNS (MULL_COST);
2329 return true;
2330
2331 case DIV:
2332 case UDIV:
2333 case MOD:
2334 case UMOD:
2335 if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
2336 *total = COSTS_N_INSNS (DIVW_COST); /* div.w */
2337 else if (TARGET_CF_HWDIV)
2338 *total = COSTS_N_INSNS (18);
2339 else
2340 *total = COSTS_N_INSNS (43); /* div.l */
2341 return true;
2342
2343 default:
2344 return false;
2345 }
2346 }
2347
2348 /* Return an instruction to move CONST_INT OPERANDS[1] into data register
2349 OPERANDS[0]. */
2350
2351 static const char *
2352 output_move_const_into_data_reg (rtx *operands)
2353 {
2354 HOST_WIDE_INT i;
2355
2356 i = INTVAL (operands[1]);
2357 switch (m68k_const_method (i))
2358 {
2359 case MVZ:
2360 return "mvzw %1,%0";
2361 case MVS:
2362 return "mvsw %1,%0";
2363 case MOVQ:
2364 return "moveq %1,%0";
2365 case NOTB:
2366 CC_STATUS_INIT;
2367 operands[1] = GEN_INT (i ^ 0xff);
2368 return "moveq %1,%0\n\tnot%.b %0";
2369 case NOTW:
2370 CC_STATUS_INIT;
2371 operands[1] = GEN_INT (i ^ 0xffff);
2372 return "moveq %1,%0\n\tnot%.w %0";
2373 case NEGW:
2374 CC_STATUS_INIT;
2375 return "moveq #-128,%0\n\tneg%.w %0";
2376 case SWAP:
2377 {
2378 unsigned u = i;
2379
2380 operands[1] = GEN_INT ((u << 16) | (u >> 16));
2381 return "moveq %1,%0\n\tswap %0";
2382 }
2383 case MOVL:
2384 return "move%.l %1,%0";
2385 default:
2386 gcc_unreachable ();
2387 }
2388 }
2389
2390 /* Return true if I can be handled by ISA B's mov3q instruction. */
2391
2392 bool
2393 valid_mov3q_const (HOST_WIDE_INT i)
2394 {
2395 return TARGET_ISAB && (i == -1 || IN_RANGE (i, 1, 7));
2396 }
2397
2398 /* Return an instruction to move CONST_INT OPERANDS[1] into OPERANDS[0].
2399 I is the value of OPERANDS[1]. */
2400
2401 static const char *
2402 output_move_simode_const (rtx *operands)
2403 {
2404 rtx dest;
2405 HOST_WIDE_INT src;
2406
2407 dest = operands[0];
2408 src = INTVAL (operands[1]);
2409 if (src == 0
2410 && (DATA_REG_P (dest) || MEM_P (dest))
2411 /* clr insns on 68000 read before writing. */
2412 && ((TARGET_68010 || TARGET_COLDFIRE)
2413 || !(MEM_P (dest) && MEM_VOLATILE_P (dest))))
2414 return "clr%.l %0";
2415 else if (GET_MODE (dest) == SImode && valid_mov3q_const (src))
2416 return "mov3q%.l %1,%0";
2417 else if (src == 0 && ADDRESS_REG_P (dest))
2418 return "sub%.l %0,%0";
2419 else if (DATA_REG_P (dest))
2420 return output_move_const_into_data_reg (operands);
2421 else if (ADDRESS_REG_P (dest) && IN_RANGE (src, -0x8000, 0x7fff))
2422 {
2423 if (valid_mov3q_const (src))
2424 return "mov3q%.l %1,%0";
2425 return "move%.w %1,%0";
2426 }
2427 else if (MEM_P (dest)
2428 && GET_CODE (XEXP (dest, 0)) == PRE_DEC
2429 && REGNO (XEXP (XEXP (dest, 0), 0)) == STACK_POINTER_REGNUM
2430 && IN_RANGE (src, -0x8000, 0x7fff))
2431 {
2432 if (valid_mov3q_const (src))
2433 return "mov3q%.l %1,%-";
2434 return "pea %a1";
2435 }
2436 return "move%.l %1,%0";
2437 }
2438
2439 const char *
2440 output_move_simode (rtx *operands)
2441 {
2442 if (GET_CODE (operands[1]) == CONST_INT)
2443 return output_move_simode_const (operands);
2444 else if ((GET_CODE (operands[1]) == SYMBOL_REF
2445 || GET_CODE (operands[1]) == CONST)
2446 && push_operand (operands[0], SImode))
2447 return "pea %a1";
2448 else if ((GET_CODE (operands[1]) == SYMBOL_REF
2449 || GET_CODE (operands[1]) == CONST)
2450 && ADDRESS_REG_P (operands[0]))
2451 return "lea %a1,%0";
2452 return "move%.l %1,%0";
2453 }
2454
2455 const char *
2456 output_move_himode (rtx *operands)
2457 {
2458 if (GET_CODE (operands[1]) == CONST_INT)
2459 {
2460 if (operands[1] == const0_rtx
2461 && (DATA_REG_P (operands[0])
2462 || GET_CODE (operands[0]) == MEM)
2463 /* clr insns on 68000 read before writing. */
2464 && ((TARGET_68010 || TARGET_COLDFIRE)
2465 || !(GET_CODE (operands[0]) == MEM
2466 && MEM_VOLATILE_P (operands[0]))))
2467 return "clr%.w %0";
2468 else if (operands[1] == const0_rtx
2469 && ADDRESS_REG_P (operands[0]))
2470 return "sub%.l %0,%0";
2471 else if (DATA_REG_P (operands[0])
2472 && INTVAL (operands[1]) < 128
2473 && INTVAL (operands[1]) >= -128)
2474 return "moveq %1,%0";
2475 else if (INTVAL (operands[1]) < 0x8000
2476 && INTVAL (operands[1]) >= -0x8000)
2477 return "move%.w %1,%0";
2478 }
2479 else if (CONSTANT_P (operands[1]))
2480 return "move%.l %1,%0";
2481 return "move%.w %1,%0";
2482 }
2483
2484 const char *
2485 output_move_qimode (rtx *operands)
2486 {
2487 /* 68k family always modifies the stack pointer by at least 2, even for
2488 byte pushes. The 5200 (ColdFire) does not do this. */
2489
2490 /* This case is generated by pushqi1 pattern now. */
2491 gcc_assert (!(GET_CODE (operands[0]) == MEM
2492 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
2493 && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx
2494 && ! ADDRESS_REG_P (operands[1])
2495 && ! TARGET_COLDFIRE));
2496
2497 /* clr and st insns on 68000 read before writing. */
2498 if (!ADDRESS_REG_P (operands[0])
2499 && ((TARGET_68010 || TARGET_COLDFIRE)
2500 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2501 {
2502 if (operands[1] == const0_rtx)
2503 return "clr%.b %0";
2504 if ((!TARGET_COLDFIRE || DATA_REG_P (operands[0]))
2505 && GET_CODE (operands[1]) == CONST_INT
2506 && (INTVAL (operands[1]) & 255) == 255)
2507 {
2508 CC_STATUS_INIT;
2509 return "st %0";
2510 }
2511 }
2512 if (GET_CODE (operands[1]) == CONST_INT
2513 && DATA_REG_P (operands[0])
2514 && INTVAL (operands[1]) < 128
2515 && INTVAL (operands[1]) >= -128)
2516 return "moveq %1,%0";
2517 if (operands[1] == const0_rtx && ADDRESS_REG_P (operands[0]))
2518 return "sub%.l %0,%0";
2519 if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
2520 return "move%.l %1,%0";
2521 /* 68k family (including the 5200 ColdFire) does not support byte moves to
2522 from address registers. */
2523 if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
2524 return "move%.w %1,%0";
2525 return "move%.b %1,%0";
2526 }
2527
2528 const char *
2529 output_move_stricthi (rtx *operands)
2530 {
2531 if (operands[1] == const0_rtx
2532 /* clr insns on 68000 read before writing. */
2533 && ((TARGET_68010 || TARGET_COLDFIRE)
2534 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2535 return "clr%.w %0";
2536 return "move%.w %1,%0";
2537 }
2538
2539 const char *
2540 output_move_strictqi (rtx *operands)
2541 {
2542 if (operands[1] == const0_rtx
2543 /* clr insns on 68000 read before writing. */
2544 && ((TARGET_68010 || TARGET_COLDFIRE)
2545 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
2546 return "clr%.b %0";
2547 return "move%.b %1,%0";
2548 }
2549
2550 /* Return the best assembler insn template
2551 for moving operands[1] into operands[0] as a fullword. */
2552
2553 static const char *
2554 singlemove_string (rtx *operands)
2555 {
2556 if (GET_CODE (operands[1]) == CONST_INT)
2557 return output_move_simode_const (operands);
2558 return "move%.l %1,%0";
2559 }
2560
2561
2562 /* Output assembler or rtl code to perform a doubleword move insn
2563 with operands OPERANDS.
2564 Pointers to 3 helper functions should be specified:
2565 HANDLE_REG_ADJUST to adjust a register by a small value,
2566 HANDLE_COMPADR to compute an address and
2567 HANDLE_MOVSI to move 4 bytes. */
2568
2569 static void
2570 handle_move_double (rtx operands[2],
2571 void (*handle_reg_adjust) (rtx, int),
2572 void (*handle_compadr) (rtx [2]),
2573 void (*handle_movsi) (rtx [2]))
2574 {
2575 enum
2576 {
2577 REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP
2578 } optype0, optype1;
2579 rtx latehalf[2];
2580 rtx middlehalf[2];
2581 rtx xops[2];
2582 rtx addreg0 = 0, addreg1 = 0;
2583 int dest_overlapped_low = 0;
2584 int size = GET_MODE_SIZE (GET_MODE (operands[0]));
2585
2586 middlehalf[0] = 0;
2587 middlehalf[1] = 0;
2588
2589 /* First classify both operands. */
2590
2591 if (REG_P (operands[0]))
2592 optype0 = REGOP;
2593 else if (offsettable_memref_p (operands[0]))
2594 optype0 = OFFSOP;
2595 else if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
2596 optype0 = POPOP;
2597 else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
2598 optype0 = PUSHOP;
2599 else if (GET_CODE (operands[0]) == MEM)
2600 optype0 = MEMOP;
2601 else
2602 optype0 = RNDOP;
2603
2604 if (REG_P (operands[1]))
2605 optype1 = REGOP;
2606 else if (CONSTANT_P (operands[1]))
2607 optype1 = CNSTOP;
2608 else if (offsettable_memref_p (operands[1]))
2609 optype1 = OFFSOP;
2610 else if (GET_CODE (XEXP (operands[1], 0)) == POST_INC)
2611 optype1 = POPOP;
2612 else if (GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)
2613 optype1 = PUSHOP;
2614 else if (GET_CODE (operands[1]) == MEM)
2615 optype1 = MEMOP;
2616 else
2617 optype1 = RNDOP;
2618
2619 /* Check for the cases that the operand constraints are not supposed
2620 to allow to happen. Generating code for these cases is
2621 painful. */
2622 gcc_assert (optype0 != RNDOP && optype1 != RNDOP);
2623
2624 /* If one operand is decrementing and one is incrementing
2625 decrement the former register explicitly
2626 and change that operand into ordinary indexing. */
2627
2628 if (optype0 == PUSHOP && optype1 == POPOP)
2629 {
2630 operands[0] = XEXP (XEXP (operands[0], 0), 0);
2631
2632 handle_reg_adjust (operands[0], -size);
2633
2634 if (GET_MODE (operands[1]) == XFmode)
2635 operands[0] = gen_rtx_MEM (XFmode, operands[0]);
2636 else if (GET_MODE (operands[0]) == DFmode)
2637 operands[0] = gen_rtx_MEM (DFmode, operands[0]);
2638 else
2639 operands[0] = gen_rtx_MEM (DImode, operands[0]);
2640 optype0 = OFFSOP;
2641 }
2642 if (optype0 == POPOP && optype1 == PUSHOP)
2643 {
2644 operands[1] = XEXP (XEXP (operands[1], 0), 0);
2645
2646 handle_reg_adjust (operands[1], -size);
2647
2648 if (GET_MODE (operands[1]) == XFmode)
2649 operands[1] = gen_rtx_MEM (XFmode, operands[1]);
2650 else if (GET_MODE (operands[1]) == DFmode)
2651 operands[1] = gen_rtx_MEM (DFmode, operands[1]);
2652 else
2653 operands[1] = gen_rtx_MEM (DImode, operands[1]);
2654 optype1 = OFFSOP;
2655 }
2656
2657 /* If an operand is an unoffsettable memory ref, find a register
2658 we can increment temporarily to make it refer to the second word. */
2659
2660 if (optype0 == MEMOP)
2661 addreg0 = find_addr_reg (XEXP (operands[0], 0));
2662
2663 if (optype1 == MEMOP)
2664 addreg1 = find_addr_reg (XEXP (operands[1], 0));
2665
2666 /* Ok, we can do one word at a time.
2667 Normally we do the low-numbered word first,
2668 but if either operand is autodecrementing then we
2669 do the high-numbered word first.
2670
2671 In either case, set up in LATEHALF the operands to use
2672 for the high-numbered word and in some cases alter the
2673 operands in OPERANDS to be suitable for the low-numbered word. */
2674
2675 if (size == 12)
2676 {
2677 if (optype0 == REGOP)
2678 {
2679 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
2680 middlehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2681 }
2682 else if (optype0 == OFFSOP)
2683 {
2684 middlehalf[0] = adjust_address (operands[0], SImode, 4);
2685 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
2686 }
2687 else
2688 {
2689 middlehalf[0] = adjust_address (operands[0], SImode, 0);
2690 latehalf[0] = adjust_address (operands[0], SImode, 0);
2691 }
2692
2693 if (optype1 == REGOP)
2694 {
2695 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
2696 middlehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2697 }
2698 else if (optype1 == OFFSOP)
2699 {
2700 middlehalf[1] = adjust_address (operands[1], SImode, 4);
2701 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2702 }
2703 else if (optype1 == CNSTOP)
2704 {
2705 if (GET_CODE (operands[1]) == CONST_DOUBLE)
2706 {
2707 REAL_VALUE_TYPE r;
2708 long l[3];
2709
2710 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
2711 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
2712 operands[1] = GEN_INT (l[0]);
2713 middlehalf[1] = GEN_INT (l[1]);
2714 latehalf[1] = GEN_INT (l[2]);
2715 }
2716 else
2717 {
2718 /* No non-CONST_DOUBLE constant should ever appear
2719 here. */
2720 gcc_assert (!CONSTANT_P (operands[1]));
2721 }
2722 }
2723 else
2724 {
2725 middlehalf[1] = adjust_address (operands[1], SImode, 0);
2726 latehalf[1] = adjust_address (operands[1], SImode, 0);
2727 }
2728 }
2729 else
2730 /* size is not 12: */
2731 {
2732 if (optype0 == REGOP)
2733 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2734 else if (optype0 == OFFSOP)
2735 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
2736 else
2737 latehalf[0] = adjust_address (operands[0], SImode, 0);
2738
2739 if (optype1 == REGOP)
2740 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2741 else if (optype1 == OFFSOP)
2742 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2743 else if (optype1 == CNSTOP)
2744 split_double (operands[1], &operands[1], &latehalf[1]);
2745 else
2746 latehalf[1] = adjust_address (operands[1], SImode, 0);
2747 }
2748
2749 /* If insn is effectively movd N(sp),-(sp) then we will do the
2750 high word first. We should use the adjusted operand 1 (which is N+4(sp))
2751 for the low word as well, to compensate for the first decrement of sp. */
2752 if (optype0 == PUSHOP
2753 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
2754 && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
2755 operands[1] = middlehalf[1] = latehalf[1];
2756
2757 /* For (set (reg:DI N) (mem:DI ... (reg:SI N) ...)),
2758 if the upper part of reg N does not appear in the MEM, arrange to
2759 emit the move late-half first. Otherwise, compute the MEM address
2760 into the upper part of N and use that as a pointer to the memory
2761 operand. */
2762 if (optype0 == REGOP
2763 && (optype1 == OFFSOP || optype1 == MEMOP))
2764 {
2765 rtx testlow = gen_rtx_REG (SImode, REGNO (operands[0]));
2766
2767 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2768 && reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2769 {
2770 /* If both halves of dest are used in the src memory address,
2771 compute the address into latehalf of dest.
2772 Note that this can't happen if the dest is two data regs. */
2773 compadr:
2774 xops[0] = latehalf[0];
2775 xops[1] = XEXP (operands[1], 0);
2776
2777 handle_compadr (xops);
2778 if (GET_MODE (operands[1]) == XFmode)
2779 {
2780 operands[1] = gen_rtx_MEM (XFmode, latehalf[0]);
2781 middlehalf[1] = adjust_address (operands[1], DImode, size - 8);
2782 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2783 }
2784 else
2785 {
2786 operands[1] = gen_rtx_MEM (DImode, latehalf[0]);
2787 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2788 }
2789 }
2790 else if (size == 12
2791 && reg_overlap_mentioned_p (middlehalf[0],
2792 XEXP (operands[1], 0)))
2793 {
2794 /* Check for two regs used by both source and dest.
2795 Note that this can't happen if the dest is all data regs.
2796 It can happen if the dest is d6, d7, a0.
2797 But in that case, latehalf is an addr reg, so
2798 the code at compadr does ok. */
2799
2800 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2801 || reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2802 goto compadr;
2803
2804 /* JRV says this can't happen: */
2805 gcc_assert (!addreg0 && !addreg1);
2806
2807 /* Only the middle reg conflicts; simply put it last. */
2808 handle_movsi (operands);
2809 handle_movsi (latehalf);
2810 handle_movsi (middlehalf);
2811
2812 return;
2813 }
2814 else if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0)))
2815 /* If the low half of dest is mentioned in the source memory
2816 address, the arrange to emit the move late half first. */
2817 dest_overlapped_low = 1;
2818 }
2819
2820 /* If one or both operands autodecrementing,
2821 do the two words, high-numbered first. */
2822
2823 /* Likewise, the first move would clobber the source of the second one,
2824 do them in the other order. This happens only for registers;
2825 such overlap can't happen in memory unless the user explicitly
2826 sets it up, and that is an undefined circumstance. */
2827
2828 if (optype0 == PUSHOP || optype1 == PUSHOP
2829 || (optype0 == REGOP && optype1 == REGOP
2830 && ((middlehalf[1] && REGNO (operands[0]) == REGNO (middlehalf[1]))
2831 || REGNO (operands[0]) == REGNO (latehalf[1])))
2832 || dest_overlapped_low)
2833 {
2834 /* Make any unoffsettable addresses point at high-numbered word. */
2835 if (addreg0)
2836 handle_reg_adjust (addreg0, size - 4);
2837 if (addreg1)
2838 handle_reg_adjust (addreg1, size - 4);
2839
2840 /* Do that word. */
2841 handle_movsi (latehalf);
2842
2843 /* Undo the adds we just did. */
2844 if (addreg0)
2845 handle_reg_adjust (addreg0, -4);
2846 if (addreg1)
2847 handle_reg_adjust (addreg1, -4);
2848
2849 if (size == 12)
2850 {
2851 handle_movsi (middlehalf);
2852
2853 if (addreg0)
2854 handle_reg_adjust (addreg0, -4);
2855 if (addreg1)
2856 handle_reg_adjust (addreg1, -4);
2857 }
2858
2859 /* Do low-numbered word. */
2860
2861 handle_movsi (operands);
2862 return;
2863 }
2864
2865 /* Normal case: do the two words, low-numbered first. */
2866
2867 handle_movsi (operands);
2868
2869 /* Do the middle one of the three words for long double */
2870 if (size == 12)
2871 {
2872 if (addreg0)
2873 handle_reg_adjust (addreg0, 4);
2874 if (addreg1)
2875 handle_reg_adjust (addreg1, 4);
2876
2877 handle_movsi (middlehalf);
2878 }
2879
2880 /* Make any unoffsettable addresses point at high-numbered word. */
2881 if (addreg0)
2882 handle_reg_adjust (addreg0, 4);
2883 if (addreg1)
2884 handle_reg_adjust (addreg1, 4);
2885
2886 /* Do that word. */
2887 handle_movsi (latehalf);
2888
2889 /* Undo the adds we just did. */
2890 if (addreg0)
2891 handle_reg_adjust (addreg0, -(size - 4));
2892 if (addreg1)
2893 handle_reg_adjust (addreg1, -(size - 4));
2894
2895 return;
2896 }
2897
2898 /* Output assembler code to adjust REG by N. */
2899 static void
2900 output_reg_adjust (rtx reg, int n)
2901 {
2902 const char *s;
2903
2904 gcc_assert (GET_MODE (reg) == SImode
2905 && -12 <= n && n != 0 && n <= 12);
2906
2907 switch (n)
2908 {
2909 case 12:
2910 s = "add%.l #12,%0";
2911 break;
2912
2913 case 8:
2914 s = "addq%.l #8,%0";
2915 break;
2916
2917 case 4:
2918 s = "addq%.l #4,%0";
2919 break;
2920
2921 case -12:
2922 s = "sub%.l #12,%0";
2923 break;
2924
2925 case -8:
2926 s = "subq%.l #8,%0";
2927 break;
2928
2929 case -4:
2930 s = "subq%.l #4,%0";
2931 break;
2932
2933 default:
2934 gcc_unreachable ();
2935 s = NULL;
2936 }
2937
2938 output_asm_insn (s, &reg);
2939 }
2940
2941 /* Emit rtl code to adjust REG by N. */
2942 static void
2943 emit_reg_adjust (rtx reg1, int n)
2944 {
2945 rtx reg2;
2946
2947 gcc_assert (GET_MODE (reg1) == SImode
2948 && -12 <= n && n != 0 && n <= 12);
2949
2950 reg1 = copy_rtx (reg1);
2951 reg2 = copy_rtx (reg1);
2952
2953 if (n < 0)
2954 emit_insn (gen_subsi3 (reg1, reg2, GEN_INT (-n)));
2955 else if (n > 0)
2956 emit_insn (gen_addsi3 (reg1, reg2, GEN_INT (n)));
2957 else
2958 gcc_unreachable ();
2959 }
2960
2961 /* Output assembler to load address OPERANDS[0] to register OPERANDS[1]. */
2962 static void
2963 output_compadr (rtx operands[2])
2964 {
2965 output_asm_insn ("lea %a1,%0", operands);
2966 }
2967
2968 /* Output the best assembler insn for moving operands[1] into operands[0]
2969 as a fullword. */
2970 static void
2971 output_movsi (rtx operands[2])
2972 {
2973 output_asm_insn (singlemove_string (operands), operands);
2974 }
2975
2976 /* Copy OP and change its mode to MODE. */
2977 static rtx
2978 copy_operand (rtx op, enum machine_mode mode)
2979 {
2980 /* ??? This looks really ugly. There must be a better way
2981 to change a mode on the operand. */
2982 if (GET_MODE (op) != VOIDmode)
2983 {
2984 if (REG_P (op))
2985 op = gen_rtx_REG (mode, REGNO (op));
2986 else
2987 {
2988 op = copy_rtx (op);
2989 PUT_MODE (op, mode);
2990 }
2991 }
2992
2993 return op;
2994 }
2995
2996 /* Emit rtl code for moving operands[1] into operands[0] as a fullword. */
2997 static void
2998 emit_movsi (rtx operands[2])
2999 {
3000 operands[0] = copy_operand (operands[0], SImode);
3001 operands[1] = copy_operand (operands[1], SImode);
3002
3003 emit_insn (gen_movsi (operands[0], operands[1]));
3004 }
3005
3006 /* Output assembler code to perform a doubleword move insn
3007 with operands OPERANDS. */
3008 const char *
3009 output_move_double (rtx *operands)
3010 {
3011 handle_move_double (operands,
3012 output_reg_adjust, output_compadr, output_movsi);
3013
3014 return "";
3015 }
3016
3017 /* Output rtl code to perform a doubleword move insn
3018 with operands OPERANDS. */
3019 void
3020 m68k_emit_move_double (rtx operands[2])
3021 {
3022 handle_move_double (operands, emit_reg_adjust, emit_movsi, emit_movsi);
3023 }
3024
3025 /* Ensure mode of ORIG, a REG rtx, is MODE. Returns either ORIG or a
3026 new rtx with the correct mode. */
3027
3028 static rtx
3029 force_mode (enum machine_mode mode, rtx orig)
3030 {
3031 if (mode == GET_MODE (orig))
3032 return orig;
3033
3034 if (REGNO (orig) >= FIRST_PSEUDO_REGISTER)
3035 abort ();
3036
3037 return gen_rtx_REG (mode, REGNO (orig));
3038 }
3039
3040 static int
3041 fp_reg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3042 {
3043 return reg_renumber && FP_REG_P (op);
3044 }
3045
3046 /* Emit insns to move operands[1] into operands[0].
3047
3048 Return 1 if we have written out everything that needs to be done to
3049 do the move. Otherwise, return 0 and the caller will emit the move
3050 normally.
3051
3052 Note SCRATCH_REG may not be in the proper mode depending on how it
3053 will be used. This routine is responsible for creating a new copy
3054 of SCRATCH_REG in the proper mode. */
3055
3056 int
3057 emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg)
3058 {
3059 register rtx operand0 = operands[0];
3060 register rtx operand1 = operands[1];
3061 register rtx tem;
3062
3063 if (scratch_reg
3064 && reload_in_progress && GET_CODE (operand0) == REG
3065 && REGNO (operand0) >= FIRST_PSEUDO_REGISTER)
3066 operand0 = reg_equiv_mem[REGNO (operand0)];
3067 else if (scratch_reg
3068 && reload_in_progress && GET_CODE (operand0) == SUBREG
3069 && GET_CODE (SUBREG_REG (operand0)) == REG
3070 && REGNO (SUBREG_REG (operand0)) >= FIRST_PSEUDO_REGISTER)
3071 {
3072 /* We must not alter SUBREG_BYTE (operand0) since that would confuse
3073 the code which tracks sets/uses for delete_output_reload. */
3074 rtx temp = gen_rtx_SUBREG (GET_MODE (operand0),
3075 reg_equiv_mem [REGNO (SUBREG_REG (operand0))],
3076 SUBREG_BYTE (operand0));
3077 operand0 = alter_subreg (&temp);
3078 }
3079
3080 if (scratch_reg
3081 && reload_in_progress && GET_CODE (operand1) == REG
3082 && REGNO (operand1) >= FIRST_PSEUDO_REGISTER)
3083 operand1 = reg_equiv_mem[REGNO (operand1)];
3084 else if (scratch_reg
3085 && reload_in_progress && GET_CODE (operand1) == SUBREG
3086 && GET_CODE (SUBREG_REG (operand1)) == REG
3087 && REGNO (SUBREG_REG (operand1)) >= FIRST_PSEUDO_REGISTER)
3088 {
3089 /* We must not alter SUBREG_BYTE (operand0) since that would confuse
3090 the code which tracks sets/uses for delete_output_reload. */
3091 rtx temp = gen_rtx_SUBREG (GET_MODE (operand1),
3092 reg_equiv_mem [REGNO (SUBREG_REG (operand1))],
3093 SUBREG_BYTE (operand1));
3094 operand1 = alter_subreg (&temp);
3095 }
3096
3097 if (scratch_reg && reload_in_progress && GET_CODE (operand0) == MEM
3098 && ((tem = find_replacement (&XEXP (operand0, 0)))
3099 != XEXP (operand0, 0)))
3100 operand0 = gen_rtx_MEM (GET_MODE (operand0), tem);
3101 if (scratch_reg && reload_in_progress && GET_CODE (operand1) == MEM
3102 && ((tem = find_replacement (&XEXP (operand1, 0)))
3103 != XEXP (operand1, 0)))
3104 operand1 = gen_rtx_MEM (GET_MODE (operand1), tem);
3105
3106 /* Handle secondary reloads for loads/stores of FP registers where
3107 the address is symbolic by using the scratch register */
3108 if (fp_reg_operand (operand0, mode)
3109 && ((GET_CODE (operand1) == MEM
3110 && ! memory_address_p (DFmode, XEXP (operand1, 0)))
3111 || ((GET_CODE (operand1) == SUBREG
3112 && GET_CODE (XEXP (operand1, 0)) == MEM
3113 && !memory_address_p (DFmode, XEXP (XEXP (operand1, 0), 0)))))
3114 && scratch_reg)
3115 {
3116 if (GET_CODE (operand1) == SUBREG)
3117 operand1 = XEXP (operand1, 0);
3118
3119 /* SCRATCH_REG will hold an address. We want
3120 it in SImode regardless of what mode it was originally given
3121 to us. */
3122 scratch_reg = force_mode (SImode, scratch_reg);
3123
3124 /* D might not fit in 14 bits either; for such cases load D into
3125 scratch reg. */
3126 if (!memory_address_p (Pmode, XEXP (operand1, 0)))
3127 {
3128 emit_move_insn (scratch_reg, XEXP (XEXP (operand1, 0), 1));
3129 emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand1, 0)),
3130 Pmode,
3131 XEXP (XEXP (operand1, 0), 0),
3132 scratch_reg));
3133 }
3134 else
3135 emit_move_insn (scratch_reg, XEXP (operand1, 0));
3136 emit_insn (gen_rtx_SET (VOIDmode, operand0,
3137 gen_rtx_MEM (mode, scratch_reg)));
3138 return 1;
3139 }
3140 else if (fp_reg_operand (operand1, mode)
3141 && ((GET_CODE (operand0) == MEM
3142 && ! memory_address_p (DFmode, XEXP (operand0, 0)))
3143 || ((GET_CODE (operand0) == SUBREG)
3144 && GET_CODE (XEXP (operand0, 0)) == MEM
3145 && !memory_address_p (DFmode, XEXP (XEXP (operand0, 0), 0))))
3146 && scratch_reg)
3147 {
3148 if (GET_CODE (operand0) == SUBREG)
3149 operand0 = XEXP (operand0, 0);
3150
3151 /* SCRATCH_REG will hold an address and maybe the actual data. We want
3152 it in SIMODE regardless of what mode it was originally given
3153 to us. */
3154 scratch_reg = force_mode (SImode, scratch_reg);
3155
3156 /* D might not fit in 14 bits either; for such cases load D into
3157 scratch reg. */
3158 if (!memory_address_p (Pmode, XEXP (operand0, 0)))
3159 {
3160 emit_move_insn (scratch_reg, XEXP (XEXP (operand0, 0), 1));
3161 emit_move_insn (scratch_reg, gen_rtx_fmt_ee (GET_CODE (XEXP (operand0,
3162 0)),
3163 Pmode,
3164 XEXP (XEXP (operand0, 0),
3165 0),
3166 scratch_reg));
3167 }
3168 else
3169 emit_move_insn (scratch_reg, XEXP (operand0, 0));
3170 emit_insn (gen_rtx_SET (VOIDmode, gen_rtx_MEM (mode, scratch_reg),
3171 operand1));
3172 return 1;
3173 }
3174 /* Handle secondary reloads for loads of FP registers from constant
3175 expressions by forcing the constant into memory.
3176
3177 use scratch_reg to hold the address of the memory location.
3178
3179 The proper fix is to change PREFERRED_RELOAD_CLASS to return
3180 NO_REGS when presented with a const_int and an register class
3181 containing only FP registers. Doing so unfortunately creates
3182 more problems than it solves. Fix this for 2.5. */
3183 else if (fp_reg_operand (operand0, mode)
3184 && CONSTANT_P (operand1)
3185 && scratch_reg)
3186 {
3187 rtx xoperands[2];
3188
3189 /* SCRATCH_REG will hold an address and maybe the actual data. We want
3190 it in SIMODE regardless of what mode it was originally given
3191 to us. */
3192 scratch_reg = force_mode (SImode, scratch_reg);
3193
3194 /* Force the constant into memory and put the address of the
3195 memory location into scratch_reg. */
3196 xoperands[0] = scratch_reg;
3197 xoperands[1] = XEXP (force_const_mem (mode, operand1), 0);
3198 emit_insn (gen_rtx_SET (mode, scratch_reg, xoperands[1]));
3199
3200 /* Now load the destination register. */
3201 emit_insn (gen_rtx_SET (mode, operand0,
3202 gen_rtx_MEM (mode, scratch_reg)));
3203 return 1;
3204 }
3205
3206 /* Now have insn-emit do whatever it normally does. */
3207 return 0;
3208 }
3209
3210 /* Split one or more DImode RTL references into pairs of SImode
3211 references. The RTL can be REG, offsettable MEM, integer constant, or
3212 CONST_DOUBLE. "operands" is a pointer to an array of DImode RTL to
3213 split and "num" is its length. lo_half and hi_half are output arrays
3214 that parallel "operands". */
3215
3216 void
3217 split_di (rtx operands[], int num, rtx lo_half[], rtx hi_half[])
3218 {
3219 while (num--)
3220 {
3221 rtx op = operands[num];
3222
3223 /* simplify_subreg refuses to split volatile memory addresses,
3224 but we still have to handle it. */
3225 if (GET_CODE (op) == MEM)
3226 {
3227 lo_half[num] = adjust_address (op, SImode, 4);
3228 hi_half[num] = adjust_address (op, SImode, 0);
3229 }
3230 else
3231 {
3232 lo_half[num] = simplify_gen_subreg (SImode, op,
3233 GET_MODE (op) == VOIDmode
3234 ? DImode : GET_MODE (op), 4);
3235 hi_half[num] = simplify_gen_subreg (SImode, op,
3236 GET_MODE (op) == VOIDmode
3237 ? DImode : GET_MODE (op), 0);
3238 }
3239 }
3240 }
3241
3242 /* Split X into a base and a constant offset, storing them in *BASE
3243 and *OFFSET respectively. */
3244
3245 static void
3246 m68k_split_offset (rtx x, rtx *base, HOST_WIDE_INT *offset)
3247 {
3248 *offset = 0;
3249 if (GET_CODE (x) == PLUS && GET_CODE (XEXP (x, 1)) == CONST_INT)
3250 {
3251 *offset += INTVAL (XEXP (x, 1));
3252 x = XEXP (x, 0);
3253 }
3254 *base = x;
3255 }
3256
3257 /* Return true if PATTERN is a PARALLEL suitable for a movem or fmovem
3258 instruction. STORE_P says whether the move is a load or store.
3259
3260 If the instruction uses post-increment or pre-decrement addressing,
3261 AUTOMOD_BASE is the base register and AUTOMOD_OFFSET is the total
3262 adjustment. This adjustment will be made by the first element of
3263 PARALLEL, with the loads or stores starting at element 1. If the
3264 instruction does not use post-increment or pre-decrement addressing,
3265 AUTOMOD_BASE is null, AUTOMOD_OFFSET is 0, and the loads or stores
3266 start at element 0. */
3267
3268 bool
3269 m68k_movem_pattern_p (rtx pattern, rtx automod_base,
3270 HOST_WIDE_INT automod_offset, bool store_p)
3271 {
3272 rtx base, mem_base, set, mem, reg, last_reg;
3273 HOST_WIDE_INT offset, mem_offset;
3274 int i, first, len;
3275 enum reg_class rclass;
3276
3277 len = XVECLEN (pattern, 0);
3278 first = (automod_base != NULL);
3279
3280 if (automod_base)
3281 {
3282 /* Stores must be pre-decrement and loads must be post-increment. */
3283 if (store_p != (automod_offset < 0))
3284 return false;
3285
3286 /* Work out the base and offset for lowest memory location. */
3287 base = automod_base;
3288 offset = (automod_offset < 0 ? automod_offset : 0);
3289 }
3290 else
3291 {
3292 /* Allow any valid base and offset in the first access. */
3293 base = NULL;
3294 offset = 0;
3295 }
3296
3297 last_reg = NULL;
3298 rclass = NO_REGS;
3299 for (i = first; i < len; i++)
3300 {
3301 /* We need a plain SET. */
3302 set = XVECEXP (pattern, 0, i);
3303 if (GET_CODE (set) != SET)
3304 return false;
3305
3306 /* Check that we have a memory location... */
3307 mem = XEXP (set, !store_p);
3308 if (!MEM_P (mem) || !memory_operand (mem, VOIDmode))
3309 return false;
3310
3311 /* ...with the right address. */
3312 if (base == NULL)
3313 {
3314 m68k_split_offset (XEXP (mem, 0), &base, &offset);
3315 /* The ColdFire instruction only allows (An) and (d16,An) modes.
3316 There are no mode restrictions for 680x0 besides the
3317 automodification rules enforced above. */
3318 if (TARGET_COLDFIRE
3319 && !m68k_legitimate_base_reg_p (base, reload_completed))
3320 return false;
3321 }
3322 else
3323 {
3324 m68k_split_offset (XEXP (mem, 0), &mem_base, &mem_offset);
3325 if (!rtx_equal_p (base, mem_base) || offset != mem_offset)
3326 return false;
3327 }
3328
3329 /* Check that we have a register of the required mode and class. */
3330 reg = XEXP (set, store_p);
3331 if (!REG_P (reg)
3332 || !HARD_REGISTER_P (reg)
3333 || GET_MODE (reg) != reg_raw_mode[REGNO (reg)])
3334 return false;
3335
3336 if (last_reg)
3337 {
3338 /* The register must belong to RCLASS and have a higher number
3339 than the register in the previous SET. */
3340 if (!TEST_HARD_REG_BIT (reg_class_contents[rclass], REGNO (reg))
3341 || REGNO (last_reg) >= REGNO (reg))
3342 return false;
3343 }
3344 else
3345 {
3346 /* Work out which register class we need. */
3347 if (INT_REGNO_P (REGNO (reg)))
3348 rclass = GENERAL_REGS;
3349 else if (FP_REGNO_P (REGNO (reg)))
3350 rclass = FP_REGS;
3351 else
3352 return false;
3353 }
3354
3355 last_reg = reg;
3356 offset += GET_MODE_SIZE (GET_MODE (reg));
3357 }
3358
3359 /* If we have an automodification, check whether the final offset is OK. */
3360 if (automod_base && offset != (automod_offset < 0 ? 0 : automod_offset))
3361 return false;
3362
3363 /* Reject unprofitable cases. */
3364 if (len < first + (rclass == FP_REGS ? MIN_FMOVEM_REGS : MIN_MOVEM_REGS))
3365 return false;
3366
3367 return true;
3368 }
3369
3370 /* Return the assembly code template for a movem or fmovem instruction
3371 whose pattern is given by PATTERN. Store the template's operands
3372 in OPERANDS.
3373
3374 If the instruction uses post-increment or pre-decrement addressing,
3375 AUTOMOD_OFFSET is the total adjustment, otherwise it is 0. STORE_P
3376 is true if this is a store instruction. */
3377
3378 const char *
3379 m68k_output_movem (rtx *operands, rtx pattern,
3380 HOST_WIDE_INT automod_offset, bool store_p)
3381 {
3382 unsigned int mask;
3383 int i, first;
3384
3385 gcc_assert (GET_CODE (pattern) == PARALLEL);
3386 mask = 0;
3387 first = (automod_offset != 0);
3388 for (i = first; i < XVECLEN (pattern, 0); i++)
3389 {
3390 /* When using movem with pre-decrement addressing, register X + D0_REG
3391 is controlled by bit 15 - X. For all other addressing modes,
3392 register X + D0_REG is controlled by bit X. Confusingly, the
3393 register mask for fmovem is in the opposite order to that for
3394 movem. */
3395 unsigned int regno;
3396
3397 gcc_assert (MEM_P (XEXP (XVECEXP (pattern, 0, i), !store_p)));
3398 gcc_assert (REG_P (XEXP (XVECEXP (pattern, 0, i), store_p)));
3399 regno = REGNO (XEXP (XVECEXP (pattern, 0, i), store_p));
3400 if (automod_offset < 0)
3401 {
3402 if (FP_REGNO_P (regno))
3403 mask |= 1 << (regno - FP0_REG);
3404 else
3405 mask |= 1 << (15 - (regno - D0_REG));
3406 }
3407 else
3408 {
3409 if (FP_REGNO_P (regno))
3410 mask |= 1 << (7 - (regno - FP0_REG));
3411 else
3412 mask |= 1 << (regno - D0_REG);
3413 }
3414 }
3415 CC_STATUS_INIT;
3416
3417 if (automod_offset == 0)
3418 operands[0] = XEXP (XEXP (XVECEXP (pattern, 0, first), !store_p), 0);
3419 else if (automod_offset < 0)
3420 operands[0] = gen_rtx_PRE_DEC (Pmode, SET_DEST (XVECEXP (pattern, 0, 0)));
3421 else
3422 operands[0] = gen_rtx_POST_INC (Pmode, SET_DEST (XVECEXP (pattern, 0, 0)));
3423 operands[1] = GEN_INT (mask);
3424 if (FP_REGNO_P (REGNO (XEXP (XVECEXP (pattern, 0, first), store_p))))
3425 {
3426 if (store_p)
3427 return "fmovem %1,%a0";
3428 else
3429 return "fmovem %a0,%1";
3430 }
3431 else
3432 {
3433 if (store_p)
3434 return "movem%.l %1,%a0";
3435 else
3436 return "movem%.l %a0,%1";
3437 }
3438 }
3439
3440 /* Return a REG that occurs in ADDR with coefficient 1.
3441 ADDR can be effectively incremented by incrementing REG. */
3442
3443 static rtx
3444 find_addr_reg (rtx addr)
3445 {
3446 while (GET_CODE (addr) == PLUS)
3447 {
3448 if (GET_CODE (XEXP (addr, 0)) == REG)
3449 addr = XEXP (addr, 0);
3450 else if (GET_CODE (XEXP (addr, 1)) == REG)
3451 addr = XEXP (addr, 1);
3452 else if (CONSTANT_P (XEXP (addr, 0)))
3453 addr = XEXP (addr, 1);
3454 else if (CONSTANT_P (XEXP (addr, 1)))
3455 addr = XEXP (addr, 0);
3456 else
3457 gcc_unreachable ();
3458 }
3459 gcc_assert (GET_CODE (addr) == REG);
3460 return addr;
3461 }
3462
3463 /* Output assembler code to perform a 32-bit 3-operand add. */
3464
3465 const char *
3466 output_addsi3 (rtx *operands)
3467 {
3468 if (! operands_match_p (operands[0], operands[1]))
3469 {
3470 if (!ADDRESS_REG_P (operands[1]))
3471 {
3472 rtx tmp = operands[1];
3473
3474 operands[1] = operands[2];
3475 operands[2] = tmp;
3476 }
3477
3478 /* These insns can result from reloads to access
3479 stack slots over 64k from the frame pointer. */
3480 if (GET_CODE (operands[2]) == CONST_INT
3481 && (INTVAL (operands[2]) < -32768 || INTVAL (operands[2]) > 32767))
3482 return "move%.l %2,%0\n\tadd%.l %1,%0";
3483 if (GET_CODE (operands[2]) == REG)
3484 return MOTOROLA ? "lea (%1,%2.l),%0" : "lea %1@(0,%2:l),%0";
3485 return MOTOROLA ? "lea (%c2,%1),%0" : "lea %1@(%c2),%0";
3486 }
3487 if (GET_CODE (operands[2]) == CONST_INT)
3488 {
3489 if (INTVAL (operands[2]) > 0
3490 && INTVAL (operands[2]) <= 8)
3491 return "addq%.l %2,%0";
3492 if (INTVAL (operands[2]) < 0
3493 && INTVAL (operands[2]) >= -8)
3494 {
3495 operands[2] = GEN_INT (- INTVAL (operands[2]));
3496 return "subq%.l %2,%0";
3497 }
3498 /* On the CPU32 it is faster to use two addql instructions to
3499 add a small integer (8 < N <= 16) to a register.
3500 Likewise for subql. */
3501 if (TUNE_CPU32 && REG_P (operands[0]))
3502 {
3503 if (INTVAL (operands[2]) > 8
3504 && INTVAL (operands[2]) <= 16)
3505 {
3506 operands[2] = GEN_INT (INTVAL (operands[2]) - 8);
3507 return "addq%.l #8,%0\n\taddq%.l %2,%0";
3508 }
3509 if (INTVAL (operands[2]) < -8
3510 && INTVAL (operands[2]) >= -16)
3511 {
3512 operands[2] = GEN_INT (- INTVAL (operands[2]) - 8);
3513 return "subq%.l #8,%0\n\tsubq%.l %2,%0";
3514 }
3515 }
3516 if (ADDRESS_REG_P (operands[0])
3517 && INTVAL (operands[2]) >= -0x8000
3518 && INTVAL (operands[2]) < 0x8000)
3519 {
3520 if (TUNE_68040)
3521 return "add%.w %2,%0";
3522 else
3523 return MOTOROLA ? "lea (%c2,%0),%0" : "lea %0@(%c2),%0";
3524 }
3525 }
3526 return "add%.l %2,%0";
3527 }
3528
3529 /* Store in cc_status the expressions that the condition codes will
3530 describe after execution of an instruction whose pattern is EXP.
3531 Do not alter them if the instruction would not alter the cc's. */
3532
3533 /* On the 68000, all the insns to store in an address register fail to
3534 set the cc's. However, in some cases these instructions can make it
3535 possibly invalid to use the saved cc's. In those cases we clear out
3536 some or all of the saved cc's so they won't be used. */
3537
3538 void
3539 notice_update_cc (rtx exp, rtx insn)
3540 {
3541 if (GET_CODE (exp) == SET)
3542 {
3543 if (GET_CODE (SET_SRC (exp)) == CALL)
3544 CC_STATUS_INIT;
3545 else if (ADDRESS_REG_P (SET_DEST (exp)))
3546 {
3547 if (cc_status.value1 && modified_in_p (cc_status.value1, insn))
3548 cc_status.value1 = 0;
3549 if (cc_status.value2 && modified_in_p (cc_status.value2, insn))
3550 cc_status.value2 = 0;
3551 }
3552 /* fmoves to memory or data registers do not set the condition
3553 codes. Normal moves _do_ set the condition codes, but not in
3554 a way that is appropriate for comparison with 0, because -0.0
3555 would be treated as a negative nonzero number. Note that it
3556 isn't appropriate to conditionalize this restriction on
3557 HONOR_SIGNED_ZEROS because that macro merely indicates whether
3558 we care about the difference between -0.0 and +0.0. */
3559 else if (!FP_REG_P (SET_DEST (exp))
3560 && SET_DEST (exp) != cc0_rtx
3561 && (FP_REG_P (SET_SRC (exp))
3562 || GET_CODE (SET_SRC (exp)) == FIX
3563 || FLOAT_MODE_P (GET_MODE (SET_DEST (exp)))))
3564 CC_STATUS_INIT;
3565 /* A pair of move insns doesn't produce a useful overall cc. */
3566 else if (!FP_REG_P (SET_DEST (exp))
3567 && !FP_REG_P (SET_SRC (exp))
3568 && GET_MODE_SIZE (GET_MODE (SET_SRC (exp))) > 4
3569 && (GET_CODE (SET_SRC (exp)) == REG
3570 || GET_CODE (SET_SRC (exp)) == MEM
3571 || GET_CODE (SET_SRC (exp)) == CONST_DOUBLE))
3572 CC_STATUS_INIT;
3573 else if (SET_DEST (exp) != pc_rtx)
3574 {
3575 cc_status.flags = 0;
3576 cc_status.value1 = SET_DEST (exp);
3577 cc_status.value2 = SET_SRC (exp);
3578 }
3579 }
3580 else if (GET_CODE (exp) == PARALLEL
3581 && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
3582 {
3583 rtx dest = SET_DEST (XVECEXP (exp, 0, 0));
3584 rtx src = SET_SRC (XVECEXP (exp, 0, 0));
3585
3586 if (ADDRESS_REG_P (dest))
3587 CC_STATUS_INIT;
3588 else if (dest != pc_rtx)
3589 {
3590 cc_status.flags = 0;
3591 cc_status.value1 = dest;
3592 cc_status.value2 = src;
3593 }
3594 }
3595 else
3596 CC_STATUS_INIT;
3597 if (cc_status.value2 != 0
3598 && ADDRESS_REG_P (cc_status.value2)
3599 && GET_MODE (cc_status.value2) == QImode)
3600 CC_STATUS_INIT;
3601 if (cc_status.value2 != 0)
3602 switch (GET_CODE (cc_status.value2))
3603 {
3604 case ASHIFT: case ASHIFTRT: case LSHIFTRT:
3605 case ROTATE: case ROTATERT:
3606 /* These instructions always clear the overflow bit, and set
3607 the carry to the bit shifted out. */
3608 cc_status.flags |= CC_OVERFLOW_UNUSABLE | CC_NO_CARRY;
3609 break;
3610
3611 case PLUS: case MINUS: case MULT:
3612 case DIV: case UDIV: case MOD: case UMOD: case NEG:
3613 if (GET_MODE (cc_status.value2) != VOIDmode)
3614 cc_status.flags |= CC_NO_OVERFLOW;
3615 break;
3616 case ZERO_EXTEND:
3617 /* (SET r1 (ZERO_EXTEND r2)) on this machine
3618 ends with a move insn moving r2 in r2's mode.
3619 Thus, the cc's are set for r2.
3620 This can set N bit spuriously. */
3621 cc_status.flags |= CC_NOT_NEGATIVE;
3622
3623 default:
3624 break;
3625 }
3626 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
3627 && cc_status.value2
3628 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
3629 cc_status.value2 = 0;
3630 if (((cc_status.value1 && FP_REG_P (cc_status.value1))
3631 || (cc_status.value2 && FP_REG_P (cc_status.value2))))
3632 cc_status.flags = CC_IN_68881;
3633 if (cc_status.value2 && GET_CODE (cc_status.value2) == COMPARE
3634 && GET_MODE_CLASS (GET_MODE (XEXP (cc_status.value2, 0))) == MODE_FLOAT)
3635 {
3636 cc_status.flags = CC_IN_68881;
3637 if (!FP_REG_P (XEXP (cc_status.value2, 0)))
3638 cc_status.flags |= CC_REVERSED;
3639 }
3640 }
3641
3642 const char *
3643 output_move_const_double (rtx *operands)
3644 {
3645 int code = standard_68881_constant_p (operands[1]);
3646
3647 if (code != 0)
3648 {
3649 static char buf[40];
3650
3651 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
3652 return buf;
3653 }
3654 return "fmove%.d %1,%0";
3655 }
3656
3657 const char *
3658 output_move_const_single (rtx *operands)
3659 {
3660 int code = standard_68881_constant_p (operands[1]);
3661
3662 if (code != 0)
3663 {
3664 static char buf[40];
3665
3666 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
3667 return buf;
3668 }
3669 return "fmove%.s %f1,%0";
3670 }
3671
3672 /* Return nonzero if X, a CONST_DOUBLE, has a value that we can get
3673 from the "fmovecr" instruction.
3674 The value, anded with 0xff, gives the code to use in fmovecr
3675 to get the desired constant. */
3676
3677 /* This code has been fixed for cross-compilation. */
3678
3679 static int inited_68881_table = 0;
3680
3681 static const char *const strings_68881[7] = {
3682 "0.0",
3683 "1.0",
3684 "10.0",
3685 "100.0",
3686 "10000.0",
3687 "1e8",
3688 "1e16"
3689 };
3690
3691 static const int codes_68881[7] = {
3692 0x0f,
3693 0x32,
3694 0x33,
3695 0x34,
3696 0x35,
3697 0x36,
3698 0x37
3699 };
3700
3701 REAL_VALUE_TYPE values_68881[7];
3702
3703 /* Set up values_68881 array by converting the decimal values
3704 strings_68881 to binary. */
3705
3706 void
3707 init_68881_table (void)
3708 {
3709 int i;
3710 REAL_VALUE_TYPE r;
3711 enum machine_mode mode;
3712
3713 mode = SFmode;
3714 for (i = 0; i < 7; i++)
3715 {
3716 if (i == 6)
3717 mode = DFmode;
3718 r = REAL_VALUE_ATOF (strings_68881[i], mode);
3719 values_68881[i] = r;
3720 }
3721 inited_68881_table = 1;
3722 }
3723
3724 int
3725 standard_68881_constant_p (rtx x)
3726 {
3727 REAL_VALUE_TYPE r;
3728 int i;
3729
3730 /* fmovecr must be emulated on the 68040 and 68060, so it shouldn't be
3731 used at all on those chips. */
3732 if (TUNE_68040_60)
3733 return 0;
3734
3735 if (! inited_68881_table)
3736 init_68881_table ();
3737
3738 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3739
3740 /* Use REAL_VALUES_IDENTICAL instead of REAL_VALUES_EQUAL so that -0.0
3741 is rejected. */
3742 for (i = 0; i < 6; i++)
3743 {
3744 if (REAL_VALUES_IDENTICAL (r, values_68881[i]))
3745 return (codes_68881[i]);
3746 }
3747
3748 if (GET_MODE (x) == SFmode)
3749 return 0;
3750
3751 if (REAL_VALUES_EQUAL (r, values_68881[6]))
3752 return (codes_68881[6]);
3753
3754 /* larger powers of ten in the constants ram are not used
3755 because they are not equal to a `double' C constant. */
3756 return 0;
3757 }
3758
3759 /* If X is a floating-point constant, return the logarithm of X base 2,
3760 or 0 if X is not a power of 2. */
3761
3762 int
3763 floating_exact_log2 (rtx x)
3764 {
3765 REAL_VALUE_TYPE r, r1;
3766 int exp;
3767
3768 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
3769
3770 if (REAL_VALUES_LESS (r, dconst1))
3771 return 0;
3772
3773 exp = real_exponent (&r);
3774 real_2expN (&r1, exp, DFmode);
3775 if (REAL_VALUES_EQUAL (r1, r))
3776 return exp;
3777
3778 return 0;
3779 }
3780
3781 /* A C compound statement to output to stdio stream STREAM the
3782 assembler syntax for an instruction operand X. X is an RTL
3783 expression.
3784
3785 CODE is a value that can be used to specify one of several ways
3786 of printing the operand. It is used when identical operands
3787 must be printed differently depending on the context. CODE
3788 comes from the `%' specification that was used to request
3789 printing of the operand. If the specification was just `%DIGIT'
3790 then CODE is 0; if the specification was `%LTR DIGIT' then CODE
3791 is the ASCII code for LTR.
3792
3793 If X is a register, this macro should print the register's name.
3794 The names can be found in an array `reg_names' whose type is
3795 `char *[]'. `reg_names' is initialized from `REGISTER_NAMES'.
3796
3797 When the machine description has a specification `%PUNCT' (a `%'
3798 followed by a punctuation character), this macro is called with
3799 a null pointer for X and the punctuation character for CODE.
3800
3801 The m68k specific codes are:
3802
3803 '.' for dot needed in Motorola-style opcode names.
3804 '-' for an operand pushing on the stack:
3805 sp@-, -(sp) or -(%sp) depending on the style of syntax.
3806 '+' for an operand pushing on the stack:
3807 sp@+, (sp)+ or (%sp)+ depending on the style of syntax.
3808 '@' for a reference to the top word on the stack:
3809 sp@, (sp) or (%sp) depending on the style of syntax.
3810 '#' for an immediate operand prefix (# in MIT and Motorola syntax
3811 but & in SGS syntax).
3812 '!' for the cc register (used in an `and to cc' insn).
3813 '$' for the letter `s' in an op code, but only on the 68040.
3814 '&' for the letter `d' in an op code, but only on the 68040.
3815 '/' for register prefix needed by longlong.h.
3816 '?' for m68k_library_id_string
3817
3818 'b' for byte insn (no effect, on the Sun; this is for the ISI).
3819 'd' to force memory addressing to be absolute, not relative.
3820 'f' for float insn (print a CONST_DOUBLE as a float rather than in hex)
3821 'x' for float insn (print a CONST_DOUBLE as a float rather than in hex),
3822 or print pair of registers as rx:ry.
3823 'p' print an address with @PLTPC attached, but only if the operand
3824 is not locally-bound. */
3825
3826 void
3827 print_operand (FILE *file, rtx op, int letter)
3828 {
3829 if (letter == '.')
3830 {
3831 if (MOTOROLA)
3832 fprintf (file, ".");
3833 }
3834 else if (letter == '#')
3835 asm_fprintf (file, "%I");
3836 else if (letter == '-')
3837 asm_fprintf (file, MOTOROLA ? "-(%Rsp)" : "%Rsp@-");
3838 else if (letter == '+')
3839 asm_fprintf (file, MOTOROLA ? "(%Rsp)+" : "%Rsp@+");
3840 else if (letter == '@')
3841 asm_fprintf (file, MOTOROLA ? "(%Rsp)" : "%Rsp@");
3842 else if (letter == '!')
3843 asm_fprintf (file, "%Rfpcr");
3844 else if (letter == '$')
3845 {
3846 if (TARGET_68040)
3847 fprintf (file, "s");
3848 }
3849 else if (letter == '&')
3850 {
3851 if (TARGET_68040)
3852 fprintf (file, "d");
3853 }
3854 else if (letter == '/')
3855 asm_fprintf (file, "%R");
3856 else if (letter == '?')
3857 asm_fprintf (file, m68k_library_id_string);
3858 else if (letter == 'p')
3859 {
3860 output_addr_const (file, op);
3861 if (!(GET_CODE (op) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (op)))
3862 fprintf (file, "@PLTPC");
3863 }
3864 else if (GET_CODE (op) == REG)
3865 {
3866 if (letter == 'R')
3867 /* Print out the second register name of a register pair.
3868 I.e., R (6) => 7. */
3869 fputs (M68K_REGNAME(REGNO (op) + 1), file);
3870 else
3871 fputs (M68K_REGNAME(REGNO (op)), file);
3872 }
3873 else if (GET_CODE (op) == MEM)
3874 {
3875 output_address (XEXP (op, 0));
3876 if (letter == 'd' && ! TARGET_68020
3877 && CONSTANT_ADDRESS_P (XEXP (op, 0))
3878 && !(GET_CODE (XEXP (op, 0)) == CONST_INT
3879 && INTVAL (XEXP (op, 0)) < 0x8000
3880 && INTVAL (XEXP (op, 0)) >= -0x8000))
3881 fprintf (file, MOTOROLA ? ".l" : ":l");
3882 }
3883 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == SFmode)
3884 {
3885 REAL_VALUE_TYPE r;
3886 long l;
3887 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3888 REAL_VALUE_TO_TARGET_SINGLE (r, l);
3889 asm_fprintf (file, "%I0x%lx", l & 0xFFFFFFFF);
3890 }
3891 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == XFmode)
3892 {
3893 REAL_VALUE_TYPE r;
3894 long l[3];
3895 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3896 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
3897 asm_fprintf (file, "%I0x%lx%08lx%08lx", l[0] & 0xFFFFFFFF,
3898 l[1] & 0xFFFFFFFF, l[2] & 0xFFFFFFFF);
3899 }
3900 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == DFmode)
3901 {
3902 REAL_VALUE_TYPE r;
3903 long l[2];
3904 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
3905 REAL_VALUE_TO_TARGET_DOUBLE (r, l);
3906 asm_fprintf (file, "%I0x%lx%08lx", l[0] & 0xFFFFFFFF, l[1] & 0xFFFFFFFF);
3907 }
3908 else
3909 {
3910 /* Use `print_operand_address' instead of `output_addr_const'
3911 to ensure that we print relevant PIC stuff. */
3912 asm_fprintf (file, "%I");
3913 if (TARGET_PCREL
3914 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST))
3915 print_operand_address (file, op);
3916 else
3917 output_addr_const (file, op);
3918 }
3919 }
3920
3921 /* m68k implementation of OUTPUT_ADDR_CONST_EXTRA. */
3922
3923 bool
3924 m68k_output_addr_const_extra (FILE *file, rtx x)
3925 {
3926 if (GET_CODE (x) != UNSPEC || XINT (x, 1) != UNSPEC_GOTOFF)
3927 return false;
3928
3929 output_addr_const (file, XVECEXP (x, 0, 0));
3930 /* ??? What is the non-MOTOROLA syntax? */
3931 fputs ("@GOT", file);
3932 return true;
3933 }
3934
3935
3936 /* A C compound statement to output to stdio stream STREAM the
3937 assembler syntax for an instruction operand that is a memory
3938 reference whose address is ADDR. ADDR is an RTL expression.
3939
3940 Note that this contains a kludge that knows that the only reason
3941 we have an address (plus (label_ref...) (reg...)) when not generating
3942 PIC code is in the insn before a tablejump, and we know that m68k.md
3943 generates a label LInnn: on such an insn.
3944
3945 It is possible for PIC to generate a (plus (label_ref...) (reg...))
3946 and we handle that just like we would a (plus (symbol_ref...) (reg...)).
3947
3948 This routine is responsible for distinguishing between -fpic and -fPIC
3949 style relocations in an address. When generating -fpic code the
3950 offset is output in word mode (e.g. movel a5@(_foo:w), a0). When generating
3951 -fPIC code the offset is output in long mode (e.g. movel a5@(_foo:l), a0) */
3952
3953 void
3954 print_operand_address (FILE *file, rtx addr)
3955 {
3956 struct m68k_address address;
3957
3958 if (!m68k_decompose_address (QImode, addr, true, &address))
3959 gcc_unreachable ();
3960
3961 if (address.code == PRE_DEC)
3962 fprintf (file, MOTOROLA ? "-(%s)" : "%s@-",
3963 M68K_REGNAME (REGNO (address.base)));
3964 else if (address.code == POST_INC)
3965 fprintf (file, MOTOROLA ? "(%s)+" : "%s@+",
3966 M68K_REGNAME (REGNO (address.base)));
3967 else if (!address.base && !address.index)
3968 {
3969 /* A constant address. */
3970 gcc_assert (address.offset == addr);
3971 if (GET_CODE (addr) == CONST_INT)
3972 {
3973 /* (xxx).w or (xxx).l. */
3974 if (IN_RANGE (INTVAL (addr), -0x8000, 0x7fff))
3975 fprintf (file, MOTOROLA ? "%d.w" : "%d:w", (int) INTVAL (addr));
3976 else
3977 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
3978 }
3979 else if (TARGET_PCREL)
3980 {
3981 /* (d16,PC) or (bd,PC,Xn) (with suppressed index register). */
3982 fputc ('(', file);
3983 output_addr_const (file, addr);
3984 asm_fprintf (file, flag_pic == 1 ? ":w,%Rpc)" : ":l,%Rpc)");
3985 }
3986 else
3987 {
3988 /* (xxx).l. We need a special case for SYMBOL_REF if the symbol
3989 name ends in `.<letter>', as the last 2 characters can be
3990 mistaken as a size suffix. Put the name in parentheses. */
3991 if (GET_CODE (addr) == SYMBOL_REF
3992 && strlen (XSTR (addr, 0)) > 2
3993 && XSTR (addr, 0)[strlen (XSTR (addr, 0)) - 2] == '.')
3994 {
3995 putc ('(', file);
3996 output_addr_const (file, addr);
3997 putc (')', file);
3998 }
3999 else
4000 output_addr_const (file, addr);
4001 }
4002 }
4003 else
4004 {
4005 int labelno;
4006
4007 /* If ADDR is a (d8,pc,Xn) address, this is the number of the
4008 label being accessed, otherwise it is -1. */
4009 labelno = (address.offset
4010 && !address.base
4011 && GET_CODE (address.offset) == LABEL_REF
4012 ? CODE_LABEL_NUMBER (XEXP (address.offset, 0))
4013 : -1);
4014 if (MOTOROLA)
4015 {
4016 /* Print the "offset(base" component. */
4017 if (labelno >= 0)
4018 asm_fprintf (file, "%LL%d(%Rpc,", labelno);
4019 else
4020 {
4021 if (address.offset)
4022 {
4023 output_addr_const (file, address.offset);
4024 if (flag_pic && address.base == pic_offset_table_rtx)
4025 {
4026 fprintf (file, "@GOT");
4027 if (flag_pic == 1 && TARGET_68020)
4028 fprintf (file, ".w");
4029 }
4030 }
4031 putc ('(', file);
4032 if (address.base)
4033 fputs (M68K_REGNAME (REGNO (address.base)), file);
4034 }
4035 /* Print the ",index" component, if any. */
4036 if (address.index)
4037 {
4038 if (address.base)
4039 putc (',', file);
4040 fprintf (file, "%s.%c",
4041 M68K_REGNAME (REGNO (address.index)),
4042 GET_MODE (address.index) == HImode ? 'w' : 'l');
4043 if (address.scale != 1)
4044 fprintf (file, "*%d", address.scale);
4045 }
4046 putc (')', file);
4047 }
4048 else /* !MOTOROLA */
4049 {
4050 if (!address.offset && !address.index)
4051 fprintf (file, "%s@", M68K_REGNAME (REGNO (address.base)));
4052 else
4053 {
4054 /* Print the "base@(offset" component. */
4055 if (labelno >= 0)
4056 asm_fprintf (file, "%Rpc@(%LL%d", labelno);
4057 else
4058 {
4059 if (address.base)
4060 fputs (M68K_REGNAME (REGNO (address.base)), file);
4061 fprintf (file, "@(");
4062 if (address.offset)
4063 {
4064 output_addr_const (file, address.offset);
4065 if (address.base == pic_offset_table_rtx && TARGET_68020)
4066 switch (flag_pic)
4067 {
4068 case 1:
4069 fprintf (file, ":w"); break;
4070 case 2:
4071 fprintf (file, ":l"); break;
4072 default:
4073 break;
4074 }
4075 }
4076 }
4077 /* Print the ",index" component, if any. */
4078 if (address.index)
4079 {
4080 fprintf (file, ",%s:%c",
4081 M68K_REGNAME (REGNO (address.index)),
4082 GET_MODE (address.index) == HImode ? 'w' : 'l');
4083 if (address.scale != 1)
4084 fprintf (file, ":%d", address.scale);
4085 }
4086 putc (')', file);
4087 }
4088 }
4089 }
4090 }
4091
4092 /* Check for cases where a clr insns can be omitted from code using
4093 strict_low_part sets. For example, the second clrl here is not needed:
4094 clrl d0; movw a0@+,d0; use d0; clrl d0; movw a0@+; use d0; ...
4095
4096 MODE is the mode of this STRICT_LOW_PART set. FIRST_INSN is the clear
4097 insn we are checking for redundancy. TARGET is the register set by the
4098 clear insn. */
4099
4100 bool
4101 strict_low_part_peephole_ok (enum machine_mode mode, rtx first_insn,
4102 rtx target)
4103 {
4104 rtx p = first_insn;
4105
4106 while ((p = PREV_INSN (p)))
4107 {
4108 if (NOTE_INSN_BASIC_BLOCK_P (p))
4109 return false;
4110
4111 if (NOTE_P (p))
4112 continue;
4113
4114 /* If it isn't an insn, then give up. */
4115 if (!INSN_P (p))
4116 return false;
4117
4118 if (reg_set_p (target, p))
4119 {
4120 rtx set = single_set (p);
4121 rtx dest;
4122
4123 /* If it isn't an easy to recognize insn, then give up. */
4124 if (! set)
4125 return false;
4126
4127 dest = SET_DEST (set);
4128
4129 /* If this sets the entire target register to zero, then our
4130 first_insn is redundant. */
4131 if (rtx_equal_p (dest, target)
4132 && SET_SRC (set) == const0_rtx)
4133 return true;
4134 else if (GET_CODE (dest) == STRICT_LOW_PART
4135 && GET_CODE (XEXP (dest, 0)) == REG
4136 && REGNO (XEXP (dest, 0)) == REGNO (target)
4137 && (GET_MODE_SIZE (GET_MODE (XEXP (dest, 0)))
4138 <= GET_MODE_SIZE (mode)))
4139 /* This is a strict low part set which modifies less than
4140 we are using, so it is safe. */
4141 ;
4142 else
4143 return false;
4144 }
4145 }
4146
4147 return false;
4148 }
4149
4150 /* Operand predicates for implementing asymmetric pc-relative addressing
4151 on m68k. The m68k supports pc-relative addressing (mode 7, register 2)
4152 when used as a source operand, but not as a destination operand.
4153
4154 We model this by restricting the meaning of the basic predicates
4155 (general_operand, memory_operand, etc) to forbid the use of this
4156 addressing mode, and then define the following predicates that permit
4157 this addressing mode. These predicates can then be used for the
4158 source operands of the appropriate instructions.
4159
4160 n.b. While it is theoretically possible to change all machine patterns
4161 to use this addressing more where permitted by the architecture,
4162 it has only been implemented for "common" cases: SImode, HImode, and
4163 QImode operands, and only for the principle operations that would
4164 require this addressing mode: data movement and simple integer operations.
4165
4166 In parallel with these new predicates, two new constraint letters
4167 were defined: 'S' and 'T'. 'S' is the -mpcrel analog of 'm'.
4168 'T' replaces 's' in the non-pcrel case. It is a no-op in the pcrel case.
4169 In the pcrel case 's' is only valid in combination with 'a' registers.
4170 See addsi3, subsi3, cmpsi, and movsi patterns for a better understanding
4171 of how these constraints are used.
4172
4173 The use of these predicates is strictly optional, though patterns that
4174 don't will cause an extra reload register to be allocated where one
4175 was not necessary:
4176
4177 lea (abc:w,%pc),%a0 ; need to reload address
4178 moveq &1,%d1 ; since write to pc-relative space
4179 movel %d1,%a0@ ; is not allowed
4180 ...
4181 lea (abc:w,%pc),%a1 ; no need to reload address here
4182 movel %a1@,%d0 ; since "movel (abc:w,%pc),%d0" is ok
4183
4184 For more info, consult tiemann@cygnus.com.
4185
4186
4187 All of the ugliness with predicates and constraints is due to the
4188 simple fact that the m68k does not allow a pc-relative addressing
4189 mode as a destination. gcc does not distinguish between source and
4190 destination addresses. Hence, if we claim that pc-relative address
4191 modes are valid, e.g. GO_IF_LEGITIMATE_ADDRESS accepts them, then we
4192 end up with invalid code. To get around this problem, we left
4193 pc-relative modes as invalid addresses, and then added special
4194 predicates and constraints to accept them.
4195
4196 A cleaner way to handle this is to modify gcc to distinguish
4197 between source and destination addresses. We can then say that
4198 pc-relative is a valid source address but not a valid destination
4199 address, and hopefully avoid a lot of the predicate and constraint
4200 hackery. Unfortunately, this would be a pretty big change. It would
4201 be a useful change for a number of ports, but there aren't any current
4202 plans to undertake this.
4203
4204 ***************************************************************************/
4205
4206
4207 const char *
4208 output_andsi3 (rtx *operands)
4209 {
4210 int logval;
4211 if (GET_CODE (operands[2]) == CONST_INT
4212 && (INTVAL (operands[2]) | 0xffff) == -1
4213 && (DATA_REG_P (operands[0])
4214 || offsettable_memref_p (operands[0]))
4215 && !TARGET_COLDFIRE)
4216 {
4217 if (GET_CODE (operands[0]) != REG)
4218 operands[0] = adjust_address (operands[0], HImode, 2);
4219 operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);
4220 /* Do not delete a following tstl %0 insn; that would be incorrect. */
4221 CC_STATUS_INIT;
4222 if (operands[2] == const0_rtx)
4223 return "clr%.w %0";
4224 return "and%.w %2,%0";
4225 }
4226 if (GET_CODE (operands[2]) == CONST_INT
4227 && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0
4228 && (DATA_REG_P (operands[0])
4229 || offsettable_memref_p (operands[0])))
4230 {
4231 if (DATA_REG_P (operands[0]))
4232 operands[1] = GEN_INT (logval);
4233 else
4234 {
4235 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
4236 operands[1] = GEN_INT (logval % 8);
4237 }
4238 /* This does not set condition codes in a standard way. */
4239 CC_STATUS_INIT;
4240 return "bclr %1,%0";
4241 }
4242 return "and%.l %2,%0";
4243 }
4244
4245 const char *
4246 output_iorsi3 (rtx *operands)
4247 {
4248 register int logval;
4249 if (GET_CODE (operands[2]) == CONST_INT
4250 && INTVAL (operands[2]) >> 16 == 0
4251 && (DATA_REG_P (operands[0])
4252 || offsettable_memref_p (operands[0]))
4253 && !TARGET_COLDFIRE)
4254 {
4255 if (GET_CODE (operands[0]) != REG)
4256 operands[0] = adjust_address (operands[0], HImode, 2);
4257 /* Do not delete a following tstl %0 insn; that would be incorrect. */
4258 CC_STATUS_INIT;
4259 if (INTVAL (operands[2]) == 0xffff)
4260 return "mov%.w %2,%0";
4261 return "or%.w %2,%0";
4262 }
4263 if (GET_CODE (operands[2]) == CONST_INT
4264 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
4265 && (DATA_REG_P (operands[0])
4266 || offsettable_memref_p (operands[0])))
4267 {
4268 if (DATA_REG_P (operands[0]))
4269 operands[1] = GEN_INT (logval);
4270 else
4271 {
4272 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
4273 operands[1] = GEN_INT (logval % 8);
4274 }
4275 CC_STATUS_INIT;
4276 return "bset %1,%0";
4277 }
4278 return "or%.l %2,%0";
4279 }
4280
4281 const char *
4282 output_xorsi3 (rtx *operands)
4283 {
4284 register int logval;
4285 if (GET_CODE (operands[2]) == CONST_INT
4286 && INTVAL (operands[2]) >> 16 == 0
4287 && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0]))
4288 && !TARGET_COLDFIRE)
4289 {
4290 if (! DATA_REG_P (operands[0]))
4291 operands[0] = adjust_address (operands[0], HImode, 2);
4292 /* Do not delete a following tstl %0 insn; that would be incorrect. */
4293 CC_STATUS_INIT;
4294 if (INTVAL (operands[2]) == 0xffff)
4295 return "not%.w %0";
4296 return "eor%.w %2,%0";
4297 }
4298 if (GET_CODE (operands[2]) == CONST_INT
4299 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
4300 && (DATA_REG_P (operands[0])
4301 || offsettable_memref_p (operands[0])))
4302 {
4303 if (DATA_REG_P (operands[0]))
4304 operands[1] = GEN_INT (logval);
4305 else
4306 {
4307 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
4308 operands[1] = GEN_INT (logval % 8);
4309 }
4310 CC_STATUS_INIT;
4311 return "bchg %1,%0";
4312 }
4313 return "eor%.l %2,%0";
4314 }
4315
4316 /* Return the instruction that should be used for a call to address X,
4317 which is known to be in operand 0. */
4318
4319 const char *
4320 output_call (rtx x)
4321 {
4322 if (symbolic_operand (x, VOIDmode))
4323 return m68k_symbolic_call;
4324 else
4325 return "jsr %a0";
4326 }
4327
4328 /* Likewise sibling calls. */
4329
4330 const char *
4331 output_sibcall (rtx x)
4332 {
4333 if (symbolic_operand (x, VOIDmode))
4334 return m68k_symbolic_jump;
4335 else
4336 return "jmp %a0";
4337 }
4338
4339 #ifdef M68K_TARGET_COFF
4340
4341 /* Output assembly to switch to section NAME with attribute FLAGS. */
4342
4343 static void
4344 m68k_coff_asm_named_section (const char *name, unsigned int flags,
4345 tree decl ATTRIBUTE_UNUSED)
4346 {
4347 char flagchar;
4348
4349 if (flags & SECTION_WRITE)
4350 flagchar = 'd';
4351 else
4352 flagchar = 'x';
4353
4354 fprintf (asm_out_file, "\t.section\t%s,\"%c\"\n", name, flagchar);
4355 }
4356
4357 #endif /* M68K_TARGET_COFF */
4358
4359 static void
4360 m68k_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
4361 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
4362 tree function)
4363 {
4364 rtx this_slot, offset, addr, mem, insn;
4365
4366 /* Pretend to be a post-reload pass while generating rtl. */
4367 reload_completed = 1;
4368
4369 /* The "this" pointer is stored at 4(%sp). */
4370 this_slot = gen_rtx_MEM (Pmode, plus_constant (stack_pointer_rtx, 4));
4371
4372 /* Add DELTA to THIS. */
4373 if (delta != 0)
4374 {
4375 /* Make the offset a legitimate operand for memory addition. */
4376 offset = GEN_INT (delta);
4377 if ((delta < -8 || delta > 8)
4378 && (TARGET_COLDFIRE || USE_MOVQ (delta)))
4379 {
4380 emit_move_insn (gen_rtx_REG (Pmode, D0_REG), offset);
4381 offset = gen_rtx_REG (Pmode, D0_REG);
4382 }
4383 emit_insn (gen_add3_insn (copy_rtx (this_slot),
4384 copy_rtx (this_slot), offset));
4385 }
4386
4387 /* If needed, add *(*THIS + VCALL_OFFSET) to THIS. */
4388 if (vcall_offset != 0)
4389 {
4390 /* Set the static chain register to *THIS. */
4391 emit_move_insn (static_chain_rtx, this_slot);
4392 emit_move_insn (static_chain_rtx, gen_rtx_MEM (Pmode, static_chain_rtx));
4393
4394 /* Set ADDR to a legitimate address for *THIS + VCALL_OFFSET. */
4395 addr = plus_constant (static_chain_rtx, vcall_offset);
4396 if (!m68k_legitimate_address_p (Pmode, addr, true))
4397 {
4398 emit_insn (gen_rtx_SET (VOIDmode, static_chain_rtx, addr));
4399 addr = static_chain_rtx;
4400 }
4401
4402 /* Load the offset into %d0 and add it to THIS. */
4403 emit_move_insn (gen_rtx_REG (Pmode, D0_REG),
4404 gen_rtx_MEM (Pmode, addr));
4405 emit_insn (gen_add3_insn (copy_rtx (this_slot),
4406 copy_rtx (this_slot),
4407 gen_rtx_REG (Pmode, D0_REG)));
4408 }
4409
4410 /* Jump to the target function. Use a sibcall if direct jumps are
4411 allowed, otherwise load the address into a register first. */
4412 mem = DECL_RTL (function);
4413 if (!sibcall_operand (XEXP (mem, 0), VOIDmode))
4414 {
4415 gcc_assert (flag_pic);
4416
4417 if (!TARGET_SEP_DATA)
4418 {
4419 /* Use the static chain register as a temporary (call-clobbered)
4420 GOT pointer for this function. We can use the static chain
4421 register because it isn't live on entry to the thunk. */
4422 SET_REGNO (pic_offset_table_rtx, STATIC_CHAIN_REGNUM);
4423 emit_insn (gen_load_got (pic_offset_table_rtx));
4424 }
4425 legitimize_pic_address (XEXP (mem, 0), Pmode, static_chain_rtx);
4426 mem = replace_equiv_address (mem, static_chain_rtx);
4427 }
4428 insn = emit_call_insn (gen_sibcall (mem, const0_rtx));
4429 SIBLING_CALL_P (insn) = 1;
4430
4431 /* Run just enough of rest_of_compilation. */
4432 insn = get_insns ();
4433 split_all_insns_noflow ();
4434 final_start_function (insn, file, 1);
4435 final (insn, file, 1);
4436 final_end_function ();
4437
4438 /* Clean up the vars set above. */
4439 reload_completed = 0;
4440
4441 /* Restore the original PIC register. */
4442 if (flag_pic)
4443 SET_REGNO (pic_offset_table_rtx, PIC_REG);
4444 free_after_compilation (cfun);
4445 }
4446
4447 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
4448
4449 static rtx
4450 m68k_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
4451 int incoming ATTRIBUTE_UNUSED)
4452 {
4453 return gen_rtx_REG (Pmode, M68K_STRUCT_VALUE_REGNUM);
4454 }
4455
4456 /* Return nonzero if register old_reg can be renamed to register new_reg. */
4457 int
4458 m68k_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
4459 unsigned int new_reg)
4460 {
4461
4462 /* Interrupt functions can only use registers that have already been
4463 saved by the prologue, even if they would normally be
4464 call-clobbered. */
4465
4466 if ((m68k_get_function_kind (current_function_decl)
4467 == m68k_fk_interrupt_handler)
4468 && !df_regs_ever_live_p (new_reg))
4469 return 0;
4470
4471 return 1;
4472 }
4473
4474 /* Value is true if hard register REGNO can hold a value of machine-mode
4475 MODE. On the 68000, we let the cpu registers can hold any mode, but
4476 restrict the 68881 registers to floating-point modes. */
4477
4478 bool
4479 m68k_regno_mode_ok (int regno, enum machine_mode mode)
4480 {
4481 if (DATA_REGNO_P (regno))
4482 {
4483 /* Data Registers, can hold aggregate if fits in. */
4484 if (regno + GET_MODE_SIZE (mode) / 4 <= 8)
4485 return true;
4486 }
4487 else if (ADDRESS_REGNO_P (regno))
4488 {
4489 if (regno + GET_MODE_SIZE (mode) / 4 <= 16)
4490 return true;
4491 }
4492 else if (FP_REGNO_P (regno))
4493 {
4494 /* FPU registers, hold float or complex float of long double or
4495 smaller. */
4496 if ((GET_MODE_CLASS (mode) == MODE_FLOAT
4497 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
4498 && GET_MODE_UNIT_SIZE (mode) <= TARGET_FP_REG_SIZE)
4499 return true;
4500 }
4501 return false;
4502 }
4503
4504 /* Implement SECONDARY_RELOAD_CLASS. */
4505
4506 enum reg_class
4507 m68k_secondary_reload_class (enum reg_class rclass,
4508 enum machine_mode mode, rtx x)
4509 {
4510 int regno;
4511
4512 regno = true_regnum (x);
4513
4514 /* If one operand of a movqi is an address register, the other
4515 operand must be a general register or constant. Other types
4516 of operand must be reloaded through a data register. */
4517 if (GET_MODE_SIZE (mode) == 1
4518 && reg_classes_intersect_p (rclass, ADDR_REGS)
4519 && !(INT_REGNO_P (regno) || CONSTANT_P (x)))
4520 return DATA_REGS;
4521
4522 /* PC-relative addresses must be loaded into an address register first. */
4523 if (TARGET_PCREL
4524 && !reg_class_subset_p (rclass, ADDR_REGS)
4525 && symbolic_operand (x, VOIDmode))
4526 return ADDR_REGS;
4527
4528 return NO_REGS;
4529 }
4530
4531 /* Implement PREFERRED_RELOAD_CLASS. */
4532
4533 enum reg_class
4534 m68k_preferred_reload_class (rtx x, enum reg_class rclass)
4535 {
4536 enum reg_class secondary_class;
4537
4538 /* If RCLASS might need a secondary reload, try restricting it to
4539 a class that doesn't. */
4540 secondary_class = m68k_secondary_reload_class (rclass, GET_MODE (x), x);
4541 if (secondary_class != NO_REGS
4542 && reg_class_subset_p (secondary_class, rclass))
4543 return secondary_class;
4544
4545 /* Prefer to use moveq for in-range constants. */
4546 if (GET_CODE (x) == CONST_INT
4547 && reg_class_subset_p (DATA_REGS, rclass)
4548 && IN_RANGE (INTVAL (x), -0x80, 0x7f))
4549 return DATA_REGS;
4550
4551 /* ??? Do we really need this now? */
4552 if (GET_CODE (x) == CONST_DOUBLE
4553 && GET_MODE_CLASS (GET_MODE (x)) == MODE_FLOAT)
4554 {
4555 if (TARGET_HARD_FLOAT && reg_class_subset_p (FP_REGS, rclass))
4556 return FP_REGS;
4557
4558 return NO_REGS;
4559 }
4560
4561 return rclass;
4562 }
4563
4564 /* Return floating point values in a 68881 register. This makes 68881 code
4565 a little bit faster. It also makes -msoft-float code incompatible with
4566 hard-float code, so people have to be careful not to mix the two.
4567 For ColdFire it was decided the ABI incompatibility is undesirable.
4568 If there is need for a hard-float ABI it is probably worth doing it
4569 properly and also passing function arguments in FP registers. */
4570 rtx
4571 m68k_libcall_value (enum machine_mode mode)
4572 {
4573 switch (mode) {
4574 case SFmode:
4575 case DFmode:
4576 case XFmode:
4577 if (TARGET_68881)
4578 return gen_rtx_REG (mode, FP0_REG);
4579 break;
4580 default:
4581 break;
4582 }
4583 return gen_rtx_REG (mode, D0_REG);
4584 }
4585
4586 rtx
4587 m68k_function_value (const_tree valtype, const_tree func ATTRIBUTE_UNUSED)
4588 {
4589 enum machine_mode mode;
4590
4591 mode = TYPE_MODE (valtype);
4592 switch (mode) {
4593 case SFmode:
4594 case DFmode:
4595 case XFmode:
4596 if (TARGET_68881)
4597 return gen_rtx_REG (mode, FP0_REG);
4598 break;
4599 default:
4600 break;
4601 }
4602
4603 /* If the function returns a pointer, push that into %a0. */
4604 if (func && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (func))))
4605 /* For compatibility with the large body of existing code which
4606 does not always properly declare external functions returning
4607 pointer types, the m68k/SVR4 convention is to copy the value
4608 returned for pointer functions from a0 to d0 in the function
4609 epilogue, so that callers that have neglected to properly
4610 declare the callee can still find the correct return value in
4611 d0. */
4612 return gen_rtx_PARALLEL
4613 (mode,
4614 gen_rtvec (2,
4615 gen_rtx_EXPR_LIST (VOIDmode,
4616 gen_rtx_REG (mode, A0_REG),
4617 const0_rtx),
4618 gen_rtx_EXPR_LIST (VOIDmode,
4619 gen_rtx_REG (mode, D0_REG),
4620 const0_rtx)));
4621 else if (POINTER_TYPE_P (valtype))
4622 return gen_rtx_REG (mode, A0_REG);
4623 else
4624 return gen_rtx_REG (mode, D0_REG);
4625 }
4626
4627 /* Worker function for TARGET_RETURN_IN_MEMORY. */
4628 #if M68K_HONOR_TARGET_STRICT_ALIGNMENT
4629 static bool
4630 m68k_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
4631 {
4632 enum machine_mode mode = TYPE_MODE (type);
4633
4634 if (mode == BLKmode)
4635 return true;
4636
4637 /* If TYPE's known alignment is less than the alignment of MODE that
4638 would contain the structure, then return in memory. We need to
4639 do so to maintain the compatibility between code compiled with
4640 -mstrict-align and that compiled with -mno-strict-align. */
4641 if (AGGREGATE_TYPE_P (type)
4642 && TYPE_ALIGN (type) < GET_MODE_ALIGNMENT (mode))
4643 return true;
4644
4645 return false;
4646 }
4647 #endif
4648
4649 /* CPU to schedule the program for. */
4650 enum attr_cpu m68k_sched_cpu;
4651
4652 /* MAC to schedule the program for. */
4653 enum attr_mac m68k_sched_mac;
4654
4655 /* Operand type. */
4656 enum attr_op_type
4657 {
4658 /* No operand. */
4659 OP_TYPE_NONE,
4660
4661 /* Integer register. */
4662 OP_TYPE_RN,
4663
4664 /* FP register. */
4665 OP_TYPE_FPN,
4666
4667 /* Implicit mem reference (e.g. stack). */
4668 OP_TYPE_MEM1,
4669
4670 /* Memory without offset or indexing. EA modes 2, 3 and 4. */
4671 OP_TYPE_MEM234,
4672
4673 /* Memory with offset but without indexing. EA mode 5. */
4674 OP_TYPE_MEM5,
4675
4676 /* Memory with indexing. EA mode 6. */
4677 OP_TYPE_MEM6,
4678
4679 /* Memory referenced by absolute address. EA mode 7. */
4680 OP_TYPE_MEM7,
4681
4682 /* Immediate operand that doesn't require extension word. */
4683 OP_TYPE_IMM_Q,
4684
4685 /* Immediate 16 bit operand. */
4686 OP_TYPE_IMM_W,
4687
4688 /* Immediate 32 bit operand. */
4689 OP_TYPE_IMM_L
4690 };
4691
4692 /* Return type of memory ADDR_RTX refers to. */
4693 static enum attr_op_type
4694 sched_address_type (enum machine_mode mode, rtx addr_rtx)
4695 {
4696 struct m68k_address address;
4697
4698 if (symbolic_operand (addr_rtx, VOIDmode))
4699 return OP_TYPE_MEM7;
4700
4701 if (!m68k_decompose_address (mode, addr_rtx,
4702 reload_completed, &address))
4703 {
4704 gcc_assert (!reload_completed);
4705 /* Reload will likely fix the address to be in the register. */
4706 return OP_TYPE_MEM234;
4707 }
4708
4709 if (address.scale != 0)
4710 return OP_TYPE_MEM6;
4711
4712 if (address.base != NULL_RTX)
4713 {
4714 if (address.offset == NULL_RTX)
4715 return OP_TYPE_MEM234;
4716
4717 return OP_TYPE_MEM5;
4718 }
4719
4720 gcc_assert (address.offset != NULL_RTX);
4721
4722 return OP_TYPE_MEM7;
4723 }
4724
4725 /* Return X or Y (depending on OPX_P) operand of INSN. */
4726 static rtx
4727 sched_get_operand (rtx insn, bool opx_p)
4728 {
4729 int i;
4730
4731 if (recog_memoized (insn) < 0)
4732 gcc_unreachable ();
4733
4734 extract_constrain_insn_cached (insn);
4735
4736 if (opx_p)
4737 i = get_attr_opx (insn);
4738 else
4739 i = get_attr_opy (insn);
4740
4741 if (i >= recog_data.n_operands)
4742 return NULL;
4743
4744 return recog_data.operand[i];
4745 }
4746
4747 /* Return type of INSN's operand X (if OPX_P) or operand Y (if !OPX_P).
4748 If ADDRESS_P is true, return type of memory location operand refers to. */
4749 static enum attr_op_type
4750 sched_attr_op_type (rtx insn, bool opx_p, bool address_p)
4751 {
4752 rtx op;
4753
4754 op = sched_get_operand (insn, opx_p);
4755
4756 if (op == NULL)
4757 {
4758 gcc_assert (!reload_completed);
4759 return OP_TYPE_RN;
4760 }
4761
4762 if (address_p)
4763 return sched_address_type (QImode, op);
4764
4765 if (memory_operand (op, VOIDmode))
4766 return sched_address_type (GET_MODE (op), XEXP (op, 0));
4767
4768 if (register_operand (op, VOIDmode))
4769 {
4770 if ((!reload_completed && FLOAT_MODE_P (GET_MODE (op)))
4771 || (reload_completed && FP_REG_P (op)))
4772 return OP_TYPE_FPN;
4773
4774 return OP_TYPE_RN;
4775 }
4776
4777 if (GET_CODE (op) == CONST_INT)
4778 {
4779 int ival;
4780
4781 ival = INTVAL (op);
4782
4783 /* Check for quick constants. */
4784 switch (get_attr_type (insn))
4785 {
4786 case TYPE_ALUQ_L:
4787 if (IN_RANGE (ival, 1, 8) || IN_RANGE (ival, -8, -1))
4788 return OP_TYPE_IMM_Q;
4789
4790 gcc_assert (!reload_completed);
4791 break;
4792
4793 case TYPE_MOVEQ_L:
4794 if (USE_MOVQ (ival))
4795 return OP_TYPE_IMM_Q;
4796
4797 gcc_assert (!reload_completed);
4798 break;
4799
4800 case TYPE_MOV3Q_L:
4801 if (valid_mov3q_const (ival))
4802 return OP_TYPE_IMM_Q;
4803
4804 gcc_assert (!reload_completed);
4805 break;
4806
4807 default:
4808 break;
4809 }
4810
4811 if (IN_RANGE (ival, -0x8000, 0x7fff))
4812 return OP_TYPE_IMM_W;
4813
4814 return OP_TYPE_IMM_L;
4815 }
4816
4817 if (GET_CODE (op) == CONST_DOUBLE)
4818 {
4819 switch (GET_MODE (op))
4820 {
4821 case SFmode:
4822 return OP_TYPE_IMM_W;
4823
4824 case VOIDmode:
4825 case DFmode:
4826 return OP_TYPE_IMM_L;
4827
4828 default:
4829 gcc_unreachable ();
4830 }
4831 }
4832
4833 if (GET_CODE (op) == CONST
4834 || symbolic_operand (op, VOIDmode)
4835 || LABEL_P (op))
4836 {
4837 switch (GET_MODE (op))
4838 {
4839 case QImode:
4840 return OP_TYPE_IMM_Q;
4841
4842 case HImode:
4843 return OP_TYPE_IMM_W;
4844
4845 case SImode:
4846 return OP_TYPE_IMM_L;
4847
4848 default:
4849 if (GET_CODE (op) == SYMBOL_REF)
4850 /* ??? Just a guess. Probably we can guess better using length
4851 attribute of the instructions. */
4852 return OP_TYPE_IMM_W;
4853
4854 return OP_TYPE_IMM_L;
4855 }
4856 }
4857
4858 gcc_assert (!reload_completed);
4859
4860 if (FLOAT_MODE_P (GET_MODE (op)))
4861 return OP_TYPE_FPN;
4862
4863 return OP_TYPE_RN;
4864 }
4865
4866 /* Implement opx_type attribute.
4867 Return type of INSN's operand X.
4868 If ADDRESS_P is true, return type of memory location operand refers to. */
4869 enum attr_opx_type
4870 m68k_sched_attr_opx_type (rtx insn, int address_p)
4871 {
4872 switch (sched_attr_op_type (insn, true, address_p != 0))
4873 {
4874 case OP_TYPE_RN:
4875 return OPX_TYPE_RN;
4876
4877 case OP_TYPE_FPN:
4878 return OPX_TYPE_FPN;
4879
4880 case OP_TYPE_MEM1:
4881 return OPX_TYPE_MEM1;
4882
4883 case OP_TYPE_MEM234:
4884 return OPX_TYPE_MEM234;
4885
4886 case OP_TYPE_MEM5:
4887 return OPX_TYPE_MEM5;
4888
4889 case OP_TYPE_MEM6:
4890 return OPX_TYPE_MEM6;
4891
4892 case OP_TYPE_MEM7:
4893 return OPX_TYPE_MEM7;
4894
4895 case OP_TYPE_IMM_Q:
4896 return OPX_TYPE_IMM_Q;
4897
4898 case OP_TYPE_IMM_W:
4899 return OPX_TYPE_IMM_W;
4900
4901 case OP_TYPE_IMM_L:
4902 return OPX_TYPE_IMM_L;
4903
4904 default:
4905 gcc_unreachable ();
4906 return 0;
4907 }
4908 }
4909
4910 /* Implement opy_type attribute.
4911 Return type of INSN's operand Y.
4912 If ADDRESS_P is true, return type of memory location operand refers to. */
4913 enum attr_opy_type
4914 m68k_sched_attr_opy_type (rtx insn, int address_p)
4915 {
4916 switch (sched_attr_op_type (insn, false, address_p != 0))
4917 {
4918 case OP_TYPE_RN:
4919 return OPY_TYPE_RN;
4920
4921 case OP_TYPE_FPN:
4922 return OPY_TYPE_FPN;
4923
4924 case OP_TYPE_MEM1:
4925 return OPY_TYPE_MEM1;
4926
4927 case OP_TYPE_MEM234:
4928 return OPY_TYPE_MEM234;
4929
4930 case OP_TYPE_MEM5:
4931 return OPY_TYPE_MEM5;
4932
4933 case OP_TYPE_MEM6:
4934 return OPY_TYPE_MEM6;
4935
4936 case OP_TYPE_MEM7:
4937 return OPY_TYPE_MEM7;
4938
4939 case OP_TYPE_IMM_Q:
4940 return OPY_TYPE_IMM_Q;
4941
4942 case OP_TYPE_IMM_W:
4943 return OPY_TYPE_IMM_W;
4944
4945 case OP_TYPE_IMM_L:
4946 return OPY_TYPE_IMM_L;
4947
4948 default:
4949 gcc_unreachable ();
4950 return 0;
4951 }
4952 }
4953
4954 /* Return size of INSN as int. */
4955 static int
4956 sched_get_attr_size_int (rtx insn)
4957 {
4958 int size;
4959
4960 switch (get_attr_type (insn))
4961 {
4962 case TYPE_IGNORE:
4963 /* There should be no references to m68k_sched_attr_size for 'ignore'
4964 instructions. */
4965 gcc_unreachable ();
4966 return 0;
4967
4968 case TYPE_MUL_L:
4969 size = 2;
4970 break;
4971
4972 default:
4973 size = 1;
4974 break;
4975 }
4976
4977 switch (get_attr_opx_type (insn))
4978 {
4979 case OPX_TYPE_NONE:
4980 case OPX_TYPE_RN:
4981 case OPX_TYPE_FPN:
4982 case OPX_TYPE_MEM1:
4983 case OPX_TYPE_MEM234:
4984 case OPY_TYPE_IMM_Q:
4985 break;
4986
4987 case OPX_TYPE_MEM5:
4988 case OPX_TYPE_MEM6:
4989 /* Here we assume that most absolute references are short. */
4990 case OPX_TYPE_MEM7:
4991 case OPY_TYPE_IMM_W:
4992 ++size;
4993 break;
4994
4995 case OPY_TYPE_IMM_L:
4996 size += 2;
4997 break;
4998
4999 default:
5000 gcc_unreachable ();
5001 }
5002
5003 switch (get_attr_opy_type (insn))
5004 {
5005 case OPY_TYPE_NONE:
5006 case OPY_TYPE_RN:
5007 case OPY_TYPE_FPN:
5008 case OPY_TYPE_MEM1:
5009 case OPY_TYPE_MEM234:
5010 case OPY_TYPE_IMM_Q:
5011 break;
5012
5013 case OPY_TYPE_MEM5:
5014 case OPY_TYPE_MEM6:
5015 /* Here we assume that most absolute references are short. */
5016 case OPY_TYPE_MEM7:
5017 case OPY_TYPE_IMM_W:
5018 ++size;
5019 break;
5020
5021 case OPY_TYPE_IMM_L:
5022 size += 2;
5023 break;
5024
5025 default:
5026 gcc_unreachable ();
5027 }
5028
5029 if (size > 3)
5030 {
5031 gcc_assert (!reload_completed);
5032
5033 size = 3;
5034 }
5035
5036 return size;
5037 }
5038
5039 /* Return size of INSN as attribute enum value. */
5040 enum attr_size
5041 m68k_sched_attr_size (rtx insn)
5042 {
5043 switch (sched_get_attr_size_int (insn))
5044 {
5045 case 1:
5046 return SIZE_1;
5047
5048 case 2:
5049 return SIZE_2;
5050
5051 case 3:
5052 return SIZE_3;
5053
5054 default:
5055 gcc_unreachable ();
5056 return 0;
5057 }
5058 }
5059
5060 /* Return operand X or Y (depending on OPX_P) of INSN,
5061 if it is a MEM, or NULL overwise. */
5062 static enum attr_op_type
5063 sched_get_opxy_mem_type (rtx insn, bool opx_p)
5064 {
5065 if (opx_p)
5066 {
5067 switch (get_attr_opx_type (insn))
5068 {
5069 case OPX_TYPE_NONE:
5070 case OPX_TYPE_RN:
5071 case OPX_TYPE_FPN:
5072 case OPX_TYPE_IMM_Q:
5073 case OPX_TYPE_IMM_W:
5074 case OPX_TYPE_IMM_L:
5075 return OP_TYPE_RN;
5076
5077 case OPX_TYPE_MEM1:
5078 case OPX_TYPE_MEM234:
5079 case OPX_TYPE_MEM5:
5080 case OPX_TYPE_MEM7:
5081 return OP_TYPE_MEM1;
5082
5083 case OPX_TYPE_MEM6:
5084 return OP_TYPE_MEM6;
5085
5086 default:
5087 gcc_unreachable ();
5088 return 0;
5089 }
5090 }
5091 else
5092 {
5093 switch (get_attr_opy_type (insn))
5094 {
5095 case OPY_TYPE_NONE:
5096 case OPY_TYPE_RN:
5097 case OPY_TYPE_FPN:
5098 case OPY_TYPE_IMM_Q:
5099 case OPY_TYPE_IMM_W:
5100 case OPY_TYPE_IMM_L:
5101 return OP_TYPE_RN;
5102
5103 case OPY_TYPE_MEM1:
5104 case OPY_TYPE_MEM234:
5105 case OPY_TYPE_MEM5:
5106 case OPY_TYPE_MEM7:
5107 return OP_TYPE_MEM1;
5108
5109 case OPY_TYPE_MEM6:
5110 return OP_TYPE_MEM6;
5111
5112 default:
5113 gcc_unreachable ();
5114 return 0;
5115 }
5116 }
5117 }
5118
5119 /* Implement op_mem attribute. */
5120 enum attr_op_mem
5121 m68k_sched_attr_op_mem (rtx insn)
5122 {
5123 enum attr_op_type opx;
5124 enum attr_op_type opy;
5125
5126 opx = sched_get_opxy_mem_type (insn, true);
5127 opy = sched_get_opxy_mem_type (insn, false);
5128
5129 if (opy == OP_TYPE_RN && opx == OP_TYPE_RN)
5130 return OP_MEM_00;
5131
5132 if (opy == OP_TYPE_RN && opx == OP_TYPE_MEM1)
5133 {
5134 switch (get_attr_opx_access (insn))
5135 {
5136 case OPX_ACCESS_R:
5137 return OP_MEM_10;
5138
5139 case OPX_ACCESS_W:
5140 return OP_MEM_01;
5141
5142 case OPX_ACCESS_RW:
5143 return OP_MEM_11;
5144
5145 default:
5146 gcc_unreachable ();
5147 return 0;
5148 }
5149 }
5150
5151 if (opy == OP_TYPE_RN && opx == OP_TYPE_MEM6)
5152 {
5153 switch (get_attr_opx_access (insn))
5154 {
5155 case OPX_ACCESS_R:
5156 return OP_MEM_I0;
5157
5158 case OPX_ACCESS_W:
5159 return OP_MEM_0I;
5160
5161 case OPX_ACCESS_RW:
5162 return OP_MEM_I1;
5163
5164 default:
5165 gcc_unreachable ();
5166 return 0;
5167 }
5168 }
5169
5170 if (opy == OP_TYPE_MEM1 && opx == OP_TYPE_RN)
5171 return OP_MEM_10;
5172
5173 if (opy == OP_TYPE_MEM1 && opx == OP_TYPE_MEM1)
5174 {
5175 switch (get_attr_opx_access (insn))
5176 {
5177 case OPX_ACCESS_W:
5178 return OP_MEM_11;
5179
5180 default:
5181 gcc_assert (!reload_completed);
5182 return OP_MEM_11;
5183 }
5184 }
5185
5186 if (opy == OP_TYPE_MEM1 && opx == OP_TYPE_MEM6)
5187 {
5188 switch (get_attr_opx_access (insn))
5189 {
5190 case OPX_ACCESS_W:
5191 return OP_MEM_1I;
5192
5193 default:
5194 gcc_assert (!reload_completed);
5195 return OP_MEM_1I;
5196 }
5197 }
5198
5199 if (opy == OP_TYPE_MEM6 && opx == OP_TYPE_RN)
5200 return OP_MEM_I0;
5201
5202 if (opy == OP_TYPE_MEM6 && opx == OP_TYPE_MEM1)
5203 {
5204 switch (get_attr_opx_access (insn))
5205 {
5206 case OPX_ACCESS_W:
5207 return OP_MEM_I1;
5208
5209 default:
5210 gcc_assert (!reload_completed);
5211 return OP_MEM_I1;
5212 }
5213 }
5214
5215 gcc_assert (opy == OP_TYPE_MEM6 && opx == OP_TYPE_MEM6);
5216 gcc_assert (!reload_completed);
5217 return OP_MEM_I1;
5218 }
5219
5220 /* Jump instructions types. Indexed by INSN_UID.
5221 The same rtl insn can be expanded into different asm instructions
5222 depending on the cc0_status. To properly determine type of jump
5223 instructions we scan instruction stream and map jumps types to this
5224 array. */
5225 static enum attr_type *sched_branch_type;
5226
5227 /* Return the type of the jump insn. */
5228 enum attr_type
5229 m68k_sched_branch_type (rtx insn)
5230 {
5231 enum attr_type type;
5232
5233 type = sched_branch_type[INSN_UID (insn)];
5234
5235 gcc_assert (type != 0);
5236
5237 return type;
5238 }
5239
5240 /* Data for ColdFire V4 index bypass.
5241 Producer modifies register that is used as index in consumer with
5242 specified scale. */
5243 static struct
5244 {
5245 /* Producer instruction. */
5246 rtx pro;
5247
5248 /* Consumer instruction. */
5249 rtx con;
5250
5251 /* Scale of indexed memory access within consumer.
5252 Or zero if bypass should not be effective at the moment. */
5253 int scale;
5254 } sched_cfv4_bypass_data;
5255
5256 /* An empty state that is used in m68k_sched_adjust_cost. */
5257 static state_t sched_adjust_cost_state;
5258
5259 /* Implement adjust_cost scheduler hook.
5260 Return adjusted COST of dependency LINK between DEF_INSN and INSN. */
5261 static int
5262 m68k_sched_adjust_cost (rtx insn, rtx link ATTRIBUTE_UNUSED, rtx def_insn,
5263 int cost)
5264 {
5265 int delay;
5266
5267 if (recog_memoized (def_insn) < 0
5268 || recog_memoized (insn) < 0)
5269 return cost;
5270
5271 if (sched_cfv4_bypass_data.scale == 1)
5272 /* Handle ColdFire V4 bypass for indexed address with 1x scale. */
5273 {
5274 /* haifa-sched.c: insn_cost () calls bypass_p () just before
5275 targetm.sched.adjust_cost (). Hence, we can be relatively sure
5276 that the data in sched_cfv4_bypass_data is up to date. */
5277 gcc_assert (sched_cfv4_bypass_data.pro == def_insn
5278 && sched_cfv4_bypass_data.con == insn);
5279
5280 if (cost < 3)
5281 cost = 3;
5282
5283 sched_cfv4_bypass_data.pro = NULL;
5284 sched_cfv4_bypass_data.con = NULL;
5285 sched_cfv4_bypass_data.scale = 0;
5286 }
5287 else
5288 gcc_assert (sched_cfv4_bypass_data.pro == NULL
5289 && sched_cfv4_bypass_data.con == NULL
5290 && sched_cfv4_bypass_data.scale == 0);
5291
5292 /* Don't try to issue INSN earlier than DFA permits.
5293 This is especially useful for instructions that write to memory,
5294 as their true dependence (default) latency is better to be set to 0
5295 to workaround alias analysis limitations.
5296 This is, in fact, a machine independent tweak, so, probably,
5297 it should be moved to haifa-sched.c: insn_cost (). */
5298 delay = min_insn_conflict_delay (sched_adjust_cost_state, def_insn, insn);
5299 if (delay > cost)
5300 cost = delay;
5301
5302 return cost;
5303 }
5304
5305 /* Return maximal number of insns that can be scheduled on a single cycle. */
5306 static int
5307 m68k_sched_issue_rate (void)
5308 {
5309 switch (m68k_sched_cpu)
5310 {
5311 case CPU_CFV1:
5312 case CPU_CFV2:
5313 case CPU_CFV3:
5314 return 1;
5315
5316 case CPU_CFV4:
5317 return 2;
5318
5319 default:
5320 gcc_unreachable ();
5321 return 0;
5322 }
5323 }
5324
5325 /* Maximal length of instruction for current CPU.
5326 E.g. it is 3 for any ColdFire core. */
5327 static int max_insn_size;
5328
5329 /* Data to model instruction buffer of CPU. */
5330 struct _sched_ib
5331 {
5332 /* True if instruction buffer model is modeled for current CPU. */
5333 bool enabled_p;
5334
5335 /* Size of the instruction buffer in words. */
5336 int size;
5337
5338 /* Number of filled words in the instruction buffer. */
5339 int filled;
5340
5341 /* Additional information about instruction buffer for CPUs that have
5342 a buffer of instruction records, rather then a plain buffer
5343 of instruction words. */
5344 struct _sched_ib_records
5345 {
5346 /* Size of buffer in records. */
5347 int n_insns;
5348
5349 /* Array to hold data on adjustements made to the size of the buffer. */
5350 int *adjust;
5351
5352 /* Index of the above array. */
5353 int adjust_index;
5354 } records;
5355
5356 /* An insn that reserves (marks empty) one word in the instruction buffer. */
5357 rtx insn;
5358 };
5359
5360 static struct _sched_ib sched_ib;
5361
5362 /* ID of memory unit. */
5363 static int sched_mem_unit_code;
5364
5365 /* Implementation of the targetm.sched.variable_issue () hook.
5366 It is called after INSN was issued. It returns the number of insns
5367 that can possibly get scheduled on the current cycle.
5368 It is used here to determine the effect of INSN on the instruction
5369 buffer. */
5370 static int
5371 m68k_sched_variable_issue (FILE *sched_dump ATTRIBUTE_UNUSED,
5372 int sched_verbose ATTRIBUTE_UNUSED,
5373 rtx insn, int can_issue_more)
5374 {
5375 int insn_size;
5376
5377 if (recog_memoized (insn) >= 0 && get_attr_type (insn) != TYPE_IGNORE)
5378 {
5379 switch (m68k_sched_cpu)
5380 {
5381 case CPU_CFV1:
5382 case CPU_CFV2:
5383 insn_size = sched_get_attr_size_int (insn);
5384 break;
5385
5386 case CPU_CFV3:
5387 insn_size = sched_get_attr_size_int (insn);
5388
5389 /* ColdFire V3 and V4 cores have instruction buffers that can
5390 accumulate up to 8 instructions regardless of instructions'
5391 sizes. So we should take care not to "prefetch" 24 one-word
5392 or 12 two-words instructions.
5393 To model this behavior we temporarily decrease size of the
5394 buffer by (max_insn_size - insn_size) for next 7 instructions. */
5395 {
5396 int adjust;
5397
5398 adjust = max_insn_size - insn_size;
5399 sched_ib.size -= adjust;
5400
5401 if (sched_ib.filled > sched_ib.size)
5402 sched_ib.filled = sched_ib.size;
5403
5404 sched_ib.records.adjust[sched_ib.records.adjust_index] = adjust;
5405 }
5406
5407 ++sched_ib.records.adjust_index;
5408 if (sched_ib.records.adjust_index == sched_ib.records.n_insns)
5409 sched_ib.records.adjust_index = 0;
5410
5411 /* Undo adjustement we did 7 instructions ago. */
5412 sched_ib.size
5413 += sched_ib.records.adjust[sched_ib.records.adjust_index];
5414
5415 break;
5416
5417 case CPU_CFV4:
5418 gcc_assert (!sched_ib.enabled_p);
5419 insn_size = 0;
5420 break;
5421
5422 default:
5423 gcc_unreachable ();
5424 }
5425
5426 gcc_assert (insn_size <= sched_ib.filled);
5427 --can_issue_more;
5428 }
5429 else if (GET_CODE (PATTERN (insn)) == ASM_INPUT
5430 || asm_noperands (PATTERN (insn)) >= 0)
5431 insn_size = sched_ib.filled;
5432 else
5433 insn_size = 0;
5434
5435 sched_ib.filled -= insn_size;
5436
5437 return can_issue_more;
5438 }
5439
5440 /* Return how many instructions should scheduler lookahead to choose the
5441 best one. */
5442 static int
5443 m68k_sched_first_cycle_multipass_dfa_lookahead (void)
5444 {
5445 return m68k_sched_issue_rate () - 1;
5446 }
5447
5448 /* Implementation of targetm.sched.md_init_global () hook.
5449 It is invoked once per scheduling pass and is used here
5450 to initialize scheduler constants. */
5451 static void
5452 m68k_sched_md_init_global (FILE *sched_dump ATTRIBUTE_UNUSED,
5453 int sched_verbose ATTRIBUTE_UNUSED,
5454 int n_insns ATTRIBUTE_UNUSED)
5455 {
5456 /* Init branch types. */
5457 {
5458 rtx insn;
5459
5460 sched_branch_type = XCNEWVEC (enum attr_type, get_max_uid () + 1);
5461
5462 for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
5463 {
5464 if (JUMP_P (insn))
5465 /* !!! FIXME: Implement real scan here. */
5466 sched_branch_type[INSN_UID (insn)] = TYPE_BCC;
5467 }
5468 }
5469
5470 #ifdef ENABLE_CHECKING
5471 /* Check that all instructions have DFA reservations and
5472 that all instructions can be issued from a clean state. */
5473 {
5474 rtx insn;
5475 state_t state;
5476
5477 state = alloca (state_size ());
5478
5479 for (insn = get_insns (); insn != NULL_RTX; insn = NEXT_INSN (insn))
5480 {
5481 if (INSN_P (insn) && recog_memoized (insn) >= 0)
5482 {
5483 gcc_assert (insn_has_dfa_reservation_p (insn));
5484
5485 state_reset (state);
5486 if (state_transition (state, insn) >= 0)
5487 gcc_unreachable ();
5488 }
5489 }
5490 }
5491 #endif
5492
5493 /* Setup target cpu. */
5494
5495 /* ColdFire V4 has a set of features to keep its instruction buffer full
5496 (e.g., a separate memory bus for instructions) and, hence, we do not model
5497 buffer for this CPU. */
5498 sched_ib.enabled_p = (m68k_sched_cpu != CPU_CFV4);
5499
5500 switch (m68k_sched_cpu)
5501 {
5502 case CPU_CFV4:
5503 sched_ib.filled = 0;
5504
5505 /* FALLTHRU */
5506
5507 case CPU_CFV1:
5508 case CPU_CFV2:
5509 max_insn_size = 3;
5510 sched_ib.records.n_insns = 0;
5511 sched_ib.records.adjust = NULL;
5512 break;
5513
5514 case CPU_CFV3:
5515 max_insn_size = 3;
5516 sched_ib.records.n_insns = 8;
5517 sched_ib.records.adjust = XNEWVEC (int, sched_ib.records.n_insns);
5518 break;
5519
5520 default:
5521 gcc_unreachable ();
5522 }
5523
5524 sched_mem_unit_code = get_cpu_unit_code ("cf_mem1");
5525
5526 sched_adjust_cost_state = xmalloc (state_size ());
5527 state_reset (sched_adjust_cost_state);
5528
5529 start_sequence ();
5530 emit_insn (gen_ib ());
5531 sched_ib.insn = get_insns ();
5532 end_sequence ();
5533 }
5534
5535 /* Scheduling pass is now finished. Free/reset static variables. */
5536 static void
5537 m68k_sched_md_finish_global (FILE *dump ATTRIBUTE_UNUSED,
5538 int verbose ATTRIBUTE_UNUSED)
5539 {
5540 sched_ib.insn = NULL;
5541
5542 free (sched_adjust_cost_state);
5543 sched_adjust_cost_state = NULL;
5544
5545 sched_mem_unit_code = 0;
5546
5547 free (sched_ib.records.adjust);
5548 sched_ib.records.adjust = NULL;
5549 sched_ib.records.n_insns = 0;
5550 max_insn_size = 0;
5551
5552 free (sched_branch_type);
5553 sched_branch_type = NULL;
5554 }
5555
5556 /* Implementation of targetm.sched.md_init () hook.
5557 It is invoked each time scheduler starts on the new block (basic block or
5558 extended basic block). */
5559 static void
5560 m68k_sched_md_init (FILE *sched_dump ATTRIBUTE_UNUSED,
5561 int sched_verbose ATTRIBUTE_UNUSED,
5562 int n_insns ATTRIBUTE_UNUSED)
5563 {
5564 switch (m68k_sched_cpu)
5565 {
5566 case CPU_CFV1:
5567 case CPU_CFV2:
5568 sched_ib.size = 6;
5569 break;
5570
5571 case CPU_CFV3:
5572 sched_ib.size = sched_ib.records.n_insns * max_insn_size;
5573
5574 memset (sched_ib.records.adjust, 0,
5575 sched_ib.records.n_insns * sizeof (*sched_ib.records.adjust));
5576 sched_ib.records.adjust_index = 0;
5577 break;
5578
5579 case CPU_CFV4:
5580 gcc_assert (!sched_ib.enabled_p);
5581 sched_ib.size = 0;
5582 break;
5583
5584 default:
5585 gcc_unreachable ();
5586 }
5587
5588 if (sched_ib.enabled_p)
5589 /* haifa-sched.c: schedule_block () calls advance_cycle () just before
5590 the first cycle. Workaround that. */
5591 sched_ib.filled = -2;
5592 }
5593
5594 /* Implementation of targetm.sched.dfa_pre_advance_cycle () hook.
5595 It is invoked just before current cycle finishes and is used here
5596 to track if instruction buffer got its two words this cycle. */
5597 static void
5598 m68k_sched_dfa_pre_advance_cycle (void)
5599 {
5600 if (!sched_ib.enabled_p)
5601 return;
5602
5603 if (!cpu_unit_reservation_p (curr_state, sched_mem_unit_code))
5604 {
5605 sched_ib.filled += 2;
5606
5607 if (sched_ib.filled > sched_ib.size)
5608 sched_ib.filled = sched_ib.size;
5609 }
5610 }
5611
5612 /* Implementation of targetm.sched.dfa_post_advance_cycle () hook.
5613 It is invoked just after new cycle begins and is used here
5614 to setup number of filled words in the instruction buffer so that
5615 instructions which won't have all their words prefetched would be
5616 stalled for a cycle. */
5617 static void
5618 m68k_sched_dfa_post_advance_cycle (void)
5619 {
5620 int i;
5621
5622 if (!sched_ib.enabled_p)
5623 return;
5624
5625 /* Setup number of prefetched instruction words in the instruction
5626 buffer. */
5627 i = max_insn_size - sched_ib.filled;
5628
5629 while (--i >= 0)
5630 {
5631 if (state_transition (curr_state, sched_ib.insn) >= 0)
5632 gcc_unreachable ();
5633 }
5634 }
5635
5636 /* Return X or Y (depending on OPX_P) operand of INSN,
5637 if it is an integer register, or NULL overwise. */
5638 static rtx
5639 sched_get_reg_operand (rtx insn, bool opx_p)
5640 {
5641 rtx op = NULL;
5642
5643 if (opx_p)
5644 {
5645 if (get_attr_opx_type (insn) == OPX_TYPE_RN)
5646 {
5647 op = sched_get_operand (insn, true);
5648 gcc_assert (op != NULL);
5649
5650 if (!reload_completed && !REG_P (op))
5651 return NULL;
5652 }
5653 }
5654 else
5655 {
5656 if (get_attr_opy_type (insn) == OPY_TYPE_RN)
5657 {
5658 op = sched_get_operand (insn, false);
5659 gcc_assert (op != NULL);
5660
5661 if (!reload_completed && !REG_P (op))
5662 return NULL;
5663 }
5664 }
5665
5666 return op;
5667 }
5668
5669 /* Return true, if X or Y (depending on OPX_P) operand of INSN
5670 is a MEM. */
5671 static bool
5672 sched_mem_operand_p (rtx insn, bool opx_p)
5673 {
5674 switch (sched_get_opxy_mem_type (insn, opx_p))
5675 {
5676 case OP_TYPE_MEM1:
5677 case OP_TYPE_MEM6:
5678 return true;
5679
5680 default:
5681 return false;
5682 }
5683 }
5684
5685 /* Return X or Y (depending on OPX_P) operand of INSN,
5686 if it is a MEM, or NULL overwise. */
5687 static rtx
5688 sched_get_mem_operand (rtx insn, bool must_read_p, bool must_write_p)
5689 {
5690 bool opx_p;
5691 bool opy_p;
5692
5693 opx_p = false;
5694 opy_p = false;
5695
5696 if (must_read_p)
5697 {
5698 opx_p = true;
5699 opy_p = true;
5700 }
5701
5702 if (must_write_p)
5703 {
5704 opx_p = true;
5705 opy_p = false;
5706 }
5707
5708 if (opy_p && sched_mem_operand_p (insn, false))
5709 return sched_get_operand (insn, false);
5710
5711 if (opx_p && sched_mem_operand_p (insn, true))
5712 return sched_get_operand (insn, true);
5713
5714 gcc_unreachable ();
5715 return NULL;
5716 }
5717
5718 /* Return non-zero if PRO modifies register used as part of
5719 address in CON. */
5720 int
5721 m68k_sched_address_bypass_p (rtx pro, rtx con)
5722 {
5723 rtx pro_x;
5724 rtx con_mem_read;
5725
5726 pro_x = sched_get_reg_operand (pro, true);
5727 if (pro_x == NULL)
5728 return 0;
5729
5730 con_mem_read = sched_get_mem_operand (con, true, false);
5731 gcc_assert (con_mem_read != NULL);
5732
5733 if (reg_mentioned_p (pro_x, con_mem_read))
5734 return 1;
5735
5736 return 0;
5737 }
5738
5739 /* Helper function for m68k_sched_indexed_address_bypass_p.
5740 if PRO modifies register used as index in CON,
5741 return scale of indexed memory access in CON. Return zero overwise. */
5742 static int
5743 sched_get_indexed_address_scale (rtx pro, rtx con)
5744 {
5745 rtx reg;
5746 rtx mem;
5747 struct m68k_address address;
5748
5749 reg = sched_get_reg_operand (pro, true);
5750 if (reg == NULL)
5751 return 0;
5752
5753 mem = sched_get_mem_operand (con, true, false);
5754 gcc_assert (mem != NULL && MEM_P (mem));
5755
5756 if (!m68k_decompose_address (GET_MODE (mem), XEXP (mem, 0), reload_completed,
5757 &address))
5758 gcc_unreachable ();
5759
5760 if (REGNO (reg) == REGNO (address.index))
5761 {
5762 gcc_assert (address.scale != 0);
5763 return address.scale;
5764 }
5765
5766 return 0;
5767 }
5768
5769 /* Return non-zero if PRO modifies register used
5770 as index with scale 2 or 4 in CON. */
5771 int
5772 m68k_sched_indexed_address_bypass_p (rtx pro, rtx con)
5773 {
5774 gcc_assert (sched_cfv4_bypass_data.pro == NULL
5775 && sched_cfv4_bypass_data.con == NULL
5776 && sched_cfv4_bypass_data.scale == 0);
5777
5778 switch (sched_get_indexed_address_scale (pro, con))
5779 {
5780 case 1:
5781 /* We can't have a variable latency bypass, so
5782 remember to adjust the insn cost in adjust_cost hook. */
5783 sched_cfv4_bypass_data.pro = pro;
5784 sched_cfv4_bypass_data.con = con;
5785 sched_cfv4_bypass_data.scale = 1;
5786 return 0;
5787
5788 case 2:
5789 case 4:
5790 return 1;
5791
5792 default:
5793 return 0;
5794 }
5795 }