OSDN Git Service

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