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