Merge from mainline (gomp-merge-2005-02-26).
[official-gcc.git] / gcc / config / m68k / m68k.c
blobe3ac6fada8578960326f9137a022e071a72d5383
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
4 Free Software Foundation, Inc.
6 This file is part of GCC.
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.
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.
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, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
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"
47 enum reg_class regno_reg_class[] =
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
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
73 /* Structure describing stack frame layout. */
74 struct m68k_frame
76 /* Stack pointer to frame pointer offset. */
77 HOST_WIDE_INT offset;
79 /* Offset of FPU registers. */
80 HOST_WIDE_INT foffset;
82 /* Frame size in bytes (rounded up). */
83 HOST_WIDE_INT size;
85 /* Data and address register. */
86 int reg_no;
87 unsigned int reg_mask;
88 unsigned int reg_rev_mask;
90 /* FPU registers. */
91 int fpu_no;
92 unsigned int fpu_mask;
93 unsigned int fpu_rev_mask;
95 /* Offsets relative to ARG_POINTER. */
96 HOST_WIDE_INT frame_pointer_offset;
97 HOST_WIDE_INT stack_pointer_offset;
99 /* Function which the above information refers to. */
100 int funcdef_no;
103 /* Current frame information calculated by m68k_compute_frame_layout(). */
104 static struct m68k_frame current_frame;
106 static rtx find_addr_reg (rtx);
107 static const char *singlemove_string (rtx *);
108 static void m68k_output_function_prologue (FILE *, HOST_WIDE_INT);
109 static void m68k_output_function_epilogue (FILE *, HOST_WIDE_INT);
110 #ifdef M68K_TARGET_COFF
111 static void m68k_coff_asm_named_section (const char *, unsigned int, tree);
112 #endif /* M68K_TARGET_COFF */
113 static void m68k_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
114 HOST_WIDE_INT, tree);
115 static rtx m68k_struct_value_rtx (tree, int);
116 static bool m68k_interrupt_function_p (tree func);
117 static tree m68k_handle_fndecl_attribute (tree *node, tree name,
118 tree args, int flags,
119 bool *no_add_attrs);
120 static void m68k_compute_frame_layout (void);
121 static bool m68k_save_reg (unsigned int regno, bool interrupt_handler);
122 static int const_int_cost (rtx);
123 static bool m68k_rtx_costs (rtx, int, int, int *);
126 /* Specify the identification number of the library being built */
127 const char *m68k_library_id_string;
129 /* Nonzero if the last compare/test insn had FP operands. The
130 sCC expanders peek at this to determine what to do for the
131 68060, which has no fsCC instructions. */
132 int m68k_last_compare_had_fp_operands;
134 /* Initialize the GCC target structure. */
136 #if INT_OP_GROUP == INT_OP_DOT_WORD
137 #undef TARGET_ASM_ALIGNED_HI_OP
138 #define TARGET_ASM_ALIGNED_HI_OP "\t.word\t"
139 #endif
141 #if INT_OP_GROUP == INT_OP_NO_DOT
142 #undef TARGET_ASM_BYTE_OP
143 #define TARGET_ASM_BYTE_OP "\tbyte\t"
144 #undef TARGET_ASM_ALIGNED_HI_OP
145 #define TARGET_ASM_ALIGNED_HI_OP "\tshort\t"
146 #undef TARGET_ASM_ALIGNED_SI_OP
147 #define TARGET_ASM_ALIGNED_SI_OP "\tlong\t"
148 #endif
150 #if INT_OP_GROUP == INT_OP_DC
151 #undef TARGET_ASM_BYTE_OP
152 #define TARGET_ASM_BYTE_OP "\tdc.b\t"
153 #undef TARGET_ASM_ALIGNED_HI_OP
154 #define TARGET_ASM_ALIGNED_HI_OP "\tdc.w\t"
155 #undef TARGET_ASM_ALIGNED_SI_OP
156 #define TARGET_ASM_ALIGNED_SI_OP "\tdc.l\t"
157 #endif
159 #undef TARGET_ASM_UNALIGNED_HI_OP
160 #define TARGET_ASM_UNALIGNED_HI_OP TARGET_ASM_ALIGNED_HI_OP
161 #undef TARGET_ASM_UNALIGNED_SI_OP
162 #define TARGET_ASM_UNALIGNED_SI_OP TARGET_ASM_ALIGNED_SI_OP
164 #undef TARGET_ASM_FUNCTION_PROLOGUE
165 #define TARGET_ASM_FUNCTION_PROLOGUE m68k_output_function_prologue
166 #undef TARGET_ASM_FUNCTION_EPILOGUE
167 #define TARGET_ASM_FUNCTION_EPILOGUE m68k_output_function_epilogue
169 #undef TARGET_ASM_OUTPUT_MI_THUNK
170 #define TARGET_ASM_OUTPUT_MI_THUNK m68k_output_mi_thunk
171 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
172 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK default_can_output_mi_thunk_no_vcall
174 #undef TARGET_ASM_FILE_START_APP_OFF
175 #define TARGET_ASM_FILE_START_APP_OFF true
177 #undef TARGET_RTX_COSTS
178 #define TARGET_RTX_COSTS m68k_rtx_costs
180 #undef TARGET_ATTRIBUTE_TABLE
181 #define TARGET_ATTRIBUTE_TABLE m68k_attribute_table
183 #undef TARGET_PROMOTE_PROTOTYPES
184 #define TARGET_PROMOTE_PROTOTYPES hook_bool_tree_true
186 #undef TARGET_STRUCT_VALUE_RTX
187 #define TARGET_STRUCT_VALUE_RTX m68k_struct_value_rtx
189 static const struct attribute_spec m68k_attribute_table[] =
191 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
192 { "interrupt_handler", 0, 0, true, false, false, m68k_handle_fndecl_attribute },
193 { NULL, 0, 0, false, false, false, NULL }
196 struct gcc_target targetm = TARGET_INITIALIZER;
198 /* Sometimes certain combinations of command options do not make
199 sense on a particular target machine. You can define a macro
200 `OVERRIDE_OPTIONS' to take account of this. This macro, if
201 defined, is executed once just after all the command options have
202 been parsed.
204 Don't use this macro to turn on various extra optimizations for
205 `-O'. That is what `OPTIMIZATION_OPTIONS' is for. */
207 void
208 override_options (void)
210 /* Library identification */
211 if (m68k_library_id_string)
213 int id;
215 if (! TARGET_ID_SHARED_LIBRARY)
216 error ("-mshared-library-id= specified without -mid-shared-library");
217 id = atoi (m68k_library_id_string);
218 if (id < 0 || id > MAX_LIBRARY_ID)
219 error ("-mshared-library-id=%d is not between 0 and %d", id, MAX_LIBRARY_ID);
221 /* From now on, m68k_library_id_string will contain the library offset. */
222 asprintf ((char **)&m68k_library_id_string, "%d", (id * -4) - 4);
224 else
225 /* If TARGET_ID_SHARED_LIBRARY is enabled, this will point to the
226 current library. */
227 m68k_library_id_string = "_current_shared_library_a5_offset_";
229 /* Sanity check to ensure that msep-data and mid-sahred-library are not
230 * both specified together. Doing so simply doesn't make sense.
232 if (TARGET_SEP_DATA && TARGET_ID_SHARED_LIBRARY)
233 error ("cannot specify both -msep-data and -mid-shared-library");
235 /* If we're generating code for a separate A5 relative data segment,
236 * we've got to enable -fPIC as well. This might be relaxable to
237 * -fpic but it hasn't been tested properly.
239 if (TARGET_SEP_DATA || TARGET_ID_SHARED_LIBRARY)
240 flag_pic = 2;
242 /* -fPIC uses 32-bit pc-relative displacements, which don't exist
243 until the 68020. */
244 if (!TARGET_68020 && !TARGET_COLDFIRE && (flag_pic == 2))
245 error("-fPIC is not currently supported on the 68000 or 68010\n");
247 /* ??? A historic way of turning on pic, or is this intended to
248 be an embedded thing that doesn't have the same name binding
249 significance that it does on hosted ELF systems? */
250 if (TARGET_PCREL && flag_pic == 0)
251 flag_pic = 1;
253 /* Turn off function cse if we are doing PIC. We always want function call
254 to be done as `bsr foo@PLTPC', so it will force the assembler to create
255 the PLT entry for `foo'. Doing function cse will cause the address of
256 `foo' to be loaded into a register, which is exactly what we want to
257 avoid when we are doing PIC on svr4 m68k. */
258 if (flag_pic)
259 flag_no_function_cse = 1;
261 SUBTARGET_OVERRIDE_OPTIONS;
264 /* Return nonzero if FUNC is an interrupt function as specified by the
265 "interrupt_handler" attribute. */
266 static bool
267 m68k_interrupt_function_p(tree func)
269 tree a;
271 if (TREE_CODE (func) != FUNCTION_DECL)
272 return false;
274 a = lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (func));
275 return (a != NULL_TREE);
278 /* Handle an attribute requiring a FUNCTION_DECL; arguments as in
279 struct attribute_spec.handler. */
280 static tree
281 m68k_handle_fndecl_attribute (tree *node, tree name,
282 tree args ATTRIBUTE_UNUSED,
283 int flags ATTRIBUTE_UNUSED,
284 bool *no_add_attrs)
286 if (TREE_CODE (*node) != FUNCTION_DECL)
288 warning ("%qs attribute only applies to functions",
289 IDENTIFIER_POINTER (name));
290 *no_add_attrs = true;
293 return NULL_TREE;
296 static void
297 m68k_compute_frame_layout (void)
299 int regno, saved;
300 unsigned int mask, rmask;
301 bool interrupt_handler = m68k_interrupt_function_p (current_function_decl);
303 /* Only compute the frame once per function.
304 Don't cache information until reload has been completed. */
305 if (current_frame.funcdef_no == current_function_funcdef_no
306 && reload_completed)
307 return;
309 current_frame.size = (get_frame_size () + 3) & -4;
311 mask = rmask = saved = 0;
312 for (regno = 0; regno < 16; regno++)
313 if (m68k_save_reg (regno, interrupt_handler))
315 mask |= 1 << regno;
316 rmask |= 1 << (15 - regno);
317 saved++;
319 current_frame.offset = saved * 4;
320 current_frame.reg_no = saved;
321 current_frame.reg_mask = mask;
322 current_frame.reg_rev_mask = rmask;
324 current_frame.foffset = 0;
325 mask = rmask = saved = 0;
326 if (TARGET_68881 /* || TARGET_CFV4E */)
328 for (regno = 16; regno < 24; regno++)
329 if (m68k_save_reg (regno, interrupt_handler))
331 mask |= 1 << (regno - 16);
332 rmask |= 1 << (23 - regno);
333 saved++;
335 current_frame.foffset = saved * 12 /* (TARGET_CFV4E ? 8 : 12) */;
336 current_frame.offset += current_frame.foffset;
338 current_frame.fpu_no = saved;
339 current_frame.fpu_mask = mask;
340 current_frame.fpu_rev_mask = rmask;
342 /* Remember what function this frame refers to. */
343 current_frame.funcdef_no = current_function_funcdef_no;
346 HOST_WIDE_INT
347 m68k_initial_elimination_offset (int from, int to)
349 /* FIXME: The correct offset to compute here would appear to be
350 (frame_pointer_needed ? -UNITS_PER_WORD * 2 : -UNITS_PER_WORD);
351 but for some obscure reason, this must be 0 to get correct code. */
352 if (from == ARG_POINTER_REGNUM && to == FRAME_POINTER_REGNUM)
353 return 0;
355 m68k_compute_frame_layout ();
357 if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
358 return current_frame.offset + current_frame.size + (frame_pointer_needed ? -UNITS_PER_WORD * 2 : -UNITS_PER_WORD);
359 else if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
360 return current_frame.offset + current_frame.size;
362 abort();
365 /* Refer to the array `regs_ever_live' to determine which registers
366 to save; `regs_ever_live[I]' is nonzero if register number I
367 is ever used in the function. This function is responsible for
368 knowing which registers should not be saved even if used.
369 Return true if we need to save REGNO. */
371 static bool
372 m68k_save_reg (unsigned int regno, bool interrupt_handler)
374 if (flag_pic && regno == PIC_OFFSET_TABLE_REGNUM)
376 if (current_function_uses_pic_offset_table)
377 return true;
378 if (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)
379 return true;
382 if (current_function_calls_eh_return)
384 unsigned int i;
385 for (i = 0; ; i++)
387 unsigned int test = EH_RETURN_DATA_REGNO (i);
388 if (test == INVALID_REGNUM)
389 break;
390 if (test == regno)
391 return true;
395 /* Fixed regs we never touch. */
396 if (fixed_regs[regno])
397 return false;
399 /* The frame pointer (if it is such) is handled specially. */
400 if (regno == FRAME_POINTER_REGNUM && frame_pointer_needed)
401 return false;
403 /* Interrupt handlers must also save call_used_regs
404 if they are live or when calling nested functions. */
405 if (interrupt_handler)
407 if (regs_ever_live[regno])
408 return true;
410 if (!current_function_is_leaf && call_used_regs[regno])
411 return true;
414 /* Never need to save registers that aren't touched. */
415 if (!regs_ever_live[regno])
416 return false;
418 /* Otherwise save everything that isn't call-clobbered. */
419 return !call_used_regs[regno];
422 /* This function generates the assembly code for function entry.
423 STREAM is a stdio stream to output the code to.
424 SIZE is an int: how many units of temporary storage to allocate. */
426 static void
427 m68k_output_function_prologue (FILE *stream, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
429 HOST_WIDE_INT fsize_with_regs;
430 HOST_WIDE_INT cfa_offset = INCOMING_FRAME_SP_OFFSET;
432 m68k_compute_frame_layout();
434 /* If the stack limit is a symbol, we can check it here,
435 before actually allocating the space. */
436 if (current_function_limit_stack
437 && GET_CODE (stack_limit_rtx) == SYMBOL_REF)
438 asm_fprintf (stream, "\tcmp" ASM_DOT "l %I%s+%wd,%Rsp\n\ttrapcs\n",
439 XSTR (stack_limit_rtx, 0), current_frame.size + 4);
441 /* On ColdFire add register save into initial stack frame setup, if possible. */
442 fsize_with_regs = current_frame.size;
443 if (TARGET_COLDFIRE && current_frame.reg_no > 2)
444 fsize_with_regs += current_frame.reg_no * 4;
446 if (frame_pointer_needed)
448 if (current_frame.size == 0 && TARGET_68040)
449 /* on the 68040, pea + move is faster than link.w 0 */
450 fprintf (stream, MOTOROLA ?
451 "\tpea (%s)\n\tmove.l %s,%s\n" :
452 "\tpea %s@\n\tmovel %s,%s\n",
453 M68K_REGNAME(FRAME_POINTER_REGNUM),
454 M68K_REGNAME(STACK_POINTER_REGNUM),
455 M68K_REGNAME(FRAME_POINTER_REGNUM));
456 else if (fsize_with_regs < 0x8000)
457 asm_fprintf (stream, "\tlink" ASM_DOTW " %s,%I%wd\n",
458 M68K_REGNAME(FRAME_POINTER_REGNUM), -fsize_with_regs);
459 else if (TARGET_68020)
460 asm_fprintf (stream, "\tlink" ASM_DOTL " %s,%I%wd\n",
461 M68K_REGNAME(FRAME_POINTER_REGNUM), -fsize_with_regs);
462 else
463 /* Adding negative number is faster on the 68040. */
464 asm_fprintf (stream, "\tlink" ASM_DOTW " %s,%I0\n"
465 "\tadd" ASM_DOT "l %I%wd,%Rsp\n",
466 M68K_REGNAME(FRAME_POINTER_REGNUM), -fsize_with_regs);
468 if (dwarf2out_do_frame ())
470 char *l;
471 l = (char *) dwarf2out_cfi_label ();
472 cfa_offset += 4;
473 dwarf2out_reg_save (l, FRAME_POINTER_REGNUM, -cfa_offset);
474 dwarf2out_def_cfa (l, FRAME_POINTER_REGNUM, cfa_offset);
475 cfa_offset += current_frame.size;
478 else if (fsize_with_regs) /* !frame_pointer_needed */
480 if (fsize_with_regs < 0x8000)
482 if (fsize_with_regs <= 8)
484 if (!TARGET_COLDFIRE)
485 asm_fprintf (stream, "\tsubq" ASM_DOT "w %I%wd,%Rsp\n",
486 fsize_with_regs);
487 else
488 asm_fprintf (stream, "\tsubq" ASM_DOT "l %I%wd,%Rsp\n",
489 fsize_with_regs);
491 else if (fsize_with_regs <= 16 && TARGET_CPU32)
492 /* On the CPU32 it is faster to use two subqw instructions to
493 subtract a small integer (8 < N <= 16) to a register. */
494 asm_fprintf (stream,
495 "\tsubq" ASM_DOT "w %I8,%Rsp\n"
496 "\tsubq" ASM_DOT "w %I%wd,%Rsp\n",
497 fsize_with_regs - 8);
498 else if (TARGET_68040)
499 /* Adding negative number is faster on the 68040. */
500 asm_fprintf (stream, "\tadd" ASM_DOT "w %I%wd,%Rsp\n",
501 -fsize_with_regs);
502 else
503 asm_fprintf (stream, MOTOROLA ?
504 "\tlea (%wd,%Rsp),%Rsp\n" :
505 "\tlea %Rsp@(%wd),%Rsp\n",
506 -fsize_with_regs);
508 else /* fsize_with_regs >= 0x8000 */
509 asm_fprintf (stream, "\tadd" ASM_DOT "l %I%wd,%Rsp\n", -fsize_with_regs);
511 if (dwarf2out_do_frame ())
513 cfa_offset += current_frame.size + 4;
514 dwarf2out_def_cfa ("", STACK_POINTER_REGNUM, cfa_offset);
516 } /* !frame_pointer_needed */
518 if (current_frame.fpu_mask)
520 asm_fprintf (stream, MOTOROLA ?
521 "\tfmovm %I0x%x,-(%Rsp)\n" :
522 "\tfmovem %I0x%x,%Rsp@-\n",
523 current_frame.fpu_mask);
525 if (dwarf2out_do_frame ())
527 char *l = (char *) dwarf2out_cfi_label ();
528 int n_regs, regno;
530 cfa_offset += current_frame.fpu_no * 12;
531 if (! frame_pointer_needed)
532 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
533 for (regno = 16, n_regs = 0; regno < 24; regno++)
534 if (current_frame.fpu_mask & (1 << (regno - 16)))
535 dwarf2out_reg_save (l, regno, -cfa_offset + n_regs++ * 12);
539 /* If the stack limit is not a symbol, check it here.
540 This has the disadvantage that it may be too late... */
541 if (current_function_limit_stack)
543 if (REG_P (stack_limit_rtx))
544 asm_fprintf (stream, "\tcmp" ASM_DOT "l %s,%Rsp\n\ttrapcs\n",
545 M68K_REGNAME(REGNO (stack_limit_rtx)));
546 else if (GET_CODE (stack_limit_rtx) != SYMBOL_REF)
547 warning ("stack limit expression is not supported");
550 if (current_frame.reg_no <= 2)
552 /* Store each separately in the same order moveml uses.
553 Using two movel instructions instead of a single moveml
554 is about 15% faster for the 68020 and 68030 at no expense
555 in code size. */
557 int i;
559 for (i = 0; i < 16; i++)
560 if (current_frame.reg_rev_mask & (1 << i))
562 asm_fprintf (stream, MOTOROLA ?
563 "\t%Omove.l %s,-(%Rsp)\n" :
564 "\tmovel %s,%Rsp@-\n",
565 M68K_REGNAME(15 - i));
566 if (dwarf2out_do_frame ())
568 char *l = (char *) dwarf2out_cfi_label ();
570 cfa_offset += 4;
571 if (! frame_pointer_needed)
572 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
573 dwarf2out_reg_save (l, 15 - i, -cfa_offset);
577 else if (current_frame.reg_rev_mask)
579 if (TARGET_COLDFIRE)
580 /* The ColdFire does not support the predecrement form of the
581 MOVEM instruction, so we must adjust the stack pointer and
582 then use the plain address register indirect mode.
583 The required register save space was combined earlier with
584 the fsize_with_regs amount. */
586 asm_fprintf (stream, MOTOROLA ?
587 "\tmovm.l %I0x%x,(%Rsp)\n" :
588 "\tmoveml %I0x%x,%Rsp@\n",
589 current_frame.reg_mask);
590 else
591 asm_fprintf (stream, MOTOROLA ?
592 "\tmovm.l %I0x%x,-(%Rsp)\n" :
593 "\tmoveml %I0x%x,%Rsp@-\n",
594 current_frame.reg_rev_mask);
595 if (dwarf2out_do_frame ())
597 char *l = (char *) dwarf2out_cfi_label ();
598 int n_regs, regno;
600 cfa_offset += current_frame.reg_no * 4;
601 if (! frame_pointer_needed)
602 dwarf2out_def_cfa (l, STACK_POINTER_REGNUM, cfa_offset);
603 for (regno = 0, n_regs = 0; regno < 16; regno++)
604 if (current_frame.reg_mask & (1 << regno))
605 dwarf2out_reg_save (l, regno, -cfa_offset + n_regs++ * 4);
608 if (!TARGET_SEP_DATA && flag_pic &&
609 (current_function_uses_pic_offset_table ||
610 (!current_function_is_leaf && TARGET_ID_SHARED_LIBRARY)))
612 if (TARGET_ID_SHARED_LIBRARY)
614 asm_fprintf (stream, "\tmovel %s@(%s), %s\n",
615 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM),
616 m68k_library_id_string,
617 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM));
619 else
621 if (MOTOROLA)
622 asm_fprintf (stream, "\t%Olea (%Rpc, %U_GLOBAL_OFFSET_TABLE_@GOTPC), %s\n",
623 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM));
624 else
626 asm_fprintf (stream, "\tmovel %I%U_GLOBAL_OFFSET_TABLE_, %s\n",
627 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM));
628 asm_fprintf (stream, "\tlea %Rpc@(0,%s:l),%s\n",
629 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM),
630 M68K_REGNAME(PIC_OFFSET_TABLE_REGNUM));
636 /* Return true if this function's epilogue can be output as RTL. */
638 bool
639 use_return_insn (void)
641 if (!reload_completed || frame_pointer_needed || get_frame_size () != 0)
642 return false;
644 /* We can output the epilogue as RTL only if no registers need to be
645 restored. */
646 m68k_compute_frame_layout();
647 return current_frame.reg_no ? false : true;
650 /* This function generates the assembly code for function exit,
651 on machines that need it.
653 The function epilogue should not depend on the current stack pointer!
654 It should use the frame pointer only, if there is a frame pointer.
655 This is mandatory because of alloca; we also take advantage of it to
656 omit stack adjustments before returning. */
658 static void
659 m68k_output_function_epilogue (FILE *stream, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
661 HOST_WIDE_INT fsize, fsize_with_regs;
662 bool big = false;
663 bool restore_from_sp = false;
664 rtx insn = get_last_insn ();
666 m68k_compute_frame_layout();
668 /* If the last insn was a BARRIER, we don't have to write any code. */
669 if (GET_CODE (insn) == NOTE)
670 insn = prev_nonnote_insn (insn);
671 if (insn && GET_CODE (insn) == BARRIER)
673 /* Output just a no-op so that debuggers don't get confused
674 about which function the pc is in at this address. */
675 fprintf (stream, "\tnop\n");
676 return;
679 #ifdef FUNCTION_EXTRA_EPILOGUE
680 FUNCTION_EXTRA_EPILOGUE (stream, size);
681 #endif
683 fsize = current_frame.size;
685 /* FIXME : leaf_function_p below is too strong.
686 What we really need to know there is if there could be pending
687 stack adjustment needed at that point. */
688 restore_from_sp = ! frame_pointer_needed
689 || (! current_function_calls_alloca && leaf_function_p ());
691 /* fsize_with_regs is the size we need to adjust the sp when
692 popping the frame. */
693 fsize_with_regs = fsize;
695 /* Because the ColdFire doesn't support moveml with
696 complex address modes, we must adjust the stack manually
697 after restoring registers. When the frame pointer isn't used,
698 we can merge movem adjustment into frame unlinking
699 made immediately after it. */
700 if (TARGET_COLDFIRE && restore_from_sp && (current_frame.reg_no > 2))
701 fsize_with_regs += current_frame.reg_no * 4;
703 if (current_frame.offset + fsize >= 0x8000
704 && ! restore_from_sp
705 && (current_frame.reg_mask || current_frame.fpu_mask))
707 /* Because the ColdFire doesn't support moveml with
708 complex address modes we make an extra correction here. */
709 if (TARGET_COLDFIRE)
710 fsize += current_frame.offset;
712 asm_fprintf (stream, "\t%Omove" ASM_DOT "l %I%wd,%Ra1\n", -fsize);
713 fsize = 0, big = true;
715 if (current_frame.reg_no <= 2)
717 /* Restore each separately in the same order moveml does.
718 Using two movel instructions instead of a single moveml
719 is about 15% faster for the 68020 and 68030 at no expense
720 in code size. */
722 int i;
723 HOST_WIDE_INT offset = current_frame.offset + fsize;
725 for (i = 0; i < 16; i++)
726 if (current_frame.reg_mask & (1 << i))
728 if (big)
730 if (MOTOROLA)
731 asm_fprintf (stream, "\t%Omove.l -%wd(%s,%Ra1.l),%s\n",
732 offset,
733 M68K_REGNAME(FRAME_POINTER_REGNUM),
734 M68K_REGNAME(i));
735 else
736 asm_fprintf (stream, "\tmovel %s@(-%wd,%Ra1:l),%s\n",
737 M68K_REGNAME(FRAME_POINTER_REGNUM),
738 offset,
739 M68K_REGNAME(i));
741 else if (restore_from_sp)
742 asm_fprintf (stream, MOTOROLA ?
743 "\t%Omove.l (%Rsp)+,%s\n" :
744 "\tmovel %Rsp@+,%s\n",
745 M68K_REGNAME(i));
746 else
748 if (MOTOROLA)
749 asm_fprintf (stream, "\t%Omove.l -%wd(%s),%s\n",
750 offset,
751 M68K_REGNAME(FRAME_POINTER_REGNUM),
752 M68K_REGNAME(i));
753 else
754 asm_fprintf (stream, "\tmovel %s@(-%wd),%s\n",
755 M68K_REGNAME(FRAME_POINTER_REGNUM),
756 offset,
757 M68K_REGNAME(i));
759 offset -= 4;
762 else if (current_frame.reg_mask)
764 /* The ColdFire requires special handling due to its limited moveml insn. */
765 if (TARGET_COLDFIRE)
767 if (big)
769 asm_fprintf (stream, "\tadd" ASM_DOT "l %s,%Ra1\n",
770 M68K_REGNAME(FRAME_POINTER_REGNUM));
771 asm_fprintf (stream, MOTOROLA ?
772 "\tmovm.l (%Ra1),%I0x%x\n" :
773 "\tmoveml %Ra1@,%I0x%x\n",
774 current_frame.reg_mask);
776 else if (restore_from_sp)
777 asm_fprintf (stream, MOTOROLA ?
778 "\tmovm.l (%Rsp),%I0x%x\n" :
779 "\tmoveml %Rsp@,%I0x%x\n",
780 current_frame.reg_mask);
781 else
783 if (MOTOROLA)
784 asm_fprintf (stream, "\tmovm.l -%wd(%s),%I0x%x\n",
785 current_frame.offset + fsize,
786 M68K_REGNAME(FRAME_POINTER_REGNUM),
787 current_frame.reg_mask);
788 else
789 asm_fprintf (stream, "\tmoveml %s@(-%wd),%I0x%x\n",
790 M68K_REGNAME(FRAME_POINTER_REGNUM),
791 current_frame.offset + fsize,
792 current_frame.reg_mask);
795 else /* !TARGET_COLDFIRE */
797 if (big)
799 if (MOTOROLA)
800 asm_fprintf (stream, "\tmovm.l -%wd(%s,%Ra1.l),%I0x%x\n",
801 current_frame.offset + fsize,
802 M68K_REGNAME(FRAME_POINTER_REGNUM),
803 current_frame.reg_mask);
804 else
805 asm_fprintf (stream, "\tmoveml %s@(-%wd,%Ra1:l),%I0x%x\n",
806 M68K_REGNAME(FRAME_POINTER_REGNUM),
807 current_frame.offset + fsize,
808 current_frame.reg_mask);
810 else if (restore_from_sp)
812 asm_fprintf (stream, MOTOROLA ?
813 "\tmovm.l (%Rsp)+,%I0x%x\n" :
814 "\tmoveml %Rsp@+,%I0x%x\n",
815 current_frame.reg_mask);
817 else
819 if (MOTOROLA)
820 asm_fprintf (stream, "\tmovm.l -%wd(%s),%I0x%x\n",
821 current_frame.offset + fsize,
822 M68K_REGNAME(FRAME_POINTER_REGNUM),
823 current_frame.reg_mask);
824 else
825 asm_fprintf (stream, "\tmoveml %s@(-%wd),%I0x%x\n",
826 M68K_REGNAME(FRAME_POINTER_REGNUM),
827 current_frame.offset + fsize,
828 current_frame.reg_mask);
832 if (current_frame.fpu_rev_mask)
834 if (big)
836 if (MOTOROLA)
837 asm_fprintf (stream, "\tfmovm -%wd(%s,%Ra1.l),%I0x%x\n",
838 current_frame.foffset + fsize,
839 M68K_REGNAME(FRAME_POINTER_REGNUM),
840 current_frame.fpu_rev_mask);
841 else
842 asm_fprintf (stream, "\tfmovem %s@(-%wd,%Ra1:l),%I0x%x\n",
843 M68K_REGNAME(FRAME_POINTER_REGNUM),
844 current_frame.foffset + fsize,
845 current_frame.fpu_rev_mask);
847 else if (restore_from_sp)
849 if (MOTOROLA)
850 asm_fprintf (stream, "\tfmovm (%Rsp)+,%I0x%x\n",
851 current_frame.fpu_rev_mask);
852 else
853 asm_fprintf (stream, "\tfmovem %Rsp@+,%I0x%x\n",
854 current_frame.fpu_rev_mask);
856 else
858 if (MOTOROLA)
859 asm_fprintf (stream, "\tfmovm -%wd(%s),%I0x%x\n",
860 current_frame.foffset + fsize,
861 M68K_REGNAME(FRAME_POINTER_REGNUM),
862 current_frame.fpu_rev_mask);
863 else
864 asm_fprintf (stream, "\tfmovem %s@(-%wd),%I0x%x\n",
865 M68K_REGNAME(FRAME_POINTER_REGNUM),
866 current_frame.foffset + fsize,
867 current_frame.fpu_rev_mask);
870 if (frame_pointer_needed)
871 fprintf (stream, "\tunlk %s\n", M68K_REGNAME(FRAME_POINTER_REGNUM));
872 else if (fsize_with_regs)
874 if (fsize_with_regs <= 8)
876 if (!TARGET_COLDFIRE)
877 asm_fprintf (stream, "\taddq" ASM_DOT "w %I%wd,%Rsp\n",
878 fsize_with_regs);
879 else
880 asm_fprintf (stream, "\taddq" ASM_DOT "l %I%wd,%Rsp\n",
881 fsize_with_regs);
883 else if (fsize_with_regs <= 16 && TARGET_CPU32)
885 /* On the CPU32 it is faster to use two addqw instructions to
886 add a small integer (8 < N <= 16) to a register. */
887 asm_fprintf (stream, "\taddq" ASM_DOT "w %I8,%Rsp\n"
888 "\taddq" ASM_DOT "w %I%wd,%Rsp\n",
889 fsize_with_regs - 8);
891 else if (fsize_with_regs < 0x8000)
893 if (TARGET_68040)
894 asm_fprintf (stream, "\tadd" ASM_DOT "w %I%wd,%Rsp\n",
895 fsize_with_regs);
896 else
897 asm_fprintf (stream, MOTOROLA ?
898 "\tlea (%wd,%Rsp),%Rsp\n" :
899 "\tlea %Rsp@(%wd),%Rsp\n",
900 fsize_with_regs);
902 else
903 asm_fprintf (stream, "\tadd" ASM_DOT "l %I%wd,%Rsp\n", fsize_with_regs);
905 if (current_function_calls_eh_return)
906 asm_fprintf (stream, "\tadd" ASM_DOT"l %Ra0,%Rsp\n");
907 if (m68k_interrupt_function_p (current_function_decl))
908 fprintf (stream, "\trte\n");
909 else if (current_function_pops_args)
910 asm_fprintf (stream, "\trtd %I%d\n", current_function_pops_args);
911 else
912 fprintf (stream, "\trts\n");
915 /* Similar to general_operand, but exclude stack_pointer_rtx. */
918 not_sp_operand (rtx op, enum machine_mode mode)
920 return op != stack_pointer_rtx && nonimmediate_operand (op, mode);
923 /* Return true if X is a valid comparison operator for the dbcc
924 instruction.
926 Note it rejects floating point comparison operators.
927 (In the future we could use Fdbcc).
929 It also rejects some comparisons when CC_NO_OVERFLOW is set. */
932 valid_dbcc_comparison_p (rtx x, enum machine_mode mode ATTRIBUTE_UNUSED)
934 switch (GET_CODE (x))
936 case EQ: case NE: case GTU: case LTU:
937 case GEU: case LEU:
938 return 1;
940 /* Reject some when CC_NO_OVERFLOW is set. This may be over
941 conservative */
942 case GT: case LT: case GE: case LE:
943 return ! (cc_prev_status.flags & CC_NO_OVERFLOW);
944 default:
945 return 0;
949 /* Return nonzero if flags are currently in the 68881 flag register. */
951 flags_in_68881 (void)
953 /* We could add support for these in the future */
954 return cc_status.flags & CC_IN_68881;
957 /* Output a BSR instruction suitable for PIC code. */
958 void
959 m68k_output_pic_call(rtx dest)
961 const char *out;
963 if (!(GET_CODE (dest) == MEM && GET_CODE (XEXP (dest, 0)) == SYMBOL_REF))
964 out = "jsr %0";
965 /* We output a BSR instruction if we're using -fpic or we're building for
966 * a target that supports long branches. If we're building -fPIC on the
967 * 68000, 68010 or ColdFire we generate one of two sequences:
968 * a shorter one that uses a GOT entry or a longer one that doesn't.
969 * We'll use the -Os command-line flag to decide which to generate.
970 * Both sequences take the same time to execute on the ColdFire.
972 else if (TARGET_PCREL)
973 out = "bsr.l %o0";
974 else if ((flag_pic == 1) || TARGET_68020)
975 #if defined(USE_GAS)
976 out = "bsr.l %0@PLTPC";
977 #else
978 out = "bsr %0@PLTPC";
979 #endif
980 else if (optimize_size || TARGET_ID_SHARED_LIBRARY)
981 out = "move.l %0@GOT(%%a5), %%a1\n\tjsr (%%a1)";
982 else
983 out = "lea %0-.-8,%%a1\n\tjsr 0(%%pc,%%a1)";
985 output_asm_insn(out, &dest);
988 /* Output a dbCC; jCC sequence. Note we do not handle the
989 floating point version of this sequence (Fdbcc). We also
990 do not handle alternative conditions when CC_NO_OVERFLOW is
991 set. It is assumed that valid_dbcc_comparison_p and flags_in_68881 will
992 kick those out before we get here. */
994 void
995 output_dbcc_and_branch (rtx *operands)
997 switch (GET_CODE (operands[3]))
999 case EQ:
1000 output_asm_insn (MOTOROLA ?
1001 "dbeq %0,%l1\n\tjbeq %l2" :
1002 "dbeq %0,%l1\n\tjeq %l2",
1003 operands);
1004 break;
1006 case NE:
1007 output_asm_insn (MOTOROLA ?
1008 "dbne %0,%l1\n\tjbne %l2" :
1009 "dbne %0,%l1\n\tjne %l2",
1010 operands);
1011 break;
1013 case GT:
1014 output_asm_insn (MOTOROLA ?
1015 "dbgt %0,%l1\n\tjbgt %l2" :
1016 "dbgt %0,%l1\n\tjgt %l2",
1017 operands);
1018 break;
1020 case GTU:
1021 output_asm_insn (MOTOROLA ?
1022 "dbhi %0,%l1\n\tjbhi %l2" :
1023 "dbhi %0,%l1\n\tjhi %l2",
1024 operands);
1025 break;
1027 case LT:
1028 output_asm_insn (MOTOROLA ?
1029 "dblt %0,%l1\n\tjblt %l2" :
1030 "dblt %0,%l1\n\tjlt %l2",
1031 operands);
1032 break;
1034 case LTU:
1035 output_asm_insn (MOTOROLA ?
1036 "dbcs %0,%l1\n\tjbcs %l2" :
1037 "dbcs %0,%l1\n\tjcs %l2",
1038 operands);
1039 break;
1041 case GE:
1042 output_asm_insn (MOTOROLA ?
1043 "dbge %0,%l1\n\tjbge %l2" :
1044 "dbge %0,%l1\n\tjge %l2",
1045 operands);
1046 break;
1048 case GEU:
1049 output_asm_insn (MOTOROLA ?
1050 "dbcc %0,%l1\n\tjbcc %l2" :
1051 "dbcc %0,%l1\n\tjcc %l2",
1052 operands);
1053 break;
1055 case LE:
1056 output_asm_insn (MOTOROLA ?
1057 "dble %0,%l1\n\tjble %l2" :
1058 "dble %0,%l1\n\tjle %l2",
1059 operands);
1060 break;
1062 case LEU:
1063 output_asm_insn (MOTOROLA ?
1064 "dbls %0,%l1\n\tjbls %l2" :
1065 "dbls %0,%l1\n\tjls %l2",
1066 operands);
1067 break;
1069 default:
1070 abort ();
1073 /* If the decrement is to be done in SImode, then we have
1074 to compensate for the fact that dbcc decrements in HImode. */
1075 switch (GET_MODE (operands[0]))
1077 case SImode:
1078 output_asm_insn (MOTOROLA ?
1079 "clr%.w %0\n\tsubq%.l #1,%0\n\tjbpl %l1" :
1080 "clr%.w %0\n\tsubq%.l #1,%0\n\tjpl %l1",
1081 operands);
1082 break;
1084 case HImode:
1085 break;
1087 default:
1088 abort ();
1092 const char *
1093 output_scc_di(rtx op, rtx operand1, rtx operand2, rtx dest)
1095 rtx loperands[7];
1096 enum rtx_code op_code = GET_CODE (op);
1098 /* This does not produce a useful cc. */
1099 CC_STATUS_INIT;
1101 /* The m68k cmp.l instruction requires operand1 to be a reg as used
1102 below. Swap the operands and change the op if these requirements
1103 are not fulfilled. */
1104 if (GET_CODE (operand2) == REG && GET_CODE (operand1) != REG)
1106 rtx tmp = operand1;
1108 operand1 = operand2;
1109 operand2 = tmp;
1110 op_code = swap_condition (op_code);
1112 loperands[0] = operand1;
1113 if (GET_CODE (operand1) == REG)
1114 loperands[1] = gen_rtx_REG (SImode, REGNO (operand1) + 1);
1115 else
1116 loperands[1] = adjust_address (operand1, SImode, 4);
1117 if (operand2 != const0_rtx)
1119 loperands[2] = operand2;
1120 if (GET_CODE (operand2) == REG)
1121 loperands[3] = gen_rtx_REG (SImode, REGNO (operand2) + 1);
1122 else
1123 loperands[3] = adjust_address (operand2, SImode, 4);
1125 loperands[4] = gen_label_rtx ();
1126 if (operand2 != const0_rtx)
1128 output_asm_insn (MOTOROLA ?
1129 "cmp%.l %2,%0\n\tjbne %l4\n\tcmp%.l %3,%1" :
1130 "cmp%.l %2,%0\n\tjne %l4\n\tcmp%.l %3,%1",
1131 loperands);
1133 else
1135 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[0]))
1136 output_asm_insn ("tst%.l %0", loperands);
1137 else
1139 output_asm_insn ("cmp%.w #0,%0", loperands);
1142 output_asm_insn (MOTOROLA ? "jbne %l4" : "jne %l4", loperands);
1144 if (TARGET_68020 || TARGET_COLDFIRE || ! ADDRESS_REG_P (loperands[1]))
1145 output_asm_insn ("tst%.l %1", loperands);
1146 else
1147 output_asm_insn ("cmp%.w #0,%1", loperands);
1150 loperands[5] = dest;
1152 switch (op_code)
1154 case EQ:
1155 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1156 CODE_LABEL_NUMBER (loperands[4]));
1157 output_asm_insn ("seq %5", loperands);
1158 break;
1160 case NE:
1161 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1162 CODE_LABEL_NUMBER (loperands[4]));
1163 output_asm_insn ("sne %5", loperands);
1164 break;
1166 case GT:
1167 loperands[6] = gen_label_rtx ();
1168 output_asm_insn (MOTOROLA ?
1169 "shi %5\n\tjbra %l6" :
1170 "shi %5\n\tjra %l6",
1171 loperands);
1172 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1173 CODE_LABEL_NUMBER (loperands[4]));
1174 output_asm_insn ("sgt %5", loperands);
1175 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1176 CODE_LABEL_NUMBER (loperands[6]));
1177 break;
1179 case GTU:
1180 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1181 CODE_LABEL_NUMBER (loperands[4]));
1182 output_asm_insn ("shi %5", loperands);
1183 break;
1185 case LT:
1186 loperands[6] = gen_label_rtx ();
1187 output_asm_insn (MOTOROLA ?
1188 "scs %5\n\tjbra %l6" :
1189 "scs %5\n\tjra %l6",
1190 loperands);
1191 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1192 CODE_LABEL_NUMBER (loperands[4]));
1193 output_asm_insn ("slt %5", loperands);
1194 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1195 CODE_LABEL_NUMBER (loperands[6]));
1196 break;
1198 case LTU:
1199 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1200 CODE_LABEL_NUMBER (loperands[4]));
1201 output_asm_insn ("scs %5", loperands);
1202 break;
1204 case GE:
1205 loperands[6] = gen_label_rtx ();
1206 output_asm_insn (MOTOROLA ?
1207 "scc %5\n\tjbra %l6" :
1208 "scc %5\n\tjra %l6",
1209 loperands);
1210 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1211 CODE_LABEL_NUMBER (loperands[4]));
1212 output_asm_insn ("sge %5", loperands);
1213 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1214 CODE_LABEL_NUMBER (loperands[6]));
1215 break;
1217 case GEU:
1218 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1219 CODE_LABEL_NUMBER (loperands[4]));
1220 output_asm_insn ("scc %5", loperands);
1221 break;
1223 case LE:
1224 loperands[6] = gen_label_rtx ();
1225 output_asm_insn (MOTOROLA ?
1226 "sls %5\n\tjbra %l6" :
1227 "sls %5\n\tjra %l6",
1228 loperands);
1229 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1230 CODE_LABEL_NUMBER (loperands[4]));
1231 output_asm_insn ("sle %5", loperands);
1232 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1233 CODE_LABEL_NUMBER (loperands[6]));
1234 break;
1236 case LEU:
1237 (*targetm.asm_out.internal_label) (asm_out_file, "L",
1238 CODE_LABEL_NUMBER (loperands[4]));
1239 output_asm_insn ("sls %5", loperands);
1240 break;
1242 default:
1243 abort ();
1245 return "";
1248 const char *
1249 output_btst (rtx *operands, rtx countop, rtx dataop, rtx insn, int signpos)
1251 operands[0] = countop;
1252 operands[1] = dataop;
1254 if (GET_CODE (countop) == CONST_INT)
1256 register int count = INTVAL (countop);
1257 /* If COUNT is bigger than size of storage unit in use,
1258 advance to the containing unit of same size. */
1259 if (count > signpos)
1261 int offset = (count & ~signpos) / 8;
1262 count = count & signpos;
1263 operands[1] = dataop = adjust_address (dataop, QImode, offset);
1265 if (count == signpos)
1266 cc_status.flags = CC_NOT_POSITIVE | CC_Z_IN_NOT_N;
1267 else
1268 cc_status.flags = CC_NOT_NEGATIVE | CC_Z_IN_NOT_N;
1270 /* These three statements used to use next_insns_test_no...
1271 but it appears that this should do the same job. */
1272 if (count == 31
1273 && next_insn_tests_no_inequality (insn))
1274 return "tst%.l %1";
1275 if (count == 15
1276 && next_insn_tests_no_inequality (insn))
1277 return "tst%.w %1";
1278 if (count == 7
1279 && next_insn_tests_no_inequality (insn))
1280 return "tst%.b %1";
1282 cc_status.flags = CC_NOT_NEGATIVE;
1284 return "btst %0,%1";
1287 /* Returns true if OP is either a symbol reference or a sum of a symbol
1288 reference and a constant. */
1291 symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
1293 switch (GET_CODE (op))
1295 case SYMBOL_REF:
1296 case LABEL_REF:
1297 return true;
1299 case CONST:
1300 op = XEXP (op, 0);
1301 return ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
1302 || GET_CODE (XEXP (op, 0)) == LABEL_REF)
1303 && GET_CODE (XEXP (op, 1)) == CONST_INT);
1305 #if 0 /* Deleted, with corresponding change in m68k.h,
1306 so as to fit the specs. No CONST_DOUBLE is ever symbolic. */
1307 case CONST_DOUBLE:
1308 return GET_MODE (op) == mode;
1309 #endif
1311 default:
1312 return false;
1316 /* Check for sign_extend or zero_extend. Used for bit-count operands. */
1319 extend_operator(rtx x, enum machine_mode mode)
1321 if (mode != VOIDmode && GET_MODE(x) != mode)
1322 return 0;
1323 switch (GET_CODE(x))
1325 case SIGN_EXTEND :
1326 case ZERO_EXTEND :
1327 return 1;
1328 default :
1329 return 0;
1334 /* Legitimize PIC addresses. If the address is already
1335 position-independent, we return ORIG. Newly generated
1336 position-independent addresses go to REG. If we need more
1337 than one register, we lose.
1339 An address is legitimized by making an indirect reference
1340 through the Global Offset Table with the name of the symbol
1341 used as an offset.
1343 The assembler and linker are responsible for placing the
1344 address of the symbol in the GOT. The function prologue
1345 is responsible for initializing a5 to the starting address
1346 of the GOT.
1348 The assembler is also responsible for translating a symbol name
1349 into a constant displacement from the start of the GOT.
1351 A quick example may make things a little clearer:
1353 When not generating PIC code to store the value 12345 into _foo
1354 we would generate the following code:
1356 movel #12345, _foo
1358 When generating PIC two transformations are made. First, the compiler
1359 loads the address of foo into a register. So the first transformation makes:
1361 lea _foo, a0
1362 movel #12345, a0@
1364 The code in movsi will intercept the lea instruction and call this
1365 routine which will transform the instructions into:
1367 movel a5@(_foo:w), a0
1368 movel #12345, a0@
1371 That (in a nutshell) is how *all* symbol and label references are
1372 handled. */
1375 legitimize_pic_address (rtx orig, enum machine_mode mode ATTRIBUTE_UNUSED,
1376 rtx reg)
1378 rtx pic_ref = orig;
1380 /* First handle a simple SYMBOL_REF or LABEL_REF */
1381 if (GET_CODE (orig) == SYMBOL_REF || GET_CODE (orig) == LABEL_REF)
1383 if (reg == 0)
1384 abort ();
1386 pic_ref = gen_rtx_MEM (Pmode,
1387 gen_rtx_PLUS (Pmode,
1388 pic_offset_table_rtx, orig));
1389 current_function_uses_pic_offset_table = 1;
1390 MEM_READONLY_P (pic_ref) = 1;
1391 emit_move_insn (reg, pic_ref);
1392 return reg;
1394 else if (GET_CODE (orig) == CONST)
1396 rtx base;
1398 /* Make sure this has not already been legitimized. */
1399 if (GET_CODE (XEXP (orig, 0)) == PLUS
1400 && XEXP (XEXP (orig, 0), 0) == pic_offset_table_rtx)
1401 return orig;
1403 if (reg == 0)
1404 abort ();
1406 /* legitimize both operands of the PLUS */
1407 if (GET_CODE (XEXP (orig, 0)) == PLUS)
1409 base = legitimize_pic_address (XEXP (XEXP (orig, 0), 0), Pmode, reg);
1410 orig = legitimize_pic_address (XEXP (XEXP (orig, 0), 1), Pmode,
1411 base == reg ? 0 : reg);
1413 else abort ();
1415 if (GET_CODE (orig) == CONST_INT)
1416 return plus_constant (base, INTVAL (orig));
1417 pic_ref = gen_rtx_PLUS (Pmode, base, orig);
1418 /* Likewise, should we set special REG_NOTEs here? */
1420 return pic_ref;
1424 typedef enum { MOVL, SWAP, NEGW, NOTW, NOTB, MOVQ, MVS, MVZ } CONST_METHOD;
1426 static CONST_METHOD const_method (rtx);
1428 #define USE_MOVQ(i) ((unsigned)((i) + 128) <= 255)
1430 static CONST_METHOD
1431 const_method (rtx constant)
1433 int i;
1434 unsigned u;
1436 i = INTVAL (constant);
1437 if (USE_MOVQ (i))
1438 return MOVQ;
1440 /* The ColdFire doesn't have byte or word operations. */
1441 /* FIXME: This may not be useful for the m68060 either. */
1442 if (!TARGET_COLDFIRE)
1444 /* if -256 < N < 256 but N is not in range for a moveq
1445 N^ff will be, so use moveq #N^ff, dreg; not.b dreg. */
1446 if (USE_MOVQ (i ^ 0xff))
1447 return NOTB;
1448 /* Likewise, try with not.w */
1449 if (USE_MOVQ (i ^ 0xffff))
1450 return NOTW;
1451 /* This is the only value where neg.w is useful */
1452 if (i == -65408)
1453 return NEGW;
1456 /* Try also with swap. */
1457 u = i;
1458 if (USE_MOVQ ((u >> 16) | (u << 16)))
1459 return SWAP;
1461 if (TARGET_CFV4)
1463 /* Try using MVZ/MVS with an immediate value to load constants. */
1464 if (i >= 0 && i <= 65535)
1465 return MVZ;
1466 if (i >= -32768 && i <= 32767)
1467 return MVS;
1470 /* Otherwise, use move.l */
1471 return MOVL;
1474 static int
1475 const_int_cost (rtx constant)
1477 switch (const_method (constant))
1479 case MOVQ :
1480 /* Constants between -128 and 127 are cheap due to moveq */
1481 return 0;
1482 case MVZ:
1483 case MVS:
1484 case NOTB :
1485 case NOTW :
1486 case NEGW :
1487 case SWAP :
1488 /* Constants easily generated by moveq + not.b/not.w/neg.w/swap */
1489 return 1;
1490 case MOVL :
1491 return 2;
1492 default :
1493 abort ();
1497 static bool
1498 m68k_rtx_costs (rtx x, int code, int outer_code, int *total)
1500 switch (code)
1502 case CONST_INT:
1503 /* Constant zero is super cheap due to clr instruction. */
1504 if (x == const0_rtx)
1505 *total = 0;
1506 else
1507 *total = const_int_cost (x);
1508 return true;
1510 case CONST:
1511 case LABEL_REF:
1512 case SYMBOL_REF:
1513 *total = 3;
1514 return true;
1516 case CONST_DOUBLE:
1517 /* Make 0.0 cheaper than other floating constants to
1518 encourage creating tstsf and tstdf insns. */
1519 if (outer_code == COMPARE
1520 && (x == CONST0_RTX (SFmode) || x == CONST0_RTX (DFmode)))
1521 *total = 4;
1522 else
1523 *total = 5;
1524 return true;
1526 /* These are vaguely right for a 68020. */
1527 /* The costs for long multiply have been adjusted to work properly
1528 in synth_mult on the 68020, relative to an average of the time
1529 for add and the time for shift, taking away a little more because
1530 sometimes move insns are needed. */
1531 /* div?.w is relatively cheaper on 68000 counted in COSTS_N_INSNS terms. */
1532 #define MULL_COST (TARGET_68060 ? 2 : TARGET_68040 ? 5 : (TARGET_COLDFIRE && !TARGET_5200) ? 3 : TARGET_COLDFIRE ? 10 : 13)
1533 #define MULW_COST (TARGET_68060 ? 2 : TARGET_68040 ? 3 : TARGET_68020 ? 8 : \
1534 (TARGET_COLDFIRE && !TARGET_5200) ? 2 : 5)
1535 #define DIVW_COST (TARGET_68020 ? 27 : TARGET_CF_HWDIV ? 11 : 12)
1537 case PLUS:
1538 /* An lea costs about three times as much as a simple add. */
1539 if (GET_MODE (x) == SImode
1540 && GET_CODE (XEXP (x, 1)) == REG
1541 && GET_CODE (XEXP (x, 0)) == MULT
1542 && GET_CODE (XEXP (XEXP (x, 0), 0)) == REG
1543 && GET_CODE (XEXP (XEXP (x, 0), 1)) == CONST_INT
1544 && (INTVAL (XEXP (XEXP (x, 0), 1)) == 2
1545 || INTVAL (XEXP (XEXP (x, 0), 1)) == 4
1546 || INTVAL (XEXP (XEXP (x, 0), 1)) == 8))
1548 /* lea an@(dx:l:i),am */
1549 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 2 : 3);
1550 return true;
1552 return false;
1554 case ASHIFT:
1555 case ASHIFTRT:
1556 case LSHIFTRT:
1557 if (TARGET_68060)
1559 *total = COSTS_N_INSNS(1);
1560 return true;
1562 if (! TARGET_68020 && ! TARGET_COLDFIRE)
1564 if (GET_CODE (XEXP (x, 1)) == CONST_INT)
1566 if (INTVAL (XEXP (x, 1)) < 16)
1567 *total = COSTS_N_INSNS (2) + INTVAL (XEXP (x, 1)) / 2;
1568 else
1569 /* We're using clrw + swap for these cases. */
1570 *total = COSTS_N_INSNS (4) + (INTVAL (XEXP (x, 1)) - 16) / 2;
1572 else
1573 *total = COSTS_N_INSNS (10); /* worst case */
1574 return true;
1576 /* A shift by a big integer takes an extra instruction. */
1577 if (GET_CODE (XEXP (x, 1)) == CONST_INT
1578 && (INTVAL (XEXP (x, 1)) == 16))
1580 *total = COSTS_N_INSNS (2); /* clrw;swap */
1581 return true;
1583 if (GET_CODE (XEXP (x, 1)) == CONST_INT
1584 && !(INTVAL (XEXP (x, 1)) > 0
1585 && INTVAL (XEXP (x, 1)) <= 8))
1587 *total = COSTS_N_INSNS (TARGET_COLDFIRE ? 1 : 3); /* lsr #i,dn */
1588 return true;
1590 return false;
1592 case MULT:
1593 if ((GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
1594 || GET_CODE (XEXP (x, 0)) == SIGN_EXTEND)
1595 && GET_MODE (x) == SImode)
1596 *total = COSTS_N_INSNS (MULW_COST);
1597 else if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
1598 *total = COSTS_N_INSNS (MULW_COST);
1599 else
1600 *total = COSTS_N_INSNS (MULL_COST);
1601 return true;
1603 case DIV:
1604 case UDIV:
1605 case MOD:
1606 case UMOD:
1607 if (GET_MODE (x) == QImode || GET_MODE (x) == HImode)
1608 *total = COSTS_N_INSNS (DIVW_COST); /* div.w */
1609 else if (TARGET_CF_HWDIV)
1610 *total = COSTS_N_INSNS (18);
1611 else
1612 *total = COSTS_N_INSNS (43); /* div.l */
1613 return true;
1615 default:
1616 return false;
1620 const char *
1621 output_move_const_into_data_reg (rtx *operands)
1623 int i;
1625 i = INTVAL (operands[1]);
1626 switch (const_method (operands[1]))
1628 case MVZ:
1629 return "mvsw %1,%0";
1630 case MVS:
1631 return "mvzw %1,%0";
1632 case MOVQ :
1633 return "moveq %1,%0";
1634 case NOTB :
1635 CC_STATUS_INIT;
1636 operands[1] = GEN_INT (i ^ 0xff);
1637 return "moveq %1,%0\n\tnot%.b %0";
1638 case NOTW :
1639 CC_STATUS_INIT;
1640 operands[1] = GEN_INT (i ^ 0xffff);
1641 return "moveq %1,%0\n\tnot%.w %0";
1642 case NEGW :
1643 CC_STATUS_INIT;
1644 return "moveq #-128,%0\n\tneg%.w %0";
1645 case SWAP :
1647 unsigned u = i;
1649 operands[1] = GEN_INT ((u << 16) | (u >> 16));
1650 return "moveq %1,%0\n\tswap %0";
1652 case MOVL :
1653 return "move%.l %1,%0";
1654 default :
1655 abort ();
1659 /* Return 1 if 'constant' can be represented by
1660 mov3q on a ColdFire V4 core. */
1662 valid_mov3q_const (rtx constant)
1664 int i;
1666 if (TARGET_CFV4 && GET_CODE (constant) == CONST_INT)
1668 i = INTVAL (constant);
1669 if ((i == -1) || (i >= 1 && i <= 7))
1670 return 1;
1672 return 0;
1676 const char *
1677 output_move_simode_const (rtx *operands)
1679 if (operands[1] == const0_rtx
1680 && (DATA_REG_P (operands[0])
1681 || GET_CODE (operands[0]) == MEM)
1682 /* clr insns on 68000 read before writing.
1683 This isn't so on the 68010, but we have no TARGET_68010. */
1684 && ((TARGET_68020 || TARGET_COLDFIRE)
1685 || !(GET_CODE (operands[0]) == MEM
1686 && MEM_VOLATILE_P (operands[0]))))
1687 return "clr%.l %0";
1688 else if ((GET_MODE (operands[0]) == SImode)
1689 && valid_mov3q_const (operands[1]))
1690 return "mov3q%.l %1,%0";
1691 else if (operands[1] == const0_rtx
1692 && ADDRESS_REG_P (operands[0]))
1693 return "sub%.l %0,%0";
1694 else if (DATA_REG_P (operands[0]))
1695 return output_move_const_into_data_reg (operands);
1696 else if (ADDRESS_REG_P (operands[0])
1697 && INTVAL (operands[1]) < 0x8000
1698 && INTVAL (operands[1]) >= -0x8000)
1700 if (valid_mov3q_const (operands[1]))
1701 return "mov3q%.l %1,%0";
1702 return "move%.w %1,%0";
1704 else if (GET_CODE (operands[0]) == MEM
1705 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
1706 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
1707 && INTVAL (operands[1]) < 0x8000
1708 && INTVAL (operands[1]) >= -0x8000)
1710 if (valid_mov3q_const (operands[1]))
1711 return "mov3q%.l %1,%-";
1712 return "pea %a1";
1714 return "move%.l %1,%0";
1717 const char *
1718 output_move_simode (rtx *operands)
1720 if (GET_CODE (operands[1]) == CONST_INT)
1721 return output_move_simode_const (operands);
1722 else if ((GET_CODE (operands[1]) == SYMBOL_REF
1723 || GET_CODE (operands[1]) == CONST)
1724 && push_operand (operands[0], SImode))
1725 return "pea %a1";
1726 else if ((GET_CODE (operands[1]) == SYMBOL_REF
1727 || GET_CODE (operands[1]) == CONST)
1728 && ADDRESS_REG_P (operands[0]))
1729 return "lea %a1,%0";
1730 return "move%.l %1,%0";
1733 const char *
1734 output_move_himode (rtx *operands)
1736 if (GET_CODE (operands[1]) == CONST_INT)
1738 if (operands[1] == const0_rtx
1739 && (DATA_REG_P (operands[0])
1740 || GET_CODE (operands[0]) == MEM)
1741 /* clr insns on 68000 read before writing.
1742 This isn't so on the 68010, but we have no TARGET_68010. */
1743 && ((TARGET_68020 || TARGET_COLDFIRE)
1744 || !(GET_CODE (operands[0]) == MEM
1745 && MEM_VOLATILE_P (operands[0]))))
1746 return "clr%.w %0";
1747 else if (operands[1] == const0_rtx
1748 && ADDRESS_REG_P (operands[0]))
1749 return "sub%.l %0,%0";
1750 else if (DATA_REG_P (operands[0])
1751 && INTVAL (operands[1]) < 128
1752 && INTVAL (operands[1]) >= -128)
1754 return "moveq %1,%0";
1756 else if (INTVAL (operands[1]) < 0x8000
1757 && INTVAL (operands[1]) >= -0x8000)
1758 return "move%.w %1,%0";
1760 else if (CONSTANT_P (operands[1]))
1761 return "move%.l %1,%0";
1762 /* Recognize the insn before a tablejump, one that refers
1763 to a table of offsets. Such an insn will need to refer
1764 to a label on the insn. So output one. Use the label-number
1765 of the table of offsets to generate this label. This code,
1766 and similar code below, assumes that there will be at most one
1767 reference to each table. */
1768 if (GET_CODE (operands[1]) == MEM
1769 && GET_CODE (XEXP (operands[1], 0)) == PLUS
1770 && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == LABEL_REF
1771 && GET_CODE (XEXP (XEXP (operands[1], 0), 0)) != PLUS)
1773 rtx labelref = XEXP (XEXP (operands[1], 0), 1);
1774 if (MOTOROLA)
1775 asm_fprintf (asm_out_file, "\t.set %LLI%d,.+2\n",
1776 CODE_LABEL_NUMBER (XEXP (labelref, 0)));
1777 else
1778 (*targetm.asm_out.internal_label) (asm_out_file, "LI",
1779 CODE_LABEL_NUMBER (XEXP (labelref, 0)));
1781 return "move%.w %1,%0";
1784 const char *
1785 output_move_qimode (rtx *operands)
1787 /* 68k family always modifies the stack pointer by at least 2, even for
1788 byte pushes. The 5200 (ColdFire) does not do this. */
1789 if (GET_CODE (operands[0]) == MEM
1790 && GET_CODE (XEXP (operands[0], 0)) == PRE_DEC
1791 && XEXP (XEXP (operands[0], 0), 0) == stack_pointer_rtx
1792 && ! ADDRESS_REG_P (operands[1])
1793 && ! TARGET_COLDFIRE)
1794 /* generated by pushqi1 pattern now */
1795 abort ();
1797 /* clr and st insns on 68000 read before writing.
1798 This isn't so on the 68010, but we have no TARGET_68010. */
1799 if (!ADDRESS_REG_P (operands[0])
1800 && ((TARGET_68020 || TARGET_COLDFIRE)
1801 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
1803 if (operands[1] == const0_rtx)
1804 return "clr%.b %0";
1805 if ((!TARGET_COLDFIRE || DATA_REG_P (operands[0]))
1806 && GET_CODE (operands[1]) == CONST_INT
1807 && (INTVAL (operands[1]) & 255) == 255)
1809 CC_STATUS_INIT;
1810 return "st %0";
1813 if (GET_CODE (operands[1]) == CONST_INT
1814 && DATA_REG_P (operands[0])
1815 && INTVAL (operands[1]) < 128
1816 && INTVAL (operands[1]) >= -128)
1818 return "moveq %1,%0";
1820 if (operands[1] == const0_rtx && ADDRESS_REG_P (operands[0]))
1821 return "sub%.l %0,%0";
1822 if (GET_CODE (operands[1]) != CONST_INT && CONSTANT_P (operands[1]))
1823 return "move%.l %1,%0";
1824 /* 68k family (including the 5200 ColdFire) does not support byte moves to
1825 from address registers. */
1826 if (ADDRESS_REG_P (operands[0]) || ADDRESS_REG_P (operands[1]))
1827 return "move%.w %1,%0";
1828 return "move%.b %1,%0";
1831 const char *
1832 output_move_stricthi (rtx *operands)
1834 if (operands[1] == const0_rtx
1835 /* clr insns on 68000 read before writing.
1836 This isn't so on the 68010, but we have no TARGET_68010. */
1837 && ((TARGET_68020 || TARGET_COLDFIRE)
1838 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
1839 return "clr%.w %0";
1840 return "move%.w %1,%0";
1843 const char *
1844 output_move_strictqi (rtx *operands)
1846 if (operands[1] == const0_rtx
1847 /* clr insns on 68000 read before writing.
1848 This isn't so on the 68010, but we have no TARGET_68010. */
1849 && ((TARGET_68020 || TARGET_COLDFIRE)
1850 || !(GET_CODE (operands[0]) == MEM && MEM_VOLATILE_P (operands[0]))))
1851 return "clr%.b %0";
1852 return "move%.b %1,%0";
1855 /* Return the best assembler insn template
1856 for moving operands[1] into operands[0] as a fullword. */
1858 static const char *
1859 singlemove_string (rtx *operands)
1861 if (GET_CODE (operands[1]) == CONST_INT)
1862 return output_move_simode_const (operands);
1863 return "move%.l %1,%0";
1867 /* Output assembler code to perform a doubleword move insn
1868 with operands OPERANDS. */
1870 const char *
1871 output_move_double (rtx *operands)
1873 enum
1875 REGOP, OFFSOP, MEMOP, PUSHOP, POPOP, CNSTOP, RNDOP
1876 } optype0, optype1;
1877 rtx latehalf[2];
1878 rtx middlehalf[2];
1879 rtx xops[2];
1880 rtx addreg0 = 0, addreg1 = 0;
1881 int dest_overlapped_low = 0;
1882 int size = GET_MODE_SIZE (GET_MODE (operands[0]));
1884 middlehalf[0] = 0;
1885 middlehalf[1] = 0;
1887 /* First classify both operands. */
1889 if (REG_P (operands[0]))
1890 optype0 = REGOP;
1891 else if (offsettable_memref_p (operands[0]))
1892 optype0 = OFFSOP;
1893 else if (GET_CODE (XEXP (operands[0], 0)) == POST_INC)
1894 optype0 = POPOP;
1895 else if (GET_CODE (XEXP (operands[0], 0)) == PRE_DEC)
1896 optype0 = PUSHOP;
1897 else if (GET_CODE (operands[0]) == MEM)
1898 optype0 = MEMOP;
1899 else
1900 optype0 = RNDOP;
1902 if (REG_P (operands[1]))
1903 optype1 = REGOP;
1904 else if (CONSTANT_P (operands[1]))
1905 optype1 = CNSTOP;
1906 else if (offsettable_memref_p (operands[1]))
1907 optype1 = OFFSOP;
1908 else if (GET_CODE (XEXP (operands[1], 0)) == POST_INC)
1909 optype1 = POPOP;
1910 else if (GET_CODE (XEXP (operands[1], 0)) == PRE_DEC)
1911 optype1 = PUSHOP;
1912 else if (GET_CODE (operands[1]) == MEM)
1913 optype1 = MEMOP;
1914 else
1915 optype1 = RNDOP;
1917 /* Check for the cases that the operand constraints are not
1918 supposed to allow to happen. Abort if we get one,
1919 because generating code for these cases is painful. */
1921 if (optype0 == RNDOP || optype1 == RNDOP)
1922 abort ();
1924 /* If one operand is decrementing and one is incrementing
1925 decrement the former register explicitly
1926 and change that operand into ordinary indexing. */
1928 if (optype0 == PUSHOP && optype1 == POPOP)
1930 operands[0] = XEXP (XEXP (operands[0], 0), 0);
1931 if (size == 12)
1932 output_asm_insn ("sub%.l #12,%0", operands);
1933 else
1934 output_asm_insn ("subq%.l #8,%0", operands);
1935 if (GET_MODE (operands[1]) == XFmode)
1936 operands[0] = gen_rtx_MEM (XFmode, operands[0]);
1937 else if (GET_MODE (operands[0]) == DFmode)
1938 operands[0] = gen_rtx_MEM (DFmode, operands[0]);
1939 else
1940 operands[0] = gen_rtx_MEM (DImode, operands[0]);
1941 optype0 = OFFSOP;
1943 if (optype0 == POPOP && optype1 == PUSHOP)
1945 operands[1] = XEXP (XEXP (operands[1], 0), 0);
1946 if (size == 12)
1947 output_asm_insn ("sub%.l #12,%1", operands);
1948 else
1949 output_asm_insn ("subq%.l #8,%1", operands);
1950 if (GET_MODE (operands[1]) == XFmode)
1951 operands[1] = gen_rtx_MEM (XFmode, operands[1]);
1952 else if (GET_MODE (operands[1]) == DFmode)
1953 operands[1] = gen_rtx_MEM (DFmode, operands[1]);
1954 else
1955 operands[1] = gen_rtx_MEM (DImode, operands[1]);
1956 optype1 = OFFSOP;
1959 /* If an operand is an unoffsettable memory ref, find a register
1960 we can increment temporarily to make it refer to the second word. */
1962 if (optype0 == MEMOP)
1963 addreg0 = find_addr_reg (XEXP (operands[0], 0));
1965 if (optype1 == MEMOP)
1966 addreg1 = find_addr_reg (XEXP (operands[1], 0));
1968 /* Ok, we can do one word at a time.
1969 Normally we do the low-numbered word first,
1970 but if either operand is autodecrementing then we
1971 do the high-numbered word first.
1973 In either case, set up in LATEHALF the operands to use
1974 for the high-numbered word and in some cases alter the
1975 operands in OPERANDS to be suitable for the low-numbered word. */
1977 if (size == 12)
1979 if (optype0 == REGOP)
1981 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 2);
1982 middlehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
1984 else if (optype0 == OFFSOP)
1986 middlehalf[0] = adjust_address (operands[0], SImode, 4);
1987 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
1989 else
1991 middlehalf[0] = operands[0];
1992 latehalf[0] = operands[0];
1995 if (optype1 == REGOP)
1997 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 2);
1998 middlehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2000 else if (optype1 == OFFSOP)
2002 middlehalf[1] = adjust_address (operands[1], SImode, 4);
2003 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2005 else if (optype1 == CNSTOP)
2007 if (GET_CODE (operands[1]) == CONST_DOUBLE)
2009 REAL_VALUE_TYPE r;
2010 long l[3];
2012 REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]);
2013 REAL_VALUE_TO_TARGET_LONG_DOUBLE (r, l);
2014 operands[1] = GEN_INT (l[0]);
2015 middlehalf[1] = GEN_INT (l[1]);
2016 latehalf[1] = GEN_INT (l[2]);
2018 else if (CONSTANT_P (operands[1]))
2020 /* actually, no non-CONST_DOUBLE constant should ever
2021 appear here. */
2022 abort ();
2023 if (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) < 0)
2024 latehalf[1] = constm1_rtx;
2025 else
2026 latehalf[1] = const0_rtx;
2029 else
2031 middlehalf[1] = operands[1];
2032 latehalf[1] = operands[1];
2035 else
2036 /* size is not 12: */
2038 if (optype0 == REGOP)
2039 latehalf[0] = gen_rtx_REG (SImode, REGNO (operands[0]) + 1);
2040 else if (optype0 == OFFSOP)
2041 latehalf[0] = adjust_address (operands[0], SImode, size - 4);
2042 else
2043 latehalf[0] = operands[0];
2045 if (optype1 == REGOP)
2046 latehalf[1] = gen_rtx_REG (SImode, REGNO (operands[1]) + 1);
2047 else if (optype1 == OFFSOP)
2048 latehalf[1] = adjust_address (operands[1], SImode, size - 4);
2049 else if (optype1 == CNSTOP)
2050 split_double (operands[1], &operands[1], &latehalf[1]);
2051 else
2052 latehalf[1] = operands[1];
2055 /* If insn is effectively movd N(sp),-(sp) then we will do the
2056 high word first. We should use the adjusted operand 1 (which is N+4(sp))
2057 for the low word as well, to compensate for the first decrement of sp. */
2058 if (optype0 == PUSHOP
2059 && REGNO (XEXP (XEXP (operands[0], 0), 0)) == STACK_POINTER_REGNUM
2060 && reg_overlap_mentioned_p (stack_pointer_rtx, operands[1]))
2061 operands[1] = middlehalf[1] = latehalf[1];
2063 /* For (set (reg:DI N) (mem:DI ... (reg:SI N) ...)),
2064 if the upper part of reg N does not appear in the MEM, arrange to
2065 emit the move late-half first. Otherwise, compute the MEM address
2066 into the upper part of N and use that as a pointer to the memory
2067 operand. */
2068 if (optype0 == REGOP
2069 && (optype1 == OFFSOP || optype1 == MEMOP))
2071 rtx testlow = gen_rtx_REG (SImode, REGNO (operands[0]));
2073 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2074 && reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2076 /* If both halves of dest are used in the src memory address,
2077 compute the address into latehalf of dest.
2078 Note that this can't happen if the dest is two data regs. */
2079 compadr:
2080 xops[0] = latehalf[0];
2081 xops[1] = XEXP (operands[1], 0);
2082 output_asm_insn ("lea %a1,%0", xops);
2083 if (GET_MODE (operands[1]) == XFmode )
2085 operands[1] = gen_rtx_MEM (XFmode, latehalf[0]);
2086 middlehalf[1] = adjust_address (operands[1], DImode, size - 8);
2087 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2089 else
2091 operands[1] = gen_rtx_MEM (DImode, latehalf[0]);
2092 latehalf[1] = adjust_address (operands[1], DImode, size - 4);
2095 else if (size == 12
2096 && reg_overlap_mentioned_p (middlehalf[0],
2097 XEXP (operands[1], 0)))
2099 /* Check for two regs used by both source and dest.
2100 Note that this can't happen if the dest is all data regs.
2101 It can happen if the dest is d6, d7, a0.
2102 But in that case, latehalf is an addr reg, so
2103 the code at compadr does ok. */
2105 if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0))
2106 || reg_overlap_mentioned_p (latehalf[0], XEXP (operands[1], 0)))
2107 goto compadr;
2109 /* JRV says this can't happen: */
2110 if (addreg0 || addreg1)
2111 abort ();
2113 /* Only the middle reg conflicts; simply put it last. */
2114 output_asm_insn (singlemove_string (operands), operands);
2115 output_asm_insn (singlemove_string (latehalf), latehalf);
2116 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2117 return "";
2119 else if (reg_overlap_mentioned_p (testlow, XEXP (operands[1], 0)))
2120 /* If the low half of dest is mentioned in the source memory
2121 address, the arrange to emit the move late half first. */
2122 dest_overlapped_low = 1;
2125 /* If one or both operands autodecrementing,
2126 do the two words, high-numbered first. */
2128 /* Likewise, the first move would clobber the source of the second one,
2129 do them in the other order. This happens only for registers;
2130 such overlap can't happen in memory unless the user explicitly
2131 sets it up, and that is an undefined circumstance. */
2133 if (optype0 == PUSHOP || optype1 == PUSHOP
2134 || (optype0 == REGOP && optype1 == REGOP
2135 && ((middlehalf[1] && REGNO (operands[0]) == REGNO (middlehalf[1]))
2136 || REGNO (operands[0]) == REGNO (latehalf[1])))
2137 || dest_overlapped_low)
2139 /* Make any unoffsettable addresses point at high-numbered word. */
2140 if (addreg0)
2142 if (size == 12)
2143 output_asm_insn ("addq%.l #8,%0", &addreg0);
2144 else
2145 output_asm_insn ("addq%.l #4,%0", &addreg0);
2147 if (addreg1)
2149 if (size == 12)
2150 output_asm_insn ("addq%.l #8,%0", &addreg1);
2151 else
2152 output_asm_insn ("addq%.l #4,%0", &addreg1);
2155 /* Do that word. */
2156 output_asm_insn (singlemove_string (latehalf), latehalf);
2158 /* Undo the adds we just did. */
2159 if (addreg0)
2160 output_asm_insn ("subq%.l #4,%0", &addreg0);
2161 if (addreg1)
2162 output_asm_insn ("subq%.l #4,%0", &addreg1);
2164 if (size == 12)
2166 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2167 if (addreg0)
2168 output_asm_insn ("subq%.l #4,%0", &addreg0);
2169 if (addreg1)
2170 output_asm_insn ("subq%.l #4,%0", &addreg1);
2173 /* Do low-numbered word. */
2174 return singlemove_string (operands);
2177 /* Normal case: do the two words, low-numbered first. */
2179 output_asm_insn (singlemove_string (operands), operands);
2181 /* Do the middle one of the three words for long double */
2182 if (size == 12)
2184 if (addreg0)
2185 output_asm_insn ("addq%.l #4,%0", &addreg0);
2186 if (addreg1)
2187 output_asm_insn ("addq%.l #4,%0", &addreg1);
2189 output_asm_insn (singlemove_string (middlehalf), middlehalf);
2192 /* Make any unoffsettable addresses point at high-numbered word. */
2193 if (addreg0)
2194 output_asm_insn ("addq%.l #4,%0", &addreg0);
2195 if (addreg1)
2196 output_asm_insn ("addq%.l #4,%0", &addreg1);
2198 /* Do that word. */
2199 output_asm_insn (singlemove_string (latehalf), latehalf);
2201 /* Undo the adds we just did. */
2202 if (addreg0)
2204 if (size == 12)
2205 output_asm_insn ("subq%.l #8,%0", &addreg0);
2206 else
2207 output_asm_insn ("subq%.l #4,%0", &addreg0);
2209 if (addreg1)
2211 if (size == 12)
2212 output_asm_insn ("subq%.l #8,%0", &addreg1);
2213 else
2214 output_asm_insn ("subq%.l #4,%0", &addreg1);
2217 return "";
2220 /* Return a REG that occurs in ADDR with coefficient 1.
2221 ADDR can be effectively incremented by incrementing REG. */
2223 static rtx
2224 find_addr_reg (rtx addr)
2226 while (GET_CODE (addr) == PLUS)
2228 if (GET_CODE (XEXP (addr, 0)) == REG)
2229 addr = XEXP (addr, 0);
2230 else if (GET_CODE (XEXP (addr, 1)) == REG)
2231 addr = XEXP (addr, 1);
2232 else if (CONSTANT_P (XEXP (addr, 0)))
2233 addr = XEXP (addr, 1);
2234 else if (CONSTANT_P (XEXP (addr, 1)))
2235 addr = XEXP (addr, 0);
2236 else
2237 abort ();
2239 if (GET_CODE (addr) == REG)
2240 return addr;
2241 abort ();
2244 /* Output assembler code to perform a 32-bit 3-operand add. */
2246 const char *
2247 output_addsi3 (rtx *operands)
2249 if (! operands_match_p (operands[0], operands[1]))
2251 if (!ADDRESS_REG_P (operands[1]))
2253 rtx tmp = operands[1];
2255 operands[1] = operands[2];
2256 operands[2] = tmp;
2259 /* These insns can result from reloads to access
2260 stack slots over 64k from the frame pointer. */
2261 if (GET_CODE (operands[2]) == CONST_INT
2262 && (INTVAL (operands[2]) < -32768 || INTVAL (operands[2]) > 32767))
2263 return "move%.l %2,%0\n\tadd%.l %1,%0";
2264 if (GET_CODE (operands[2]) == REG)
2265 return MOTOROLA ? "lea (%1,%2.l),%0" : "lea %1@(0,%2:l),%0";
2266 return MOTOROLA ? "lea (%c2,%1),%0" : "lea %1@(%c2),%0";
2268 if (GET_CODE (operands[2]) == CONST_INT)
2270 if (INTVAL (operands[2]) > 0
2271 && INTVAL (operands[2]) <= 8)
2272 return "addq%.l %2,%0";
2273 if (INTVAL (operands[2]) < 0
2274 && INTVAL (operands[2]) >= -8)
2276 operands[2] = GEN_INT (- INTVAL (operands[2]));
2277 return "subq%.l %2,%0";
2279 /* On the CPU32 it is faster to use two addql instructions to
2280 add a small integer (8 < N <= 16) to a register.
2281 Likewise for subql. */
2282 if (TARGET_CPU32 && REG_P (operands[0]))
2284 if (INTVAL (operands[2]) > 8
2285 && INTVAL (operands[2]) <= 16)
2287 operands[2] = GEN_INT (INTVAL (operands[2]) - 8);
2288 return "addq%.l #8,%0\n\taddq%.l %2,%0";
2290 if (INTVAL (operands[2]) < -8
2291 && INTVAL (operands[2]) >= -16)
2293 operands[2] = GEN_INT (- INTVAL (operands[2]) - 8);
2294 return "subq%.l #8,%0\n\tsubq%.l %2,%0";
2297 if (ADDRESS_REG_P (operands[0])
2298 && INTVAL (operands[2]) >= -0x8000
2299 && INTVAL (operands[2]) < 0x8000)
2301 if (TARGET_68040)
2302 return "add%.w %2,%0";
2303 else
2304 return MOTOROLA ? "lea (%c2,%0),%0" : "lea %0@(%c2),%0";
2307 return "add%.l %2,%0";
2310 /* Store in cc_status the expressions that the condition codes will
2311 describe after execution of an instruction whose pattern is EXP.
2312 Do not alter them if the instruction would not alter the cc's. */
2314 /* On the 68000, all the insns to store in an address register fail to
2315 set the cc's. However, in some cases these instructions can make it
2316 possibly invalid to use the saved cc's. In those cases we clear out
2317 some or all of the saved cc's so they won't be used. */
2319 void
2320 notice_update_cc (rtx exp, rtx insn)
2322 if (GET_CODE (exp) == SET)
2324 if (GET_CODE (SET_SRC (exp)) == CALL)
2326 CC_STATUS_INIT;
2328 else if (ADDRESS_REG_P (SET_DEST (exp)))
2330 if (cc_status.value1 && modified_in_p (cc_status.value1, insn))
2331 cc_status.value1 = 0;
2332 if (cc_status.value2 && modified_in_p (cc_status.value2, insn))
2333 cc_status.value2 = 0;
2335 else if (!FP_REG_P (SET_DEST (exp))
2336 && SET_DEST (exp) != cc0_rtx
2337 && (FP_REG_P (SET_SRC (exp))
2338 || GET_CODE (SET_SRC (exp)) == FIX
2339 || GET_CODE (SET_SRC (exp)) == FLOAT_TRUNCATE
2340 || GET_CODE (SET_SRC (exp)) == FLOAT_EXTEND))
2342 CC_STATUS_INIT;
2344 /* A pair of move insns doesn't produce a useful overall cc. */
2345 else if (!FP_REG_P (SET_DEST (exp))
2346 && !FP_REG_P (SET_SRC (exp))
2347 && GET_MODE_SIZE (GET_MODE (SET_SRC (exp))) > 4
2348 && (GET_CODE (SET_SRC (exp)) == REG
2349 || GET_CODE (SET_SRC (exp)) == MEM
2350 || GET_CODE (SET_SRC (exp)) == CONST_DOUBLE))
2352 CC_STATUS_INIT;
2354 else if (GET_CODE (SET_SRC (exp)) == CALL)
2356 CC_STATUS_INIT;
2358 else if (XEXP (exp, 0) != pc_rtx)
2360 cc_status.flags = 0;
2361 cc_status.value1 = XEXP (exp, 0);
2362 cc_status.value2 = XEXP (exp, 1);
2365 else if (GET_CODE (exp) == PARALLEL
2366 && GET_CODE (XVECEXP (exp, 0, 0)) == SET)
2368 if (ADDRESS_REG_P (XEXP (XVECEXP (exp, 0, 0), 0)))
2369 CC_STATUS_INIT;
2370 else if (XEXP (XVECEXP (exp, 0, 0), 0) != pc_rtx)
2372 cc_status.flags = 0;
2373 cc_status.value1 = XEXP (XVECEXP (exp, 0, 0), 0);
2374 cc_status.value2 = XEXP (XVECEXP (exp, 0, 0), 1);
2377 else
2378 CC_STATUS_INIT;
2379 if (cc_status.value2 != 0
2380 && ADDRESS_REG_P (cc_status.value2)
2381 && GET_MODE (cc_status.value2) == QImode)
2382 CC_STATUS_INIT;
2383 if (cc_status.value2 != 0)
2384 switch (GET_CODE (cc_status.value2))
2386 case ASHIFT: case ASHIFTRT: case LSHIFTRT:
2387 case ROTATE: case ROTATERT:
2388 /* These instructions always clear the overflow bit, and set
2389 the carry to the bit shifted out. */
2390 /* ??? We don't currently have a way to signal carry not valid,
2391 nor do we check for it in the branch insns. */
2392 CC_STATUS_INIT;
2393 break;
2395 case PLUS: case MINUS: case MULT:
2396 case DIV: case UDIV: case MOD: case UMOD: case NEG:
2397 if (GET_MODE (cc_status.value2) != VOIDmode)
2398 cc_status.flags |= CC_NO_OVERFLOW;
2399 break;
2400 case ZERO_EXTEND:
2401 /* (SET r1 (ZERO_EXTEND r2)) on this machine
2402 ends with a move insn moving r2 in r2's mode.
2403 Thus, the cc's are set for r2.
2404 This can set N bit spuriously. */
2405 cc_status.flags |= CC_NOT_NEGATIVE;
2407 default:
2408 break;
2410 if (cc_status.value1 && GET_CODE (cc_status.value1) == REG
2411 && cc_status.value2
2412 && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2))
2413 cc_status.value2 = 0;
2414 if (((cc_status.value1 && FP_REG_P (cc_status.value1))
2415 || (cc_status.value2 && FP_REG_P (cc_status.value2))))
2416 cc_status.flags = CC_IN_68881;
2419 const char *
2420 output_move_const_double (rtx *operands)
2422 int code = standard_68881_constant_p (operands[1]);
2424 if (code != 0)
2426 static char buf[40];
2428 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
2429 return buf;
2431 return "fmove%.d %1,%0";
2434 const char *
2435 output_move_const_single (rtx *operands)
2437 int code = standard_68881_constant_p (operands[1]);
2439 if (code != 0)
2441 static char buf[40];
2443 sprintf (buf, "fmovecr #0x%x,%%0", code & 0xff);
2444 return buf;
2446 return "fmove%.s %f1,%0";
2449 /* Return nonzero if X, a CONST_DOUBLE, has a value that we can get
2450 from the "fmovecr" instruction.
2451 The value, anded with 0xff, gives the code to use in fmovecr
2452 to get the desired constant. */
2454 /* This code has been fixed for cross-compilation. */
2456 static int inited_68881_table = 0;
2458 static const char *const strings_68881[7] = {
2459 "0.0",
2460 "1.0",
2461 "10.0",
2462 "100.0",
2463 "10000.0",
2464 "1e8",
2465 "1e16"
2468 static const int codes_68881[7] = {
2469 0x0f,
2470 0x32,
2471 0x33,
2472 0x34,
2473 0x35,
2474 0x36,
2475 0x37
2478 REAL_VALUE_TYPE values_68881[7];
2480 /* Set up values_68881 array by converting the decimal values
2481 strings_68881 to binary. */
2483 void
2484 init_68881_table (void)
2486 int i;
2487 REAL_VALUE_TYPE r;
2488 enum machine_mode mode;
2490 mode = SFmode;
2491 for (i = 0; i < 7; i++)
2493 if (i == 6)
2494 mode = DFmode;
2495 r = REAL_VALUE_ATOF (strings_68881[i], mode);
2496 values_68881[i] = r;
2498 inited_68881_table = 1;
2502 standard_68881_constant_p (rtx x)
2504 REAL_VALUE_TYPE r;
2505 int i;
2507 /* fmovecr must be emulated on the 68040 and 68060, so it shouldn't be
2508 used at all on those chips. */
2509 if (TARGET_68040 || TARGET_68060)
2510 return 0;
2512 if (! inited_68881_table)
2513 init_68881_table ();
2515 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2517 /* Use REAL_VALUES_IDENTICAL instead of REAL_VALUES_EQUAL so that -0.0
2518 is rejected. */
2519 for (i = 0; i < 6; i++)
2521 if (REAL_VALUES_IDENTICAL (r, values_68881[i]))
2522 return (codes_68881[i]);
2525 if (GET_MODE (x) == SFmode)
2526 return 0;
2528 if (REAL_VALUES_EQUAL (r, values_68881[6]))
2529 return (codes_68881[6]);
2531 /* larger powers of ten in the constants ram are not used
2532 because they are not equal to a `double' C constant. */
2533 return 0;
2536 /* If X is a floating-point constant, return the logarithm of X base 2,
2537 or 0 if X is not a power of 2. */
2540 floating_exact_log2 (rtx x)
2542 REAL_VALUE_TYPE r, r1;
2543 int exp;
2545 REAL_VALUE_FROM_CONST_DOUBLE (r, x);
2547 if (REAL_VALUES_LESS (r, dconst1))
2548 return 0;
2550 exp = real_exponent (&r);
2551 real_2expN (&r1, exp);
2552 if (REAL_VALUES_EQUAL (r1, r))
2553 return exp;
2555 return 0;
2558 /* A C compound statement to output to stdio stream STREAM the
2559 assembler syntax for an instruction operand X. X is an RTL
2560 expression.
2562 CODE is a value that can be used to specify one of several ways
2563 of printing the operand. It is used when identical operands
2564 must be printed differently depending on the context. CODE
2565 comes from the `%' specification that was used to request
2566 printing of the operand. If the specification was just `%DIGIT'
2567 then CODE is 0; if the specification was `%LTR DIGIT' then CODE
2568 is the ASCII code for LTR.
2570 If X is a register, this macro should print the register's name.
2571 The names can be found in an array `reg_names' whose type is
2572 `char *[]'. `reg_names' is initialized from `REGISTER_NAMES'.
2574 When the machine description has a specification `%PUNCT' (a `%'
2575 followed by a punctuation character), this macro is called with
2576 a null pointer for X and the punctuation character for CODE.
2578 The m68k specific codes are:
2580 '.' for dot needed in Motorola-style opcode names.
2581 '-' for an operand pushing on the stack:
2582 sp@-, -(sp) or -(%sp) depending on the style of syntax.
2583 '+' for an operand pushing on the stack:
2584 sp@+, (sp)+ or (%sp)+ depending on the style of syntax.
2585 '@' for a reference to the top word on the stack:
2586 sp@, (sp) or (%sp) depending on the style of syntax.
2587 '#' for an immediate operand prefix (# in MIT and Motorola syntax
2588 but & in SGS syntax).
2589 '!' for the cc register (used in an `and to cc' insn).
2590 '$' for the letter `s' in an op code, but only on the 68040.
2591 '&' for the letter `d' in an op code, but only on the 68040.
2592 '/' for register prefix needed by longlong.h.
2594 'b' for byte insn (no effect, on the Sun; this is for the ISI).
2595 'd' to force memory addressing to be absolute, not relative.
2596 'f' for float insn (print a CONST_DOUBLE as a float rather than in hex)
2597 'o' for operands to go directly to output_operand_address (bypassing
2598 print_operand_address--used only for SYMBOL_REFs under TARGET_PCREL)
2599 'x' for float insn (print a CONST_DOUBLE as a float rather than in hex),
2600 or print pair of registers as rx:ry.
2604 void
2605 print_operand (FILE *file, rtx op, int letter)
2607 if (letter == '.')
2609 if (MOTOROLA)
2610 fprintf (file, ".");
2612 else if (letter == '#')
2613 asm_fprintf (file, "%I");
2614 else if (letter == '-')
2615 asm_fprintf (file, MOTOROLA ? "-(%Rsp)" : "%Rsp@-");
2616 else if (letter == '+')
2617 asm_fprintf (file, MOTOROLA ? "(%Rsp)+" : "%Rsp@+");
2618 else if (letter == '@')
2619 asm_fprintf (file, MOTOROLA ? "(%Rsp)" : "%Rsp@");
2620 else if (letter == '!')
2621 asm_fprintf (file, "%Rfpcr");
2622 else if (letter == '$')
2624 if (TARGET_68040_ONLY)
2625 fprintf (file, "s");
2627 else if (letter == '&')
2629 if (TARGET_68040_ONLY)
2630 fprintf (file, "d");
2632 else if (letter == '/')
2633 asm_fprintf (file, "%R");
2634 else if (letter == 'o')
2636 /* This is only for direct addresses with TARGET_PCREL */
2637 if (GET_CODE (op) != MEM || GET_CODE (XEXP (op, 0)) != SYMBOL_REF
2638 || !TARGET_PCREL)
2639 abort ();
2640 output_addr_const (file, XEXP (op, 0));
2642 else if (GET_CODE (op) == REG)
2644 if (letter == 'R')
2645 /* Print out the second register name of a register pair.
2646 I.e., R (6) => 7. */
2647 fputs (M68K_REGNAME(REGNO (op) + 1), file);
2648 else
2649 fputs (M68K_REGNAME(REGNO (op)), file);
2651 else if (GET_CODE (op) == MEM)
2653 output_address (XEXP (op, 0));
2654 if (letter == 'd' && ! TARGET_68020
2655 && CONSTANT_ADDRESS_P (XEXP (op, 0))
2656 && !(GET_CODE (XEXP (op, 0)) == CONST_INT
2657 && INTVAL (XEXP (op, 0)) < 0x8000
2658 && INTVAL (XEXP (op, 0)) >= -0x8000))
2659 fprintf (file, MOTOROLA ? ".l" : ":l");
2661 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == SFmode)
2663 REAL_VALUE_TYPE r;
2664 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
2665 ASM_OUTPUT_FLOAT_OPERAND (letter, file, r);
2667 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == XFmode)
2669 REAL_VALUE_TYPE r;
2670 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
2671 ASM_OUTPUT_LONG_DOUBLE_OPERAND (file, r);
2673 else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == DFmode)
2675 REAL_VALUE_TYPE r;
2676 REAL_VALUE_FROM_CONST_DOUBLE (r, op);
2677 ASM_OUTPUT_DOUBLE_OPERAND (file, r);
2679 else
2681 /* Use `print_operand_address' instead of `output_addr_const'
2682 to ensure that we print relevant PIC stuff. */
2683 asm_fprintf (file, "%I");
2684 if (TARGET_PCREL
2685 && (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == CONST))
2686 print_operand_address (file, op);
2687 else
2688 output_addr_const (file, op);
2693 /* A C compound statement to output to stdio stream STREAM the
2694 assembler syntax for an instruction operand that is a memory
2695 reference whose address is ADDR. ADDR is an RTL expression.
2697 Note that this contains a kludge that knows that the only reason
2698 we have an address (plus (label_ref...) (reg...)) when not generating
2699 PIC code is in the insn before a tablejump, and we know that m68k.md
2700 generates a label LInnn: on such an insn.
2702 It is possible for PIC to generate a (plus (label_ref...) (reg...))
2703 and we handle that just like we would a (plus (symbol_ref...) (reg...)).
2705 Some SGS assemblers have a bug such that "Lnnn-LInnn-2.b(pc,d0.l*2)"
2706 fails to assemble. Luckily "Lnnn(pc,d0.l*2)" produces the results
2707 we want. This difference can be accommodated by using an assembler
2708 define such "LDnnn" to be either "Lnnn-LInnn-2.b", "Lnnn", or any other
2709 string, as necessary. This is accomplished via the ASM_OUTPUT_CASE_END
2710 macro. See m68k/sgs.h for an example; for versions without the bug.
2711 Some assemblers refuse all the above solutions. The workaround is to
2712 emit "K(pc,d0.l*2)" with K being a small constant known to give the
2713 right behavior.
2715 They also do not like things like "pea 1.w", so we simple leave off
2716 the .w on small constants.
2718 This routine is responsible for distinguishing between -fpic and -fPIC
2719 style relocations in an address. When generating -fpic code the
2720 offset is output in word mode (e.g. movel a5@(_foo:w), a0). When generating
2721 -fPIC code the offset is output in long mode (e.g. movel a5@(_foo:l), a0) */
2723 #if MOTOROLA
2724 # define ASM_OUTPUT_CASE_FETCH(file, labelno, regname)\
2725 asm_fprintf (file, "%LL%d-%LLI%d.b(%Rpc,%s.", labelno, labelno, regname)
2726 #else /* !MOTOROLA */
2727 # define ASM_OUTPUT_CASE_FETCH(file, labelno, regname)\
2728 asm_fprintf (file, "%Rpc@(%LL%d-%LLI%d-2:b,%s:", labelno, labelno, regname)
2729 #endif /* !MOTOROLA */
2731 void
2732 print_operand_address (FILE *file, rtx addr)
2734 register rtx reg1, reg2, breg, ireg;
2735 rtx offset;
2737 switch (GET_CODE (addr))
2739 case REG:
2740 fprintf (file, MOTOROLA ? "(%s)" : "%s@", M68K_REGNAME(REGNO (addr)));
2741 break;
2742 case PRE_DEC:
2743 fprintf (file, MOTOROLA ? "-(%s)" : "%s@-",
2744 M68K_REGNAME(REGNO (XEXP (addr, 0))));
2745 break;
2746 case POST_INC:
2747 fprintf (file, MOTOROLA ? "(%s)+" : "%s@+",
2748 M68K_REGNAME(REGNO (XEXP (addr, 0))));
2749 break;
2750 case PLUS:
2751 reg1 = reg2 = ireg = breg = offset = 0;
2752 if (CONSTANT_ADDRESS_P (XEXP (addr, 0)))
2754 offset = XEXP (addr, 0);
2755 addr = XEXP (addr, 1);
2757 else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)))
2759 offset = XEXP (addr, 1);
2760 addr = XEXP (addr, 0);
2762 if (GET_CODE (addr) != PLUS)
2766 else if (GET_CODE (XEXP (addr, 0)) == SIGN_EXTEND)
2768 reg1 = XEXP (addr, 0);
2769 addr = XEXP (addr, 1);
2771 else if (GET_CODE (XEXP (addr, 1)) == SIGN_EXTEND)
2773 reg1 = XEXP (addr, 1);
2774 addr = XEXP (addr, 0);
2776 else if (GET_CODE (XEXP (addr, 0)) == MULT)
2778 reg1 = XEXP (addr, 0);
2779 addr = XEXP (addr, 1);
2781 else if (GET_CODE (XEXP (addr, 1)) == MULT)
2783 reg1 = XEXP (addr, 1);
2784 addr = XEXP (addr, 0);
2786 else if (GET_CODE (XEXP (addr, 0)) == REG)
2788 reg1 = XEXP (addr, 0);
2789 addr = XEXP (addr, 1);
2791 else if (GET_CODE (XEXP (addr, 1)) == REG)
2793 reg1 = XEXP (addr, 1);
2794 addr = XEXP (addr, 0);
2796 if (GET_CODE (addr) == REG || GET_CODE (addr) == MULT
2797 || GET_CODE (addr) == SIGN_EXTEND)
2799 if (reg1 == 0)
2801 reg1 = addr;
2803 else
2805 reg2 = addr;
2807 addr = 0;
2809 #if 0 /* for OLD_INDEXING */
2810 else if (GET_CODE (addr) == PLUS)
2812 if (GET_CODE (XEXP (addr, 0)) == REG)
2814 reg2 = XEXP (addr, 0);
2815 addr = XEXP (addr, 1);
2817 else if (GET_CODE (XEXP (addr, 1)) == REG)
2819 reg2 = XEXP (addr, 1);
2820 addr = XEXP (addr, 0);
2823 #endif
2824 if (offset != 0)
2826 if (addr != 0)
2828 abort ();
2830 addr = offset;
2832 if ((reg1 && (GET_CODE (reg1) == SIGN_EXTEND
2833 || GET_CODE (reg1) == MULT))
2834 || (reg2 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg2))))
2836 breg = reg2;
2837 ireg = reg1;
2839 else if (reg1 != 0 && REGNO_OK_FOR_BASE_P (REGNO (reg1)))
2841 breg = reg1;
2842 ireg = reg2;
2844 if (ireg != 0 && breg == 0 && GET_CODE (addr) == LABEL_REF
2845 && ! (flag_pic && ireg == pic_offset_table_rtx))
2847 int scale = 1;
2848 if (GET_CODE (ireg) == MULT)
2850 scale = INTVAL (XEXP (ireg, 1));
2851 ireg = XEXP (ireg, 0);
2853 if (GET_CODE (ireg) == SIGN_EXTEND)
2855 ASM_OUTPUT_CASE_FETCH (file,
2856 CODE_LABEL_NUMBER (XEXP (addr, 0)),
2857 M68K_REGNAME(REGNO (XEXP (ireg, 0))));
2858 fprintf (file, "w");
2860 else
2862 ASM_OUTPUT_CASE_FETCH (file,
2863 CODE_LABEL_NUMBER (XEXP (addr, 0)),
2864 M68K_REGNAME(REGNO (ireg)));
2865 fprintf (file, "l");
2867 if (scale != 1)
2868 fprintf (file, MOTOROLA ? "*%d" : ":%d", scale);
2869 putc (')', file);
2870 break;
2872 if (breg != 0 && ireg == 0 && GET_CODE (addr) == LABEL_REF
2873 && ! (flag_pic && breg == pic_offset_table_rtx))
2875 ASM_OUTPUT_CASE_FETCH (file,
2876 CODE_LABEL_NUMBER (XEXP (addr, 0)),
2877 M68K_REGNAME(REGNO (breg)));
2878 fprintf (file, "l)");
2879 break;
2881 if (ireg != 0 || breg != 0)
2883 int scale = 1;
2884 if (breg == 0)
2886 abort ();
2888 if (! flag_pic && addr && GET_CODE (addr) == LABEL_REF)
2890 abort ();
2892 if (MOTOROLA)
2894 if (addr != 0)
2896 output_addr_const (file, addr);
2897 if (flag_pic && (breg == pic_offset_table_rtx))
2899 fprintf (file, "@GOT");
2900 if (flag_pic == 1)
2901 fprintf (file, ".w");
2904 fprintf (file, "(%s", M68K_REGNAME(REGNO (breg)));
2905 if (ireg != 0)
2906 putc (',', file);
2908 else /* !MOTOROLA */
2910 fprintf (file, "%s@(", M68K_REGNAME(REGNO (breg)));
2911 if (addr != 0)
2913 output_addr_const (file, addr);
2914 if (breg == pic_offset_table_rtx)
2915 switch (flag_pic)
2917 case 1:
2918 fprintf (file, ":w"); break;
2919 case 2:
2920 fprintf (file, ":l"); break;
2921 default:
2922 break;
2924 if (ireg != 0)
2925 putc (',', file);
2927 } /* !MOTOROLA */
2928 if (ireg != 0 && GET_CODE (ireg) == MULT)
2930 scale = INTVAL (XEXP (ireg, 1));
2931 ireg = XEXP (ireg, 0);
2933 if (ireg != 0 && GET_CODE (ireg) == SIGN_EXTEND)
2934 fprintf (file, MOTOROLA ? "%s.w" : "%s:w",
2935 M68K_REGNAME(REGNO (XEXP (ireg, 0))));
2936 else if (ireg != 0)
2937 fprintf (file, MOTOROLA ? "%s.l" : "%s:l",
2938 M68K_REGNAME(REGNO (ireg)));
2939 if (scale != 1)
2940 fprintf (file, MOTOROLA ? "*%d" : ":%d", scale);
2941 putc (')', file);
2942 break;
2944 else if (reg1 != 0 && GET_CODE (addr) == LABEL_REF
2945 && ! (flag_pic && reg1 == pic_offset_table_rtx))
2947 ASM_OUTPUT_CASE_FETCH (file,
2948 CODE_LABEL_NUMBER (XEXP (addr, 0)),
2949 M68K_REGNAME(REGNO (reg1)));
2950 fprintf (file, "l)");
2951 break;
2953 /* FALL-THROUGH (is this really what we want?) */
2954 default:
2955 if (GET_CODE (addr) == CONST_INT
2956 && INTVAL (addr) < 0x8000
2957 && INTVAL (addr) >= -0x8000)
2959 fprintf (file, MOTOROLA ? "%d.w" : "%d:w", (int) INTVAL (addr));
2961 else if (GET_CODE (addr) == CONST_INT)
2963 fprintf (file, HOST_WIDE_INT_PRINT_DEC, INTVAL (addr));
2965 else if (TARGET_PCREL)
2967 fputc ('(', file);
2968 output_addr_const (file, addr);
2969 if (flag_pic == 1)
2970 asm_fprintf (file, ":w,%Rpc)");
2971 else
2972 asm_fprintf (file, ":l,%Rpc)");
2974 else
2976 /* Special case for SYMBOL_REF if the symbol name ends in
2977 `.<letter>', this can be mistaken as a size suffix. Put
2978 the name in parentheses. */
2979 if (GET_CODE (addr) == SYMBOL_REF
2980 && strlen (XSTR (addr, 0)) > 2
2981 && XSTR (addr, 0)[strlen (XSTR (addr, 0)) - 2] == '.')
2983 putc ('(', file);
2984 output_addr_const (file, addr);
2985 putc (')', file);
2987 else
2988 output_addr_const (file, addr);
2990 break;
2994 /* Check for cases where a clr insns can be omitted from code using
2995 strict_low_part sets. For example, the second clrl here is not needed:
2996 clrl d0; movw a0@+,d0; use d0; clrl d0; movw a0@+; use d0; ...
2998 MODE is the mode of this STRICT_LOW_PART set. FIRST_INSN is the clear
2999 insn we are checking for redundancy. TARGET is the register set by the
3000 clear insn. */
3002 bool
3003 strict_low_part_peephole_ok (enum machine_mode mode, rtx first_insn,
3004 rtx target)
3006 rtx p;
3008 p = prev_nonnote_insn (first_insn);
3010 while (p)
3012 /* If it isn't an insn, then give up. */
3013 if (GET_CODE (p) != INSN)
3014 return false;
3016 if (reg_set_p (target, p))
3018 rtx set = single_set (p);
3019 rtx dest;
3021 /* If it isn't an easy to recognize insn, then give up. */
3022 if (! set)
3023 return false;
3025 dest = SET_DEST (set);
3027 /* If this sets the entire target register to zero, then our
3028 first_insn is redundant. */
3029 if (rtx_equal_p (dest, target)
3030 && SET_SRC (set) == const0_rtx)
3031 return true;
3032 else if (GET_CODE (dest) == STRICT_LOW_PART
3033 && GET_CODE (XEXP (dest, 0)) == REG
3034 && REGNO (XEXP (dest, 0)) == REGNO (target)
3035 && (GET_MODE_SIZE (GET_MODE (XEXP (dest, 0)))
3036 <= GET_MODE_SIZE (mode)))
3037 /* This is a strict low part set which modifies less than
3038 we are using, so it is safe. */
3040 else
3041 return false;
3044 p = prev_nonnote_insn (p);
3047 return false;
3050 /* Accept integer operands in the range 0..0xffffffff. We have to check the
3051 range carefully since this predicate is used in DImode contexts. Also, we
3052 need some extra crud to make it work when hosted on 64-bit machines. */
3055 const_uint32_operand (rtx op, enum machine_mode mode)
3057 /* It doesn't make sense to ask this question with a mode that is
3058 not larger than 32 bits. */
3059 if (GET_MODE_BITSIZE (mode) <= 32)
3060 abort ();
3062 #if HOST_BITS_PER_WIDE_INT > 32
3063 /* All allowed constants will fit a CONST_INT. */
3064 return (GET_CODE (op) == CONST_INT
3065 && (INTVAL (op) >= 0 && INTVAL (op) <= 0xffffffffL));
3066 #else
3067 return (GET_CODE (op) == CONST_INT
3068 || (GET_CODE (op) == CONST_DOUBLE && CONST_DOUBLE_HIGH (op) == 0));
3069 #endif
3072 /* Accept integer operands in the range -0x80000000..0x7fffffff. We have
3073 to check the range carefully since this predicate is used in DImode
3074 contexts. */
3077 const_sint32_operand (rtx op, enum machine_mode mode)
3079 /* It doesn't make sense to ask this question with a mode that is
3080 not larger than 32 bits. */
3081 if (GET_MODE_BITSIZE (mode) <= 32)
3082 abort ();
3084 /* All allowed constants will fit a CONST_INT. */
3085 return (GET_CODE (op) == CONST_INT
3086 && (INTVAL (op) >= (-0x7fffffff - 1) && INTVAL (op) <= 0x7fffffff));
3089 /* Operand predicates for implementing asymmetric pc-relative addressing
3090 on m68k. The m68k supports pc-relative addressing (mode 7, register 2)
3091 when used as a source operand, but not as a destination operand.
3093 We model this by restricting the meaning of the basic predicates
3094 (general_operand, memory_operand, etc) to forbid the use of this
3095 addressing mode, and then define the following predicates that permit
3096 this addressing mode. These predicates can then be used for the
3097 source operands of the appropriate instructions.
3099 n.b. While it is theoretically possible to change all machine patterns
3100 to use this addressing more where permitted by the architecture,
3101 it has only been implemented for "common" cases: SImode, HImode, and
3102 QImode operands, and only for the principle operations that would
3103 require this addressing mode: data movement and simple integer operations.
3105 In parallel with these new predicates, two new constraint letters
3106 were defined: 'S' and 'T'. 'S' is the -mpcrel analog of 'm'.
3107 'T' replaces 's' in the non-pcrel case. It is a no-op in the pcrel case.
3108 In the pcrel case 's' is only valid in combination with 'a' registers.
3109 See addsi3, subsi3, cmpsi, and movsi patterns for a better understanding
3110 of how these constraints are used.
3112 The use of these predicates is strictly optional, though patterns that
3113 don't will cause an extra reload register to be allocated where one
3114 was not necessary:
3116 lea (abc:w,%pc),%a0 ; need to reload address
3117 moveq &1,%d1 ; since write to pc-relative space
3118 movel %d1,%a0@ ; is not allowed
3120 lea (abc:w,%pc),%a1 ; no need to reload address here
3121 movel %a1@,%d0 ; since "movel (abc:w,%pc),%d0" is ok
3123 For more info, consult tiemann@cygnus.com.
3126 All of the ugliness with predicates and constraints is due to the
3127 simple fact that the m68k does not allow a pc-relative addressing
3128 mode as a destination. gcc does not distinguish between source and
3129 destination addresses. Hence, if we claim that pc-relative address
3130 modes are valid, e.g. GO_IF_LEGITIMATE_ADDRESS accepts them, then we
3131 end up with invalid code. To get around this problem, we left
3132 pc-relative modes as invalid addresses, and then added special
3133 predicates and constraints to accept them.
3135 A cleaner way to handle this is to modify gcc to distinguish
3136 between source and destination addresses. We can then say that
3137 pc-relative is a valid source address but not a valid destination
3138 address, and hopefully avoid a lot of the predicate and constraint
3139 hackery. Unfortunately, this would be a pretty big change. It would
3140 be a useful change for a number of ports, but there aren't any current
3141 plans to undertake this.
3143 ***************************************************************************/
3146 /* Special case of a general operand that's used as a source operand.
3147 Use this to permit reads from PC-relative memory when -mpcrel
3148 is specified. */
3151 general_src_operand (rtx op, enum machine_mode mode)
3153 if (TARGET_PCREL
3154 && GET_CODE (op) == MEM
3155 && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
3156 || GET_CODE (XEXP (op, 0)) == LABEL_REF
3157 || GET_CODE (XEXP (op, 0)) == CONST))
3158 return 1;
3159 return general_operand (op, mode);
3162 /* Special case of a nonimmediate operand that's used as a source.
3163 Use this to permit reads from PC-relative memory when -mpcrel
3164 is specified. */
3167 nonimmediate_src_operand (rtx op, enum machine_mode mode)
3169 if (TARGET_PCREL && GET_CODE (op) == MEM
3170 && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
3171 || GET_CODE (XEXP (op, 0)) == LABEL_REF
3172 || GET_CODE (XEXP (op, 0)) == CONST))
3173 return 1;
3174 return nonimmediate_operand (op, mode);
3177 /* Special case of a memory operand that's used as a source.
3178 Use this to permit reads from PC-relative memory when -mpcrel
3179 is specified. */
3182 memory_src_operand (rtx op, enum machine_mode mode)
3184 if (TARGET_PCREL && GET_CODE (op) == MEM
3185 && (GET_CODE (XEXP (op, 0)) == SYMBOL_REF
3186 || GET_CODE (XEXP (op, 0)) == LABEL_REF
3187 || GET_CODE (XEXP (op, 0)) == CONST))
3188 return 1;
3189 return memory_operand (op, mode);
3193 post_inc_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3195 return MEM_P (op) && GET_CODE (XEXP (op, 0)) == POST_INC;
3199 pre_dec_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3201 return MEM_P (op) && GET_CODE (XEXP (op, 0)) == PRE_DEC;
3204 /* Predicate that accepts only a pc-relative address. This is needed
3205 because pc-relative addresses don't satisfy the predicate
3206 "general_src_operand". */
3209 pcrel_address (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
3211 return (GET_CODE (op) == SYMBOL_REF || GET_CODE (op) == LABEL_REF
3212 || GET_CODE (op) == CONST);
3215 const char *
3216 output_andsi3 (rtx *operands)
3218 int logval;
3219 if (GET_CODE (operands[2]) == CONST_INT
3220 && (INTVAL (operands[2]) | 0xffff) == -1
3221 && (DATA_REG_P (operands[0])
3222 || offsettable_memref_p (operands[0]))
3223 && !TARGET_COLDFIRE)
3225 if (GET_CODE (operands[0]) != REG)
3226 operands[0] = adjust_address (operands[0], HImode, 2);
3227 operands[2] = GEN_INT (INTVAL (operands[2]) & 0xffff);
3228 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3229 CC_STATUS_INIT;
3230 if (operands[2] == const0_rtx)
3231 return "clr%.w %0";
3232 return "and%.w %2,%0";
3234 if (GET_CODE (operands[2]) == CONST_INT
3235 && (logval = exact_log2 (~ INTVAL (operands[2]))) >= 0
3236 && (DATA_REG_P (operands[0])
3237 || offsettable_memref_p (operands[0])))
3239 if (DATA_REG_P (operands[0]))
3241 operands[1] = GEN_INT (logval);
3243 else
3245 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3246 operands[1] = GEN_INT (logval % 8);
3248 /* This does not set condition codes in a standard way. */
3249 CC_STATUS_INIT;
3250 return "bclr %1,%0";
3252 return "and%.l %2,%0";
3255 const char *
3256 output_iorsi3 (rtx *operands)
3258 register int logval;
3259 if (GET_CODE (operands[2]) == CONST_INT
3260 && INTVAL (operands[2]) >> 16 == 0
3261 && (DATA_REG_P (operands[0])
3262 || offsettable_memref_p (operands[0]))
3263 && !TARGET_COLDFIRE)
3265 if (GET_CODE (operands[0]) != REG)
3266 operands[0] = adjust_address (operands[0], HImode, 2);
3267 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3268 CC_STATUS_INIT;
3269 if (INTVAL (operands[2]) == 0xffff)
3270 return "mov%.w %2,%0";
3271 return "or%.w %2,%0";
3273 if (GET_CODE (operands[2]) == CONST_INT
3274 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
3275 && (DATA_REG_P (operands[0])
3276 || offsettable_memref_p (operands[0])))
3278 if (DATA_REG_P (operands[0]))
3279 operands[1] = GEN_INT (logval);
3280 else
3282 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3283 operands[1] = GEN_INT (logval % 8);
3285 CC_STATUS_INIT;
3286 return "bset %1,%0";
3288 return "or%.l %2,%0";
3291 const char *
3292 output_xorsi3 (rtx *operands)
3294 register int logval;
3295 if (GET_CODE (operands[2]) == CONST_INT
3296 && INTVAL (operands[2]) >> 16 == 0
3297 && (offsettable_memref_p (operands[0]) || DATA_REG_P (operands[0]))
3298 && !TARGET_COLDFIRE)
3300 if (! DATA_REG_P (operands[0]))
3301 operands[0] = adjust_address (operands[0], HImode, 2);
3302 /* Do not delete a following tstl %0 insn; that would be incorrect. */
3303 CC_STATUS_INIT;
3304 if (INTVAL (operands[2]) == 0xffff)
3305 return "not%.w %0";
3306 return "eor%.w %2,%0";
3308 if (GET_CODE (operands[2]) == CONST_INT
3309 && (logval = exact_log2 (INTVAL (operands[2]))) >= 0
3310 && (DATA_REG_P (operands[0])
3311 || offsettable_memref_p (operands[0])))
3313 if (DATA_REG_P (operands[0]))
3314 operands[1] = GEN_INT (logval);
3315 else
3317 operands[0] = adjust_address (operands[0], SImode, 3 - (logval / 8));
3318 operands[1] = GEN_INT (logval % 8);
3320 CC_STATUS_INIT;
3321 return "bchg %1,%0";
3323 return "eor%.l %2,%0";
3326 #ifdef M68K_TARGET_COFF
3328 /* Output assembly to switch to section NAME with attribute FLAGS. */
3330 static void
3331 m68k_coff_asm_named_section (const char *name, unsigned int flags,
3332 tree decl ATTRIBUTE_UNUSED)
3334 char flagchar;
3336 if (flags & SECTION_WRITE)
3337 flagchar = 'd';
3338 else
3339 flagchar = 'x';
3341 fprintf (asm_out_file, "\t.section\t%s,\"%c\"\n", name, flagchar);
3344 #endif /* M68K_TARGET_COFF */
3346 static void
3347 m68k_output_mi_thunk (FILE *file, tree thunk ATTRIBUTE_UNUSED,
3348 HOST_WIDE_INT delta,
3349 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED,
3350 tree function)
3352 rtx xops[1];
3353 const char *fmt;
3355 if (delta > 0 && delta <= 8)
3356 asm_fprintf (file, MOTOROLA ?
3357 "\taddq.l %I%d,4(%Rsp)\n" :
3358 "\taddql %I%d,%Rsp@(4)\n",
3359 (int) delta);
3360 else if (delta < 0 && delta >= -8)
3361 asm_fprintf (file, MOTOROLA ?
3362 "\tsubq.l %I%d,4(%Rsp)\n" :
3363 "\tsubql %I%d,%Rsp@(4)\n",
3364 (int) -delta);
3365 else if (TARGET_COLDFIRE)
3367 /* ColdFire can't add/sub a constant to memory unless it is in
3368 the range of addq/subq. So load the value into %d0 and
3369 then add it to 4(%sp). */
3370 if (delta >= -128 && delta <= 127)
3371 asm_fprintf (file, MOTOROLA ?
3372 "\tmoveq.l %I%wd,%Rd0\n" :
3373 "\tmoveql %I%wd,%Rd0\n", delta);
3374 else
3375 asm_fprintf (file, MOTOROLA ?
3376 "\tmove.l %I%wd,%Rd0\n" :
3377 "\tmovel %I%wd,%Rd0\n", delta);
3378 asm_fprintf (file, MOTOROLA ?
3379 "\tadd.l %Rd0,4(%Rsp)\n" :
3380 "\taddl %Rd0,%Rsp@(4)\n");
3382 else
3383 asm_fprintf (file, MOTOROLA ?
3384 "\tadd.l %I%wd,4(%Rsp)\n" :
3385 "\taddl %I%wd,%Rsp@(4)\n",
3386 delta);
3388 xops[0] = DECL_RTL (function);
3390 /* Logic taken from call patterns in m68k.md. */
3391 if (flag_pic)
3393 if (TARGET_PCREL)
3394 fmt = "bra.l %o0";
3395 else if ((flag_pic == 1) || TARGET_68020)
3397 if (MOTOROLA)
3398 #if defined(USE_GAS)
3399 fmt = "bra.l %0@PLTPC";
3400 #else
3401 fmt = "bra %0@PLTPC";
3402 #endif
3403 else /* !MOTOROLA */
3404 #ifdef USE_GAS
3405 fmt = "bra.l %0";
3406 #else
3407 fmt = "jra %0,a1";
3408 #endif
3410 else if (optimize_size || TARGET_ID_SHARED_LIBRARY)
3411 fmt = "move.l %0@GOT(%%a5), %%a1\n\tjmp (%%a1)";
3412 else
3413 fmt = "lea %0-.-8,%%a1\n\tjsr 0(%%pc,%%a1)";
3415 else
3417 #if MOTOROLA && !defined (USE_GAS)
3418 fmt = "jmp %0";
3419 #else
3420 fmt = "jra %0";
3421 #endif
3424 output_asm_insn (fmt, xops);
3427 /* Worker function for TARGET_STRUCT_VALUE_RTX. */
3429 static rtx
3430 m68k_struct_value_rtx (tree fntype ATTRIBUTE_UNUSED,
3431 int incoming ATTRIBUTE_UNUSED)
3433 return gen_rtx_REG (Pmode, M68K_STRUCT_VALUE_REGNUM);
3436 /* Return nonzero if register old_reg can be renamed to register new_reg. */
3438 m68k_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
3439 unsigned int new_reg)
3442 /* Interrupt functions can only use registers that have already been
3443 saved by the prologue, even if they would normally be
3444 call-clobbered. */
3446 if (m68k_interrupt_function_p (current_function_decl)
3447 && !regs_ever_live[new_reg])
3448 return 0;
3450 return 1;