OSDN Git Service

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