1 /* Subroutines for insn-output.c for Matsushita MN10300 series
2 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
4 Contributed by Jeff Law (law@cygnus.com).
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 3, or (at your option)
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 COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
29 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
34 #include "insn-attr.h"
45 #include "target-def.h"
47 /* This is used by GOTaddr2picreg to uniquely identify
49 int mn10300_unspec_int_label_counter
;
51 /* This is used in the am33_2.0-linux-gnu port, in which global symbol
52 names are not prefixed by underscores, to tell whether to prefix a
53 label with a plus sign or not, so that the assembler can tell
54 symbol names from register names. */
55 int mn10300_protect_label
;
57 /* The selected processor. */
58 enum processor_type mn10300_processor
= PROCESSOR_DEFAULT
;
60 /* The size of the callee register save area. Right now we save everything
61 on entry since it costs us nothing in code size. It does cost us from a
62 speed standpoint, so we want to optimize this sooner or later. */
63 #define REG_SAVE_BYTES (4 * df_regs_ever_live_p (2) \
64 + 4 * df_regs_ever_live_p (3) \
65 + 4 * df_regs_ever_live_p (6) \
66 + 4 * df_regs_ever_live_p (7) \
67 + 16 * (df_regs_ever_live_p (14) || df_regs_ever_live_p (15) \
68 || df_regs_ever_live_p (16) || df_regs_ever_live_p (17)))
71 static bool mn10300_handle_option (size_t, const char *, int);
72 static bool mn10300_legitimate_address_p (enum machine_mode
, rtx
, bool);
73 static int mn10300_address_cost_1 (rtx
, int *);
74 static int mn10300_address_cost (rtx
, bool);
75 static bool mn10300_rtx_costs (rtx
, int, int, int *, bool);
76 static void mn10300_file_start (void);
77 static bool mn10300_return_in_memory (const_tree
, const_tree
);
78 static rtx
mn10300_builtin_saveregs (void);
79 static void mn10300_va_start (tree
, rtx
);
80 static rtx
mn10300_legitimize_address (rtx
, rtx
, enum machine_mode
);
81 static bool mn10300_pass_by_reference (CUMULATIVE_ARGS
*, enum machine_mode
,
83 static int mn10300_arg_partial_bytes (CUMULATIVE_ARGS
*, enum machine_mode
,
85 static unsigned int mn10300_case_values_threshold (void);
86 static void mn10300_encode_section_info (tree
, rtx
, int);
87 static void mn10300_asm_trampoline_template (FILE *);
88 static void mn10300_trampoline_init (rtx
, tree
, rtx
);
89 static rtx
mn10300_function_value (const_tree
, const_tree
, bool);
90 static rtx
mn10300_libcall_value (enum machine_mode
, const_rtx
);
91 static void mn10300_asm_output_mi_thunk (FILE *, tree
, HOST_WIDE_INT
, HOST_WIDE_INT
, tree
);
92 static bool mn10300_can_output_mi_thunk (const_tree
, HOST_WIDE_INT
, HOST_WIDE_INT
, const_tree
);
94 /* Initialize the GCC target structure. */
95 #undef TARGET_ASM_ALIGNED_HI_OP
96 #define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
98 #undef TARGET_LEGITIMIZE_ADDRESS
99 #define TARGET_LEGITIMIZE_ADDRESS mn10300_legitimize_address
101 #undef TARGET_RTX_COSTS
102 #define TARGET_RTX_COSTS mn10300_rtx_costs
103 #undef TARGET_ADDRESS_COST
104 #define TARGET_ADDRESS_COST mn10300_address_cost
106 #undef TARGET_ASM_FILE_START
107 #define TARGET_ASM_FILE_START mn10300_file_start
108 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
109 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
111 #undef TARGET_DEFAULT_TARGET_FLAGS
112 #define TARGET_DEFAULT_TARGET_FLAGS MASK_MULT_BUG | MASK_PTR_A0D0
113 #undef TARGET_HANDLE_OPTION
114 #define TARGET_HANDLE_OPTION mn10300_handle_option
116 #undef TARGET_ENCODE_SECTION_INFO
117 #define TARGET_ENCODE_SECTION_INFO mn10300_encode_section_info
119 #undef TARGET_PROMOTE_PROTOTYPES
120 #define TARGET_PROMOTE_PROTOTYPES hook_bool_const_tree_true
121 #undef TARGET_RETURN_IN_MEMORY
122 #define TARGET_RETURN_IN_MEMORY mn10300_return_in_memory
123 #undef TARGET_PASS_BY_REFERENCE
124 #define TARGET_PASS_BY_REFERENCE mn10300_pass_by_reference
125 #undef TARGET_CALLEE_COPIES
126 #define TARGET_CALLEE_COPIES hook_bool_CUMULATIVE_ARGS_mode_tree_bool_true
127 #undef TARGET_ARG_PARTIAL_BYTES
128 #define TARGET_ARG_PARTIAL_BYTES mn10300_arg_partial_bytes
130 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
131 #define TARGET_EXPAND_BUILTIN_SAVEREGS mn10300_builtin_saveregs
132 #undef TARGET_EXPAND_BUILTIN_VA_START
133 #define TARGET_EXPAND_BUILTIN_VA_START mn10300_va_start
135 #undef TARGET_CASE_VALUES_THRESHOLD
136 #define TARGET_CASE_VALUES_THRESHOLD mn10300_case_values_threshold
138 #undef TARGET_LEGITIMATE_ADDRESS_P
139 #define TARGET_LEGITIMATE_ADDRESS_P mn10300_legitimate_address_p
141 #undef TARGET_ASM_TRAMPOLINE_TEMPLATE
142 #define TARGET_ASM_TRAMPOLINE_TEMPLATE mn10300_asm_trampoline_template
143 #undef TARGET_TRAMPOLINE_INIT
144 #define TARGET_TRAMPOLINE_INIT mn10300_trampoline_init
146 #undef TARGET_FUNCTION_VALUE
147 #define TARGET_FUNCTION_VALUE mn10300_function_value
148 #undef TARGET_LIBCALL_VALUE
149 #define TARGET_LIBCALL_VALUE mn10300_libcall_value
151 #undef TARGET_ASM_OUTPUT_MI_THUNK
152 #define TARGET_ASM_OUTPUT_MI_THUNK mn10300_asm_output_mi_thunk
153 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
154 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK mn10300_can_output_mi_thunk
156 struct gcc_target targetm
= TARGET_INITIALIZER
;
158 /* Implement TARGET_HANDLE_OPTION. */
161 mn10300_handle_option (size_t code
,
162 const char *arg ATTRIBUTE_UNUSED
,
168 mn10300_processor
= value
? PROCESSOR_AM33
: PROCESSOR_MN10300
;
171 mn10300_processor
= (value
173 : MIN (PROCESSOR_AM33
, PROCESSOR_DEFAULT
));
180 /* Implement OVERRIDE_OPTIONS. */
183 mn10300_override_options (void)
186 target_flags
&= ~MASK_MULT_BUG
;
190 mn10300_file_start (void)
192 default_file_start ();
195 fprintf (asm_out_file
, "\t.am33_2\n");
196 else if (TARGET_AM33
)
197 fprintf (asm_out_file
, "\t.am33\n");
201 /* Print operand X using operand code CODE to assembly language output file
205 print_operand (FILE *file
, rtx x
, int code
)
211 if (cc_status
.mdep
.fpCC
)
213 switch (code
== 'b' ? GET_CODE (x
)
214 : reverse_condition_maybe_unordered (GET_CODE (x
)))
217 fprintf (file
, "ne");
220 fprintf (file
, "eq");
223 fprintf (file
, "ge");
226 fprintf (file
, "gt");
229 fprintf (file
, "le");
232 fprintf (file
, "lt");
235 fprintf (file
, "lge");
238 fprintf (file
, "uo");
241 fprintf (file
, "lg");
244 fprintf (file
, "ue");
247 fprintf (file
, "uge");
250 fprintf (file
, "ug");
253 fprintf (file
, "ule");
256 fprintf (file
, "ul");
263 /* These are normal and reversed branches. */
264 switch (code
== 'b' ? GET_CODE (x
) : reverse_condition (GET_CODE (x
)))
267 fprintf (file
, "ne");
270 fprintf (file
, "eq");
273 fprintf (file
, "ge");
276 fprintf (file
, "gt");
279 fprintf (file
, "le");
282 fprintf (file
, "lt");
285 fprintf (file
, "cc");
288 fprintf (file
, "hi");
291 fprintf (file
, "ls");
294 fprintf (file
, "cs");
301 /* This is used for the operand to a call instruction;
302 if it's a REG, enclose it in parens, else output
303 the operand normally. */
304 if (GET_CODE (x
) == REG
)
307 print_operand (file
, x
, 0);
311 print_operand (file
, x
, 0);
315 switch (GET_CODE (x
))
319 output_address (XEXP (x
, 0));
324 fprintf (file
, "fd%d", REGNO (x
) - 18);
332 /* These are the least significant word in a 64bit value. */
334 switch (GET_CODE (x
))
338 output_address (XEXP (x
, 0));
343 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
347 fprintf (file
, "%s", reg_names
[subreg_regno (x
)]);
355 switch (GET_MODE (x
))
358 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
359 REAL_VALUE_TO_TARGET_DOUBLE (rv
, val
);
360 fprintf (file
, "0x%lx", val
[0]);
363 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
364 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
[0]);
365 fprintf (file
, "0x%lx", val
[0]);
369 print_operand_address (file
,
370 GEN_INT (CONST_DOUBLE_LOW (x
)));
381 split_double (x
, &low
, &high
);
382 fprintf (file
, "%ld", (long)INTVAL (low
));
391 /* Similarly, but for the most significant word. */
393 switch (GET_CODE (x
))
397 x
= adjust_address (x
, SImode
, 4);
398 output_address (XEXP (x
, 0));
403 fprintf (file
, "%s", reg_names
[REGNO (x
) + 1]);
407 fprintf (file
, "%s", reg_names
[subreg_regno (x
) + 1]);
415 switch (GET_MODE (x
))
418 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
419 REAL_VALUE_TO_TARGET_DOUBLE (rv
, val
);
420 fprintf (file
, "0x%lx", val
[1]);
426 print_operand_address (file
,
427 GEN_INT (CONST_DOUBLE_HIGH (x
)));
438 split_double (x
, &low
, &high
);
439 fprintf (file
, "%ld", (long)INTVAL (high
));
450 if (GET_CODE (XEXP (x
, 0)) == REG
)
451 output_address (gen_rtx_PLUS (SImode
, XEXP (x
, 0), const0_rtx
));
453 output_address (XEXP (x
, 0));
458 gcc_assert (INTVAL (x
) >= -128 && INTVAL (x
) <= 255);
459 fprintf (file
, "%d", (int)((~INTVAL (x
)) & 0xff));
463 gcc_assert (INTVAL (x
) >= -128 && INTVAL (x
) <= 255);
464 fprintf (file
, "%d", (int)(INTVAL (x
) & 0xff));
467 /* For shift counts. The hardware ignores the upper bits of
468 any immediate, but the assembler will flag an out of range
469 shift count as an error. So we mask off the high bits
470 of the immediate here. */
472 if (GET_CODE (x
) == CONST_INT
)
474 fprintf (file
, "%d", (int)(INTVAL (x
) & 0x1f));
480 switch (GET_CODE (x
))
484 output_address (XEXP (x
, 0));
493 fprintf (file
, "%s", reg_names
[REGNO (x
)]);
497 fprintf (file
, "%s", reg_names
[subreg_regno (x
)]);
500 /* This will only be single precision.... */
506 REAL_VALUE_FROM_CONST_DOUBLE (rv
, x
);
507 REAL_VALUE_TO_TARGET_SINGLE (rv
, val
);
508 fprintf (file
, "0x%lx", val
);
518 print_operand_address (file
, x
);
527 /* Output assembly language output for the address ADDR to FILE. */
530 print_operand_address (FILE *file
, rtx addr
)
532 switch (GET_CODE (addr
))
535 print_operand_address (file
, XEXP (addr
, 0));
539 print_operand (file
, addr
, 0);
544 if (REG_P (XEXP (addr
, 0))
545 && REG_OK_FOR_BASE_P (XEXP (addr
, 0)))
546 base
= XEXP (addr
, 0), index
= XEXP (addr
, 1);
547 else if (REG_P (XEXP (addr
, 1))
548 && REG_OK_FOR_BASE_P (XEXP (addr
, 1)))
549 base
= XEXP (addr
, 1), index
= XEXP (addr
, 0);
552 print_operand (file
, index
, 0);
554 print_operand (file
, base
, 0);;
558 output_addr_const (file
, addr
);
561 output_addr_const (file
, addr
);
566 /* Count the number of FP registers that have to be saved. */
568 fp_regs_to_save (void)
575 for (i
= FIRST_FP_REGNUM
; i
<= LAST_FP_REGNUM
; ++i
)
576 if (df_regs_ever_live_p (i
) && ! call_really_used_regs
[i
])
582 /* Print a set of registers in the format required by "movm" and "ret".
583 Register K is saved if bit K of MASK is set. The data and address
584 registers can be stored individually, but the extended registers cannot.
585 We assume that the mask already takes that into account. For instance,
586 bits 14 to 17 must have the same value. */
589 mn10300_print_reg_list (FILE *file
, int mask
)
597 for (i
= 0; i
< FIRST_EXTENDED_REGNUM
; i
++)
598 if ((mask
& (1 << i
)) != 0)
602 fputs (reg_names
[i
], file
);
606 if ((mask
& 0x3c000) != 0)
608 gcc_assert ((mask
& 0x3c000) == 0x3c000);
611 fputs ("exreg1", file
);
619 can_use_return_insn (void)
621 /* size includes the fixed stack space needed for function calls. */
622 int size
= get_frame_size () + crtl
->outgoing_args_size
;
624 /* And space for the return pointer. */
625 size
+= crtl
->outgoing_args_size
? 4 : 0;
627 return (reload_completed
629 && !df_regs_ever_live_p (2)
630 && !df_regs_ever_live_p (3)
631 && !df_regs_ever_live_p (6)
632 && !df_regs_ever_live_p (7)
633 && !df_regs_ever_live_p (14)
634 && !df_regs_ever_live_p (15)
635 && !df_regs_ever_live_p (16)
636 && !df_regs_ever_live_p (17)
637 && fp_regs_to_save () == 0
638 && !frame_pointer_needed
);
641 /* Returns the set of live, callee-saved registers as a bitmask. The
642 callee-saved extended registers cannot be stored individually, so
643 all of them will be included in the mask if any one of them is used. */
646 mn10300_get_live_callee_saved_regs (void)
652 for (i
= 0; i
<= LAST_EXTENDED_REGNUM
; i
++)
653 if (df_regs_ever_live_p (i
) && ! call_really_used_regs
[i
])
655 if ((mask
& 0x3c000) != 0)
661 /* Generate an instruction that pushes several registers onto the stack.
662 Register K will be saved if bit K in MASK is set. The function does
663 nothing if MASK is zero.
665 To be compatible with the "movm" instruction, the lowest-numbered
666 register must be stored in the lowest slot. If MASK is the set
667 { R1,...,RN }, where R1...RN are ordered least first, the generated
668 instruction will have the form:
671 (set (reg:SI 9) (plus:SI (reg:SI 9) (const_int -N*4)))
672 (set (mem:SI (plus:SI (reg:SI 9)
676 (set (mem:SI (plus:SI (reg:SI 9)
681 mn10300_gen_multiple_store (int mask
)
690 /* Count how many registers need to be saved. */
692 for (i
= 0; i
<= LAST_EXTENDED_REGNUM
; i
++)
693 if ((mask
& (1 << i
)) != 0)
696 /* We need one PARALLEL element to update the stack pointer and
697 an additional element for each register that is stored. */
698 par
= gen_rtx_PARALLEL (VOIDmode
, rtvec_alloc (count
+ 1));
700 /* Create the instruction that updates the stack pointer. */
702 = gen_rtx_SET (SImode
,
704 gen_rtx_PLUS (SImode
,
706 GEN_INT (-count
* 4)));
708 /* Create each store. */
710 for (i
= LAST_EXTENDED_REGNUM
; i
>= 0; i
--)
711 if ((mask
& (1 << i
)) != 0)
713 rtx address
= gen_rtx_PLUS (SImode
,
715 GEN_INT (-pari
* 4));
716 XVECEXP(par
, 0, pari
)
717 = gen_rtx_SET (VOIDmode
,
718 gen_rtx_MEM (SImode
, address
),
719 gen_rtx_REG (SImode
, i
));
723 par
= emit_insn (par
);
724 RTX_FRAME_RELATED_P (par
) = 1;
729 expand_prologue (void)
733 /* SIZE includes the fixed stack space needed for function calls. */
734 size
= get_frame_size () + crtl
->outgoing_args_size
;
735 size
+= (crtl
->outgoing_args_size
? 4 : 0);
737 /* If we use any of the callee-saved registers, save them now. */
738 mn10300_gen_multiple_store (mn10300_get_live_callee_saved_regs ());
740 if (TARGET_AM33_2
&& fp_regs_to_save ())
742 int num_regs_to_save
= fp_regs_to_save (), i
;
744 enum { save_sp_merge
,
746 save_sp_partial_merge
,
748 save_a0_no_merge
} strategy
;
749 unsigned int strategy_size
= (unsigned)-1, this_strategy_size
;
753 /* We have several different strategies to save FP registers.
754 We can store them using SP offsets, which is beneficial if
755 there are just a few registers to save, or we can use `a0' in
756 post-increment mode (`a0' is the only call-clobbered address
757 register that is never used to pass information to a
758 function). Furthermore, if we don't need a frame pointer, we
759 can merge the two SP adds into a single one, but this isn't
760 always beneficial; sometimes we can just split the two adds
761 so that we don't exceed a 16-bit constant size. The code
762 below will select which strategy to use, so as to generate
763 smallest code. Ties are broken in favor or shorter sequences
764 (in terms of number of instructions). */
766 #define SIZE_ADD_AX(S) ((((S) >= (1 << 15)) || ((S) < -(1 << 15))) ? 6 \
767 : (((S) >= (1 << 7)) || ((S) < -(1 << 7))) ? 4 : 2)
768 #define SIZE_ADD_SP(S) ((((S) >= (1 << 15)) || ((S) < -(1 << 15))) ? 6 \
769 : (((S) >= (1 << 7)) || ((S) < -(1 << 7))) ? 4 : 3)
770 #define SIZE_FMOV_LIMIT(S,N,L,SIZE1,SIZE2,ELSE) \
771 (((S) >= (L)) ? (SIZE1) * (N) \
772 : ((S) + 4 * (N) >= (L)) ? (((L) - (S)) / 4 * (SIZE2) \
773 + ((S) + 4 * (N) - (L)) / 4 * (SIZE1)) \
775 #define SIZE_FMOV_SP_(S,N) \
776 (SIZE_FMOV_LIMIT ((S), (N), (1 << 24), 7, 6, \
777 SIZE_FMOV_LIMIT ((S), (N), (1 << 8), 6, 4, \
778 (S) ? 4 * (N) : 3 + 4 * ((N) - 1))))
779 #define SIZE_FMOV_SP(S,N) (SIZE_FMOV_SP_ ((unsigned HOST_WIDE_INT)(S), (N)))
781 /* Consider alternative save_sp_merge only if we don't need the
782 frame pointer and size is nonzero. */
783 if (! frame_pointer_needed
&& size
)
785 /* Insn: add -(size + 4 * num_regs_to_save), sp. */
786 this_strategy_size
= SIZE_ADD_SP (-(size
+ 4 * num_regs_to_save
));
787 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
788 this_strategy_size
+= SIZE_FMOV_SP (size
, num_regs_to_save
);
790 if (this_strategy_size
< strategy_size
)
792 strategy
= save_sp_merge
;
793 strategy_size
= this_strategy_size
;
797 /* Consider alternative save_sp_no_merge unconditionally. */
798 /* Insn: add -4 * num_regs_to_save, sp. */
799 this_strategy_size
= SIZE_ADD_SP (-4 * num_regs_to_save
);
800 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
801 this_strategy_size
+= SIZE_FMOV_SP (0, num_regs_to_save
);
804 /* Insn: add -size, sp. */
805 this_strategy_size
+= SIZE_ADD_SP (-size
);
808 if (this_strategy_size
< strategy_size
)
810 strategy
= save_sp_no_merge
;
811 strategy_size
= this_strategy_size
;
814 /* Consider alternative save_sp_partial_merge only if we don't
815 need a frame pointer and size is reasonably large. */
816 if (! frame_pointer_needed
&& size
+ 4 * num_regs_to_save
> 128)
818 /* Insn: add -128, sp. */
819 this_strategy_size
= SIZE_ADD_SP (-128);
820 /* Insn: fmov fs#, (##, sp), for each fs# to be saved. */
821 this_strategy_size
+= SIZE_FMOV_SP (128 - 4 * num_regs_to_save
,
825 /* Insn: add 128-size, sp. */
826 this_strategy_size
+= SIZE_ADD_SP (128 - size
);
829 if (this_strategy_size
< strategy_size
)
831 strategy
= save_sp_partial_merge
;
832 strategy_size
= this_strategy_size
;
836 /* Consider alternative save_a0_merge only if we don't need a
837 frame pointer, size is nonzero and the user hasn't
838 changed the calling conventions of a0. */
839 if (! frame_pointer_needed
&& size
840 && call_really_used_regs
[FIRST_ADDRESS_REGNUM
]
841 && ! fixed_regs
[FIRST_ADDRESS_REGNUM
])
843 /* Insn: add -(size + 4 * num_regs_to_save), sp. */
844 this_strategy_size
= SIZE_ADD_SP (-(size
+ 4 * num_regs_to_save
));
845 /* Insn: mov sp, a0. */
846 this_strategy_size
++;
849 /* Insn: add size, a0. */
850 this_strategy_size
+= SIZE_ADD_AX (size
);
852 /* Insn: fmov fs#, (a0+), for each fs# to be saved. */
853 this_strategy_size
+= 3 * num_regs_to_save
;
855 if (this_strategy_size
< strategy_size
)
857 strategy
= save_a0_merge
;
858 strategy_size
= this_strategy_size
;
862 /* Consider alternative save_a0_no_merge if the user hasn't
863 changed the calling conventions of a0. */
864 if (call_really_used_regs
[FIRST_ADDRESS_REGNUM
]
865 && ! fixed_regs
[FIRST_ADDRESS_REGNUM
])
867 /* Insn: add -4 * num_regs_to_save, sp. */
868 this_strategy_size
= SIZE_ADD_SP (-4 * num_regs_to_save
);
869 /* Insn: mov sp, a0. */
870 this_strategy_size
++;
871 /* Insn: fmov fs#, (a0+), for each fs# to be saved. */
872 this_strategy_size
+= 3 * num_regs_to_save
;
875 /* Insn: add -size, sp. */
876 this_strategy_size
+= SIZE_ADD_SP (-size
);
879 if (this_strategy_size
< strategy_size
)
881 strategy
= save_a0_no_merge
;
882 strategy_size
= this_strategy_size
;
886 /* Emit the initial SP add, common to all strategies. */
889 case save_sp_no_merge
:
890 case save_a0_no_merge
:
891 emit_insn (gen_addsi3 (stack_pointer_rtx
,
893 GEN_INT (-4 * num_regs_to_save
)));
897 case save_sp_partial_merge
:
898 emit_insn (gen_addsi3 (stack_pointer_rtx
,
901 xsize
= 128 - 4 * num_regs_to_save
;
907 emit_insn (gen_addsi3 (stack_pointer_rtx
,
909 GEN_INT (-(size
+ 4 * num_regs_to_save
))));
910 /* We'll have to adjust FP register saves according to the
913 /* Since we've already created the stack frame, don't do it
914 again at the end of the function. */
922 /* Now prepare register a0, if we have decided to use it. */
926 case save_sp_no_merge
:
927 case save_sp_partial_merge
:
932 case save_a0_no_merge
:
933 reg
= gen_rtx_REG (SImode
, FIRST_ADDRESS_REGNUM
);
934 emit_insn (gen_movsi (reg
, stack_pointer_rtx
));
936 emit_insn (gen_addsi3 (reg
, reg
, GEN_INT (xsize
)));
937 reg
= gen_rtx_POST_INC (SImode
, reg
);
944 /* Now actually save the FP registers. */
945 for (i
= FIRST_FP_REGNUM
; i
<= LAST_FP_REGNUM
; ++i
)
946 if (df_regs_ever_live_p (i
) && ! call_really_used_regs
[i
])
954 /* If we aren't using `a0', use an SP offset. */
957 addr
= gen_rtx_PLUS (SImode
,
962 addr
= stack_pointer_rtx
;
967 insn
= emit_insn (gen_movsi (gen_rtx_MEM (SImode
, addr
),
968 gen_rtx_REG (SImode
, i
)));
970 RTX_FRAME_RELATED_P (insn
) = 1;
974 /* Now put the frame pointer into the frame pointer register. */
975 if (frame_pointer_needed
)
976 emit_move_insn (frame_pointer_rtx
, stack_pointer_rtx
);
978 /* Allocate stack for this frame. */
980 emit_insn (gen_addsi3 (stack_pointer_rtx
,
983 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
984 emit_insn (gen_GOTaddr2picreg ());
988 expand_epilogue (void)
992 /* SIZE includes the fixed stack space needed for function calls. */
993 size
= get_frame_size () + crtl
->outgoing_args_size
;
994 size
+= (crtl
->outgoing_args_size
? 4 : 0);
996 if (TARGET_AM33_2
&& fp_regs_to_save ())
998 int num_regs_to_save
= fp_regs_to_save (), i
;
1001 /* We have several options to restore FP registers. We could
1002 load them from SP offsets, but, if there are enough FP
1003 registers to restore, we win if we use a post-increment
1006 /* If we have a frame pointer, it's the best option, because we
1007 already know it has the value we want. */
1008 if (frame_pointer_needed
)
1009 reg
= gen_rtx_REG (SImode
, FRAME_POINTER_REGNUM
);
1010 /* Otherwise, we may use `a1', since it's call-clobbered and
1011 it's never used for return values. But only do so if it's
1012 smaller than using SP offsets. */
1015 enum { restore_sp_post_adjust
,
1016 restore_sp_pre_adjust
,
1017 restore_sp_partial_adjust
,
1018 restore_a1
} strategy
;
1019 unsigned int this_strategy_size
, strategy_size
= (unsigned)-1;
1021 /* Consider using sp offsets before adjusting sp. */
1022 /* Insn: fmov (##,sp),fs#, for each fs# to be restored. */
1023 this_strategy_size
= SIZE_FMOV_SP (size
, num_regs_to_save
);
1024 /* If size is too large, we'll have to adjust SP with an
1026 if (size
+ 4 * num_regs_to_save
+ REG_SAVE_BYTES
> 255)
1028 /* Insn: add size + 4 * num_regs_to_save, sp. */
1029 this_strategy_size
+= SIZE_ADD_SP (size
+ 4 * num_regs_to_save
);
1031 /* If we don't have to restore any non-FP registers,
1032 we'll be able to save one byte by using rets. */
1033 if (! REG_SAVE_BYTES
)
1034 this_strategy_size
--;
1036 if (this_strategy_size
< strategy_size
)
1038 strategy
= restore_sp_post_adjust
;
1039 strategy_size
= this_strategy_size
;
1042 /* Consider using sp offsets after adjusting sp. */
1043 /* Insn: add size, sp. */
1044 this_strategy_size
= SIZE_ADD_SP (size
);
1045 /* Insn: fmov (##,sp),fs#, for each fs# to be restored. */
1046 this_strategy_size
+= SIZE_FMOV_SP (0, num_regs_to_save
);
1047 /* We're going to use ret to release the FP registers
1048 save area, so, no savings. */
1050 if (this_strategy_size
< strategy_size
)
1052 strategy
= restore_sp_pre_adjust
;
1053 strategy_size
= this_strategy_size
;
1056 /* Consider using sp offsets after partially adjusting sp.
1057 When size is close to 32Kb, we may be able to adjust SP
1058 with an imm16 add instruction while still using fmov
1060 if (size
+ 4 * num_regs_to_save
+ REG_SAVE_BYTES
> 255)
1062 /* Insn: add size + 4 * num_regs_to_save
1063 + REG_SAVE_BYTES - 252,sp. */
1064 this_strategy_size
= SIZE_ADD_SP (size
+ 4 * num_regs_to_save
1065 + REG_SAVE_BYTES
- 252);
1066 /* Insn: fmov (##,sp),fs#, fo each fs# to be restored. */
1067 this_strategy_size
+= SIZE_FMOV_SP (252 - REG_SAVE_BYTES
1068 - 4 * num_regs_to_save
,
1070 /* We're going to use ret to release the FP registers
1071 save area, so, no savings. */
1073 if (this_strategy_size
< strategy_size
)
1075 strategy
= restore_sp_partial_adjust
;
1076 strategy_size
= this_strategy_size
;
1080 /* Consider using a1 in post-increment mode, as long as the
1081 user hasn't changed the calling conventions of a1. */
1082 if (call_really_used_regs
[FIRST_ADDRESS_REGNUM
+ 1]
1083 && ! fixed_regs
[FIRST_ADDRESS_REGNUM
+1])
1085 /* Insn: mov sp,a1. */
1086 this_strategy_size
= 1;
1089 /* Insn: add size,a1. */
1090 this_strategy_size
+= SIZE_ADD_AX (size
);
1092 /* Insn: fmov (a1+),fs#, for each fs# to be restored. */
1093 this_strategy_size
+= 3 * num_regs_to_save
;
1094 /* If size is large enough, we may be able to save a
1096 if (size
+ 4 * num_regs_to_save
+ REG_SAVE_BYTES
> 255)
1098 /* Insn: mov a1,sp. */
1099 this_strategy_size
+= 2;
1101 /* If we don't have to restore any non-FP registers,
1102 we'll be able to save one byte by using rets. */
1103 if (! REG_SAVE_BYTES
)
1104 this_strategy_size
--;
1106 if (this_strategy_size
< strategy_size
)
1108 strategy
= restore_a1
;
1109 strategy_size
= this_strategy_size
;
1115 case restore_sp_post_adjust
:
1118 case restore_sp_pre_adjust
:
1119 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1125 case restore_sp_partial_adjust
:
1126 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1128 GEN_INT (size
+ 4 * num_regs_to_save
1129 + REG_SAVE_BYTES
- 252)));
1130 size
= 252 - REG_SAVE_BYTES
- 4 * num_regs_to_save
;
1134 reg
= gen_rtx_REG (SImode
, FIRST_ADDRESS_REGNUM
+ 1);
1135 emit_insn (gen_movsi (reg
, stack_pointer_rtx
));
1137 emit_insn (gen_addsi3 (reg
, reg
, GEN_INT (size
)));
1145 /* Adjust the selected register, if any, for post-increment. */
1147 reg
= gen_rtx_POST_INC (SImode
, reg
);
1149 for (i
= FIRST_FP_REGNUM
; i
<= LAST_FP_REGNUM
; ++i
)
1150 if (df_regs_ever_live_p (i
) && ! call_really_used_regs
[i
])
1158 /* If we aren't using a post-increment register, use an
1160 addr
= gen_rtx_PLUS (SImode
,
1165 addr
= stack_pointer_rtx
;
1169 emit_insn (gen_movsi (gen_rtx_REG (SImode
, i
),
1170 gen_rtx_MEM (SImode
, addr
)));
1173 /* If we were using the restore_a1 strategy and the number of
1174 bytes to be released won't fit in the `ret' byte, copy `a1'
1175 to `sp', to avoid having to use `add' to adjust it. */
1176 if (! frame_pointer_needed
&& reg
&& size
+ REG_SAVE_BYTES
> 255)
1178 emit_move_insn (stack_pointer_rtx
, XEXP (reg
, 0));
1183 /* Maybe cut back the stack, except for the register save area.
1185 If the frame pointer exists, then use the frame pointer to
1188 If the stack size + register save area is more than 255 bytes,
1189 then the stack must be cut back here since the size + register
1190 save size is too big for a ret/retf instruction.
1192 Else leave it alone, it will be cut back as part of the
1193 ret/retf instruction, or there wasn't any stack to begin with.
1195 Under no circumstances should the register save area be
1196 deallocated here, that would leave a window where an interrupt
1197 could occur and trash the register save area. */
1198 if (frame_pointer_needed
)
1200 emit_move_insn (stack_pointer_rtx
, frame_pointer_rtx
);
1203 else if (size
+ REG_SAVE_BYTES
> 255)
1205 emit_insn (gen_addsi3 (stack_pointer_rtx
,
1211 /* Adjust the stack and restore callee-saved registers, if any. */
1212 if (size
|| df_regs_ever_live_p (2) || df_regs_ever_live_p (3)
1213 || df_regs_ever_live_p (6) || df_regs_ever_live_p (7)
1214 || df_regs_ever_live_p (14) || df_regs_ever_live_p (15)
1215 || df_regs_ever_live_p (16) || df_regs_ever_live_p (17)
1216 || frame_pointer_needed
)
1217 emit_jump_insn (gen_return_internal_regs
1218 (GEN_INT (size
+ REG_SAVE_BYTES
)));
1220 emit_jump_insn (gen_return_internal ());
1223 /* Update the condition code from the insn. */
1226 notice_update_cc (rtx body
, rtx insn
)
1228 switch (get_attr_cc (insn
))
1231 /* Insn does not affect CC at all. */
1235 /* Insn does not change CC, but the 0'th operand has been changed. */
1236 if (cc_status
.value1
!= 0
1237 && reg_overlap_mentioned_p (recog_data
.operand
[0], cc_status
.value1
))
1238 cc_status
.value1
= 0;
1242 /* Insn sets the Z,N flags of CC to recog_data.operand[0].
1243 V,C are unusable. */
1245 cc_status
.flags
|= CC_NO_CARRY
| CC_OVERFLOW_UNUSABLE
;
1246 cc_status
.value1
= recog_data
.operand
[0];
1250 /* Insn sets the Z,N,V flags of CC to recog_data.operand[0].
1253 cc_status
.flags
|= CC_NO_CARRY
;
1254 cc_status
.value1
= recog_data
.operand
[0];
1258 /* The insn is a compare instruction. */
1260 cc_status
.value1
= SET_SRC (body
);
1261 if (GET_CODE (cc_status
.value1
) == COMPARE
1262 && GET_MODE (XEXP (cc_status
.value1
, 0)) == SFmode
)
1263 cc_status
.mdep
.fpCC
= 1;
1267 /* Insn doesn't leave CC in a usable state. */
1276 /* Recognize the PARALLEL rtx generated by mn10300_gen_multiple_store().
1277 This function is for MATCH_PARALLEL and so assumes OP is known to be
1278 parallel. If OP is a multiple store, return a mask indicating which
1279 registers it saves. Return 0 otherwise. */
1282 store_multiple_operation (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1290 count
= XVECLEN (op
, 0);
1294 /* Check that first instruction has the form (set (sp) (plus A B)) */
1295 elt
= XVECEXP (op
, 0, 0);
1296 if (GET_CODE (elt
) != SET
1297 || GET_CODE (SET_DEST (elt
)) != REG
1298 || REGNO (SET_DEST (elt
)) != STACK_POINTER_REGNUM
1299 || GET_CODE (SET_SRC (elt
)) != PLUS
)
1302 /* Check that A is the stack pointer and B is the expected stack size.
1303 For OP to match, each subsequent instruction should push a word onto
1304 the stack. We therefore expect the first instruction to create
1305 COUNT-1 stack slots. */
1306 elt
= SET_SRC (elt
);
1307 if (GET_CODE (XEXP (elt
, 0)) != REG
1308 || REGNO (XEXP (elt
, 0)) != STACK_POINTER_REGNUM
1309 || GET_CODE (XEXP (elt
, 1)) != CONST_INT
1310 || INTVAL (XEXP (elt
, 1)) != -(count
- 1) * 4)
1313 /* Now go through the rest of the vector elements. They must be
1314 ordered so that the first instruction stores the highest-numbered
1315 register to the highest stack slot and that subsequent instructions
1316 store a lower-numbered register to the slot below.
1318 LAST keeps track of the smallest-numbered register stored so far.
1319 MASK is the set of stored registers. */
1320 last
= LAST_EXTENDED_REGNUM
+ 1;
1322 for (i
= 1; i
< count
; i
++)
1324 /* Check that element i is a (set (mem M) R) and that R is valid. */
1325 elt
= XVECEXP (op
, 0, i
);
1326 if (GET_CODE (elt
) != SET
1327 || GET_CODE (SET_DEST (elt
)) != MEM
1328 || GET_CODE (SET_SRC (elt
)) != REG
1329 || REGNO (SET_SRC (elt
)) >= last
)
1332 /* R was OK, so provisionally add it to MASK. We return 0 in any
1333 case if the rest of the instruction has a flaw. */
1334 last
= REGNO (SET_SRC (elt
));
1335 mask
|= (1 << last
);
1337 /* Check that M has the form (plus (sp) (const_int -I*4)) */
1338 elt
= XEXP (SET_DEST (elt
), 0);
1339 if (GET_CODE (elt
) != PLUS
1340 || GET_CODE (XEXP (elt
, 0)) != REG
1341 || REGNO (XEXP (elt
, 0)) != STACK_POINTER_REGNUM
1342 || GET_CODE (XEXP (elt
, 1)) != CONST_INT
1343 || INTVAL (XEXP (elt
, 1)) != -i
* 4)
1347 /* All or none of the callee-saved extended registers must be in the set. */
1348 if ((mask
& 0x3c000) != 0
1349 && (mask
& 0x3c000) != 0x3c000)
1355 /* What (if any) secondary registers are needed to move IN with mode
1356 MODE into a register in register class RCLASS.
1358 We might be able to simplify this. */
1360 mn10300_secondary_reload_class (enum reg_class rclass
, enum machine_mode mode
,
1365 /* Strip off any SUBREG expressions from IN. Basically we want
1366 to know if IN is a pseudo or (subreg (pseudo)) as those can
1367 turn into MEMs during reload. */
1368 while (GET_CODE (inner
) == SUBREG
)
1369 inner
= SUBREG_REG (inner
);
1371 /* Memory loads less than a full word wide can't have an
1372 address or stack pointer destination. They must use
1373 a data register as an intermediate register. */
1374 if ((GET_CODE (in
) == MEM
1375 || (GET_CODE (inner
) == REG
1376 && REGNO (inner
) >= FIRST_PSEUDO_REGISTER
))
1377 && (mode
== QImode
|| mode
== HImode
)
1378 && (rclass
== ADDRESS_REGS
|| rclass
== SP_REGS
1379 || rclass
== SP_OR_ADDRESS_REGS
))
1382 return DATA_OR_EXTENDED_REGS
;
1386 /* We can't directly load sp + const_int into a data register;
1387 we must use an address register as an intermediate. */
1388 if (rclass
!= SP_REGS
1389 && rclass
!= ADDRESS_REGS
1390 && rclass
!= SP_OR_ADDRESS_REGS
1391 && rclass
!= SP_OR_EXTENDED_REGS
1392 && rclass
!= ADDRESS_OR_EXTENDED_REGS
1393 && rclass
!= SP_OR_ADDRESS_OR_EXTENDED_REGS
1394 && (in
== stack_pointer_rtx
1395 || (GET_CODE (in
) == PLUS
1396 && (XEXP (in
, 0) == stack_pointer_rtx
1397 || XEXP (in
, 1) == stack_pointer_rtx
))))
1398 return ADDRESS_REGS
;
1400 if (GET_CODE (in
) == PLUS
1401 && (XEXP (in
, 0) == stack_pointer_rtx
1402 || XEXP (in
, 1) == stack_pointer_rtx
))
1403 return GENERAL_REGS
;
1406 && rclass
== FP_REGS
)
1408 /* We can't load directly into an FP register from a
1409 constant address. */
1410 if (GET_CODE (in
) == MEM
1411 && CONSTANT_ADDRESS_P (XEXP (in
, 0)))
1412 return (TARGET_AM33
? DATA_OR_EXTENDED_REGS
: DATA_REGS
);
1414 /* Handle case were a pseudo may not get a hard register
1415 but has an equivalent memory location defined. */
1416 if (GET_CODE (inner
) == REG
1417 && REGNO (inner
) >= FIRST_PSEUDO_REGISTER
1418 && reg_equiv_mem
[REGNO (inner
)]
1419 && CONSTANT_ADDRESS_P (XEXP (reg_equiv_mem
[REGNO (inner
)], 0)))
1420 return (TARGET_AM33
? DATA_OR_EXTENDED_REGS
: DATA_REGS
);
1423 /* Otherwise assume no secondary reloads are needed. */
1428 initial_offset (int from
, int to
)
1430 /* The difference between the argument pointer and the frame pointer
1431 is the size of the callee register save area. */
1432 if (from
== ARG_POINTER_REGNUM
&& to
== FRAME_POINTER_REGNUM
)
1434 if (df_regs_ever_live_p (2) || df_regs_ever_live_p (3)
1435 || df_regs_ever_live_p (6) || df_regs_ever_live_p (7)
1436 || df_regs_ever_live_p (14) || df_regs_ever_live_p (15)
1437 || df_regs_ever_live_p (16) || df_regs_ever_live_p (17)
1438 || fp_regs_to_save ()
1439 || frame_pointer_needed
)
1440 return REG_SAVE_BYTES
1441 + 4 * fp_regs_to_save ();
1446 /* The difference between the argument pointer and the stack pointer is
1447 the sum of the size of this function's frame, the callee register save
1448 area, and the fixed stack space needed for function calls (if any). */
1449 if (from
== ARG_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
1451 if (df_regs_ever_live_p (2) || df_regs_ever_live_p (3)
1452 || df_regs_ever_live_p (6) || df_regs_ever_live_p (7)
1453 || df_regs_ever_live_p (14) || df_regs_ever_live_p (15)
1454 || df_regs_ever_live_p (16) || df_regs_ever_live_p (17)
1455 || fp_regs_to_save ()
1456 || frame_pointer_needed
)
1457 return (get_frame_size () + REG_SAVE_BYTES
1458 + 4 * fp_regs_to_save ()
1459 + (crtl
->outgoing_args_size
1460 ? crtl
->outgoing_args_size
+ 4 : 0));
1462 return (get_frame_size ()
1463 + (crtl
->outgoing_args_size
1464 ? crtl
->outgoing_args_size
+ 4 : 0));
1467 /* The difference between the frame pointer and stack pointer is the sum
1468 of the size of this function's frame and the fixed stack space needed
1469 for function calls (if any). */
1470 if (from
== FRAME_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
1471 return (get_frame_size ()
1472 + (crtl
->outgoing_args_size
1473 ? crtl
->outgoing_args_size
+ 4 : 0));
1478 /* Worker function for TARGET_RETURN_IN_MEMORY. */
1481 mn10300_return_in_memory (const_tree type
, const_tree fntype ATTRIBUTE_UNUSED
)
1483 /* Return values > 8 bytes in length in memory. */
1484 return (int_size_in_bytes (type
) > 8
1485 || int_size_in_bytes (type
) == 0
1486 || TYPE_MODE (type
) == BLKmode
);
1489 /* Flush the argument registers to the stack for a stdarg function;
1490 return the new argument pointer. */
1492 mn10300_builtin_saveregs (void)
1495 tree fntype
= TREE_TYPE (current_function_decl
);
1496 int argadj
= ((!(TYPE_ARG_TYPES (fntype
) != 0
1497 && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype
)))
1498 != void_type_node
)))
1499 ? UNITS_PER_WORD
: 0);
1500 alias_set_type set
= get_varargs_alias_set ();
1503 offset
= plus_constant (crtl
->args
.arg_offset_rtx
, argadj
);
1505 offset
= crtl
->args
.arg_offset_rtx
;
1507 mem
= gen_rtx_MEM (SImode
, crtl
->args
.internal_arg_pointer
);
1508 set_mem_alias_set (mem
, set
);
1509 emit_move_insn (mem
, gen_rtx_REG (SImode
, 0));
1511 mem
= gen_rtx_MEM (SImode
,
1512 plus_constant (crtl
->args
.internal_arg_pointer
, 4));
1513 set_mem_alias_set (mem
, set
);
1514 emit_move_insn (mem
, gen_rtx_REG (SImode
, 1));
1516 return copy_to_reg (expand_binop (Pmode
, add_optab
,
1517 crtl
->args
.internal_arg_pointer
,
1518 offset
, 0, 0, OPTAB_LIB_WIDEN
));
1522 mn10300_va_start (tree valist
, rtx nextarg
)
1524 nextarg
= expand_builtin_saveregs ();
1525 std_expand_builtin_va_start (valist
, nextarg
);
1528 /* Return true when a parameter should be passed by reference. */
1531 mn10300_pass_by_reference (CUMULATIVE_ARGS
*cum ATTRIBUTE_UNUSED
,
1532 enum machine_mode mode
, const_tree type
,
1533 bool named ATTRIBUTE_UNUSED
)
1535 unsigned HOST_WIDE_INT size
;
1538 size
= int_size_in_bytes (type
);
1540 size
= GET_MODE_SIZE (mode
);
1542 return (size
> 8 || size
== 0);
1545 /* Return an RTX to represent where a value with mode MODE will be returned
1546 from a function. If the result is NULL_RTX, the argument is pushed. */
1549 function_arg (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
1550 tree type
, int named ATTRIBUTE_UNUSED
)
1552 rtx result
= NULL_RTX
;
1555 /* We only support using 2 data registers as argument registers. */
1558 /* Figure out the size of the object to be passed. */
1559 if (mode
== BLKmode
)
1560 size
= int_size_in_bytes (type
);
1562 size
= GET_MODE_SIZE (mode
);
1564 /* Figure out the alignment of the object to be passed. */
1567 cum
->nbytes
= (cum
->nbytes
+ 3) & ~3;
1569 /* Don't pass this arg via a register if all the argument registers
1571 if (cum
->nbytes
> nregs
* UNITS_PER_WORD
)
1574 /* Don't pass this arg via a register if it would be split between
1575 registers and memory. */
1576 if (type
== NULL_TREE
1577 && cum
->nbytes
+ size
> nregs
* UNITS_PER_WORD
)
1580 switch (cum
->nbytes
/ UNITS_PER_WORD
)
1583 result
= gen_rtx_REG (mode
, FIRST_ARGUMENT_REGNUM
);
1586 result
= gen_rtx_REG (mode
, FIRST_ARGUMENT_REGNUM
+ 1);
1595 /* Return the number of bytes of registers to use for an argument passed
1596 partially in registers and partially in memory. */
1599 mn10300_arg_partial_bytes (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
1600 tree type
, bool named ATTRIBUTE_UNUSED
)
1604 /* We only support using 2 data registers as argument registers. */
1607 /* Figure out the size of the object to be passed. */
1608 if (mode
== BLKmode
)
1609 size
= int_size_in_bytes (type
);
1611 size
= GET_MODE_SIZE (mode
);
1613 /* Figure out the alignment of the object to be passed. */
1616 cum
->nbytes
= (cum
->nbytes
+ 3) & ~3;
1618 /* Don't pass this arg via a register if all the argument registers
1620 if (cum
->nbytes
> nregs
* UNITS_PER_WORD
)
1623 if (cum
->nbytes
+ size
<= nregs
* UNITS_PER_WORD
)
1626 /* Don't pass this arg via a register if it would be split between
1627 registers and memory. */
1628 if (type
== NULL_TREE
1629 && cum
->nbytes
+ size
> nregs
* UNITS_PER_WORD
)
1632 return nregs
* UNITS_PER_WORD
- cum
->nbytes
;
1635 /* Return the location of the function's value. This will be either
1636 $d0 for integer functions, $a0 for pointers, or a PARALLEL of both
1637 $d0 and $a0 if the -mreturn-pointer-on-do flag is set. Note that
1638 we only return the PARALLEL for outgoing values; we do not want
1639 callers relying on this extra copy. */
1642 mn10300_function_value (const_tree valtype
,
1643 const_tree fn_decl_or_type ATTRIBUTE_UNUSED
,
1647 enum machine_mode mode
= TYPE_MODE (valtype
);
1649 if (! POINTER_TYPE_P (valtype
))
1650 return gen_rtx_REG (mode
, FIRST_DATA_REGNUM
);
1651 else if (! TARGET_PTR_A0D0
|| ! outgoing
1652 || cfun
->returns_struct
)
1653 return gen_rtx_REG (mode
, FIRST_ADDRESS_REGNUM
);
1655 rv
= gen_rtx_PARALLEL (mode
, rtvec_alloc (2));
1657 = gen_rtx_EXPR_LIST (VOIDmode
,
1658 gen_rtx_REG (mode
, FIRST_ADDRESS_REGNUM
),
1662 = gen_rtx_EXPR_LIST (VOIDmode
,
1663 gen_rtx_REG (mode
, FIRST_DATA_REGNUM
),
1668 /* Implements TARGET_LIBCALL_VALUE. */
1671 mn10300_libcall_value (enum machine_mode mode
,
1672 const_rtx fun ATTRIBUTE_UNUSED
)
1674 return gen_rtx_REG (mode
, FIRST_DATA_REGNUM
);
1677 /* Implements FUNCTION_VALUE_REGNO_P. */
1680 mn10300_function_value_regno_p (const unsigned int regno
)
1682 return (regno
== FIRST_DATA_REGNUM
|| regno
== FIRST_ADDRESS_REGNUM
);
1685 /* Output a tst insn. */
1687 output_tst (rtx operand
, rtx insn
)
1692 /* We can save a byte if we can find a register which has the value
1694 temp
= PREV_INSN (insn
);
1695 while (optimize
&& temp
)
1699 /* We allow the search to go through call insns. We record
1700 the fact that we've past a CALL_INSN and reject matches which
1701 use call clobbered registers. */
1702 if (GET_CODE (temp
) == CODE_LABEL
1703 || GET_CODE (temp
) == JUMP_INSN
1704 || GET_CODE (temp
) == BARRIER
)
1707 if (GET_CODE (temp
) == CALL_INSN
)
1710 if (GET_CODE (temp
) == NOTE
)
1712 temp
= PREV_INSN (temp
);
1716 /* It must be an insn, see if it is a simple set. */
1717 set
= single_set (temp
);
1720 temp
= PREV_INSN (temp
);
1724 /* Are we setting a data register to zero (this does not win for
1727 If it's a call clobbered register, have we past a call?
1729 Make sure the register we find isn't the same as ourself;
1730 the mn10300 can't encode that.
1732 ??? reg_set_between_p return nonzero anytime we pass a CALL_INSN
1733 so the code to detect calls here isn't doing anything useful. */
1734 if (REG_P (SET_DEST (set
))
1735 && SET_SRC (set
) == CONST0_RTX (GET_MODE (SET_DEST (set
)))
1736 && !reg_set_between_p (SET_DEST (set
), temp
, insn
)
1737 && (REGNO_REG_CLASS (REGNO (SET_DEST (set
)))
1738 == REGNO_REG_CLASS (REGNO (operand
)))
1739 && REGNO_REG_CLASS (REGNO (SET_DEST (set
))) != EXTENDED_REGS
1740 && REGNO (SET_DEST (set
)) != REGNO (operand
)
1742 || ! call_really_used_regs
[REGNO (SET_DEST (set
))]))
1745 xoperands
[0] = operand
;
1746 xoperands
[1] = SET_DEST (set
);
1748 output_asm_insn ("cmp %1,%0", xoperands
);
1752 if (REGNO_REG_CLASS (REGNO (operand
)) == EXTENDED_REGS
1753 && REG_P (SET_DEST (set
))
1754 && SET_SRC (set
) == CONST0_RTX (GET_MODE (SET_DEST (set
)))
1755 && !reg_set_between_p (SET_DEST (set
), temp
, insn
)
1756 && (REGNO_REG_CLASS (REGNO (SET_DEST (set
)))
1757 != REGNO_REG_CLASS (REGNO (operand
)))
1758 && REGNO_REG_CLASS (REGNO (SET_DEST (set
))) == EXTENDED_REGS
1759 && REGNO (SET_DEST (set
)) != REGNO (operand
)
1761 || ! call_really_used_regs
[REGNO (SET_DEST (set
))]))
1764 xoperands
[0] = operand
;
1765 xoperands
[1] = SET_DEST (set
);
1767 output_asm_insn ("cmp %1,%0", xoperands
);
1770 temp
= PREV_INSN (temp
);
1776 impossible_plus_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1778 if (GET_CODE (op
) != PLUS
)
1781 if (XEXP (op
, 0) == stack_pointer_rtx
1782 || XEXP (op
, 1) == stack_pointer_rtx
)
1788 /* Similarly, but when using a zero_extract pattern for a btst where
1789 the source operand might end up in memory. */
1791 mask_ok_for_mem_btst (int len
, int bit
)
1793 unsigned int mask
= 0;
1802 /* MASK must bit into an 8bit value. */
1803 return (((mask
& 0xff) == mask
)
1804 || ((mask
& 0xff00) == mask
)
1805 || ((mask
& 0xff0000) == mask
)
1806 || ((mask
& 0xff000000) == mask
));
1809 /* Return 1 if X contains a symbolic expression. We know these
1810 expressions will have one of a few well defined forms, so
1811 we need only check those forms. */
1813 symbolic_operand (register rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
1815 switch (GET_CODE (op
))
1822 return ((GET_CODE (XEXP (op
, 0)) == SYMBOL_REF
1823 || GET_CODE (XEXP (op
, 0)) == LABEL_REF
)
1824 && GET_CODE (XEXP (op
, 1)) == CONST_INT
);
1830 /* Try machine dependent ways of modifying an illegitimate address
1831 to be legitimate. If we find one, return the new valid address.
1832 This macro is used in only one place: `memory_address' in explow.c.
1834 OLDX is the address as it was before break_out_memory_refs was called.
1835 In some cases it is useful to look at this to decide what needs to be done.
1837 Normally it is always safe for this macro to do nothing. It exists to
1838 recognize opportunities to optimize the output.
1840 But on a few ports with segmented architectures and indexed addressing
1841 (mn10300, hppa) it is used to rewrite certain problematical addresses. */
1843 mn10300_legitimize_address (rtx x
, rtx oldx ATTRIBUTE_UNUSED
,
1844 enum machine_mode mode ATTRIBUTE_UNUSED
)
1846 if (flag_pic
&& ! legitimate_pic_operand_p (x
))
1847 x
= legitimize_pic_address (oldx
, NULL_RTX
);
1849 /* Uh-oh. We might have an address for x[n-100000]. This needs
1850 special handling to avoid creating an indexed memory address
1851 with x-100000 as the base. */
1852 if (GET_CODE (x
) == PLUS
1853 && symbolic_operand (XEXP (x
, 1), VOIDmode
))
1855 /* Ugly. We modify things here so that the address offset specified
1856 by the index expression is computed first, then added to x to form
1857 the entire address. */
1859 rtx regx1
, regy1
, regy2
, y
;
1861 /* Strip off any CONST. */
1863 if (GET_CODE (y
) == CONST
)
1866 if (GET_CODE (y
) == PLUS
|| GET_CODE (y
) == MINUS
)
1868 regx1
= force_reg (Pmode
, force_operand (XEXP (x
, 0), 0));
1869 regy1
= force_reg (Pmode
, force_operand (XEXP (y
, 0), 0));
1870 regy2
= force_reg (Pmode
, force_operand (XEXP (y
, 1), 0));
1871 regx1
= force_reg (Pmode
,
1872 gen_rtx_fmt_ee (GET_CODE (y
), Pmode
, regx1
, regy2
));
1873 return force_reg (Pmode
, gen_rtx_PLUS (Pmode
, regx1
, regy1
));
1879 /* Convert a non-PIC address in `orig' to a PIC address using @GOT or
1880 @GOTOFF in `reg'. */
1882 legitimize_pic_address (rtx orig
, rtx reg
)
1884 if (GET_CODE (orig
) == LABEL_REF
1885 || (GET_CODE (orig
) == SYMBOL_REF
1886 && (CONSTANT_POOL_ADDRESS_P (orig
)
1887 || ! MN10300_GLOBAL_P (orig
))))
1890 reg
= gen_reg_rtx (Pmode
);
1892 emit_insn (gen_symGOTOFF2reg (reg
, orig
));
1895 else if (GET_CODE (orig
) == SYMBOL_REF
)
1898 reg
= gen_reg_rtx (Pmode
);
1900 emit_insn (gen_symGOT2reg (reg
, orig
));
1906 /* Return zero if X references a SYMBOL_REF or LABEL_REF whose symbol
1907 isn't protected by a PIC unspec; nonzero otherwise. */
1909 legitimate_pic_operand_p (rtx x
)
1911 register const char *fmt
;
1914 if (GET_CODE (x
) == SYMBOL_REF
|| GET_CODE (x
) == LABEL_REF
)
1917 if (GET_CODE (x
) == UNSPEC
1918 && (XINT (x
, 1) == UNSPEC_PIC
1919 || XINT (x
, 1) == UNSPEC_GOT
1920 || XINT (x
, 1) == UNSPEC_GOTOFF
1921 || XINT (x
, 1) == UNSPEC_PLT
1922 || XINT (x
, 1) == UNSPEC_GOTSYM_OFF
))
1925 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
1926 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
1932 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
1933 if (! legitimate_pic_operand_p (XVECEXP (x
, i
, j
)))
1936 else if (fmt
[i
] == 'e' && ! legitimate_pic_operand_p (XEXP (x
, i
)))
1943 /* Return TRUE if the address X, taken from a (MEM:MODE X) rtx, is
1944 legitimate, and FALSE otherwise.
1946 On the mn10300, the value in the address register must be
1947 in the same memory space/segment as the effective address.
1949 This is problematical for reload since it does not understand
1950 that base+index != index+base in a memory reference.
1952 Note it is still possible to use reg+reg addressing modes,
1953 it's just much more difficult. For a discussion of a possible
1954 workaround and solution, see the comments in pa.c before the
1955 function record_unscaled_index_insn_codes. */
1958 mn10300_legitimate_address_p (enum machine_mode mode
, rtx x
, bool strict
)
1960 if (CONSTANT_ADDRESS_P (x
)
1961 && (! flag_pic
|| legitimate_pic_operand_p (x
)))
1964 if (RTX_OK_FOR_BASE_P (x
, strict
))
1968 && GET_CODE (x
) == POST_INC
1969 && RTX_OK_FOR_BASE_P (XEXP (x
, 0), strict
)
1970 && (mode
== SImode
|| mode
== SFmode
|| mode
== HImode
))
1973 if (GET_CODE (x
) == PLUS
)
1975 rtx base
= 0, index
= 0;
1977 if (REG_P (XEXP (x
, 0))
1978 && REGNO_STRICT_OK_FOR_BASE_P (REGNO (XEXP (x
, 0)), strict
))
1981 index
= XEXP (x
, 1);
1984 if (REG_P (XEXP (x
, 1))
1985 && REGNO_STRICT_OK_FOR_BASE_P (REGNO (XEXP (x
, 1)), strict
))
1988 index
= XEXP (x
, 0);
1991 if (base
!= 0 && index
!= 0)
1993 if (GET_CODE (index
) == CONST_INT
)
1995 if (GET_CODE (index
) == CONST
1996 && GET_CODE (XEXP (index
, 0)) != PLUS
1998 || legitimate_pic_operand_p (index
)))
2007 mn10300_address_cost_1 (rtx x
, int *unsig
)
2009 switch (GET_CODE (x
))
2012 switch (REGNO_REG_CLASS (REGNO (x
)))
2038 return (mn10300_address_cost_1 (XEXP (x
, 0), unsig
)
2039 + mn10300_address_cost_1 (XEXP (x
, 1), unsig
));
2044 return mn10300_address_cost (XEXP (x
, 0), !optimize_size
);
2048 return mn10300_address_cost_1 (XEXP (x
, 0), unsig
);
2051 if (INTVAL (x
) == 0)
2053 if (INTVAL (x
) + (*unsig
? 0 : 0x80) < 0x100)
2055 if (INTVAL (x
) + (*unsig
? 0 : 0x8000) < 0x10000)
2057 if (INTVAL (x
) + (*unsig
? 0 : 0x800000) < 0x1000000)
2073 mn10300_address_cost (rtx x
, bool speed ATTRIBUTE_UNUSED
)
2076 return mn10300_address_cost_1 (x
, &s
);
2080 mn10300_rtx_costs (rtx x
, int code
, int outer_code
, int *total
, bool speed ATTRIBUTE_UNUSED
)
2085 /* Zeros are extremely cheap. */
2086 if (INTVAL (x
) == 0 && (outer_code
== SET
|| outer_code
== COMPARE
))
2088 /* If it fits in 8 bits, then it's still relatively cheap. */
2089 else if (INT_8_BITS (INTVAL (x
)))
2091 /* This is the "base" cost, includes constants where either the
2092 upper or lower 16bits are all zeros. */
2093 else if (INT_16_BITS (INTVAL (x
))
2094 || (INTVAL (x
) & 0xffff) == 0
2095 || (INTVAL (x
) & 0xffff0000) == 0)
2104 /* These are more costly than a CONST_INT, but we can relax them,
2105 so they're less costly than a CONST_DOUBLE. */
2110 /* We don't optimize CONST_DOUBLEs well nor do we relax them well,
2111 so their cost is very high. */
2116 /* This is cheap, we can use btst. */
2117 if (outer_code
== COMPARE
)
2121 /* ??? This probably needs more work. */
2133 /* Check whether a constant used to initialize a DImode or DFmode can
2134 use a clr instruction. The code here must be kept in sync with
2138 mn10300_wide_const_load_uses_clr (rtx operands
[2])
2142 if (GET_CODE (operands
[0]) != REG
2143 || REGNO_REG_CLASS (REGNO (operands
[0])) != DATA_REGS
)
2146 switch (GET_CODE (operands
[1]))
2151 split_double (operands
[1], &low
, &high
);
2152 val
[0] = INTVAL (low
);
2153 val
[1] = INTVAL (high
);
2158 if (GET_MODE (operands
[1]) == DFmode
)
2162 REAL_VALUE_FROM_CONST_DOUBLE (rv
, operands
[1]);
2163 REAL_VALUE_TO_TARGET_DOUBLE (rv
, val
);
2165 else if (GET_MODE (operands
[1]) == VOIDmode
2166 || GET_MODE (operands
[1]) == DImode
)
2168 val
[0] = CONST_DOUBLE_LOW (operands
[1]);
2169 val
[1] = CONST_DOUBLE_HIGH (operands
[1]);
2177 return val
[0] == 0 || val
[1] == 0;
2179 /* If using PIC, mark a SYMBOL_REF for a non-global symbol so that we
2180 may access it using GOTOFF instead of GOT. */
2183 mn10300_encode_section_info (tree decl
, rtx rtl
, int first ATTRIBUTE_UNUSED
)
2187 if (GET_CODE (rtl
) != MEM
)
2189 symbol
= XEXP (rtl
, 0);
2190 if (GET_CODE (symbol
) != SYMBOL_REF
)
2194 SYMBOL_REF_FLAG (symbol
) = (*targetm
.binds_local_p
) (decl
);
2197 /* Dispatch tables on the mn10300 are extremely expensive in terms of code
2198 and readonly data size. So we crank up the case threshold value to
2199 encourage a series of if/else comparisons to implement many small switch
2200 statements. In theory, this value could be increased much more if we
2201 were solely optimizing for space, but we keep it "reasonable" to avoid
2202 serious code efficiency lossage. */
2204 unsigned int mn10300_case_values_threshold (void)
2209 /* Worker function for TARGET_ASM_TRAMPOLINE_TEMPLATE. */
2212 mn10300_asm_trampoline_template (FILE *f
)
2214 fprintf (f
, "\tadd -4,sp\n");
2215 fprintf (f
, "\t.long 0x0004fffa\n");
2216 fprintf (f
, "\tmov (0,sp),a0\n");
2217 fprintf (f
, "\tadd 4,sp\n");
2218 fprintf (f
, "\tmov (13,a0),a1\n");
2219 fprintf (f
, "\tmov (17,a0),a0\n");
2220 fprintf (f
, "\tjmp (a0)\n");
2221 fprintf (f
, "\t.long 0\n");
2222 fprintf (f
, "\t.long 0\n");
2225 /* Worker function for TARGET_TRAMPOLINE_INIT. */
2228 mn10300_trampoline_init (rtx m_tramp
, tree fndecl
, rtx chain_value
)
2230 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
2233 emit_block_move (m_tramp
, assemble_trampoline_template (),
2234 GEN_INT (TRAMPOLINE_SIZE
), BLOCK_OP_NORMAL
);
2236 mem
= adjust_address (m_tramp
, SImode
, 0x14);
2237 emit_move_insn (mem
, chain_value
);
2238 mem
= adjust_address (m_tramp
, SImode
, 0x18);
2239 emit_move_insn (mem
, fnaddr
);
2242 /* Output the assembler code for a C++ thunk function.
2243 THUNK_DECL is the declaration for the thunk function itself, FUNCTION
2244 is the decl for the target function. DELTA is an immediate constant
2245 offset to be added to the THIS parameter. If VCALL_OFFSET is nonzero
2246 the word at the adjusted address *(*THIS' + VCALL_OFFSET) should be
2247 additionally added to THIS. Finally jump to the entry point of
2251 mn10300_asm_output_mi_thunk (FILE * file
,
2252 tree thunk_fndecl ATTRIBUTE_UNUSED
,
2253 HOST_WIDE_INT delta
,
2254 HOST_WIDE_INT vcall_offset
,
2259 /* Get the register holding the THIS parameter. Handle the case
2260 where there is a hidden first argument for a returned structure. */
2261 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
2262 _this
= reg_names
[FIRST_ARGUMENT_REGNUM
+ 1];
2264 _this
= reg_names
[FIRST_ARGUMENT_REGNUM
];
2266 fprintf (file
, "\t%s Thunk Entry Point:\n", ASM_COMMENT_START
);
2269 fprintf (file
, "\tadd %d, %s\n", (int) delta
, _this
);
2273 const char * scratch
= reg_names
[FIRST_ADDRESS_REGNUM
+ 1];
2275 fprintf (file
, "\tmov %s, %s\n", _this
, scratch
);
2276 fprintf (file
, "\tmov (%s), %s\n", scratch
, scratch
);
2277 fprintf (file
, "\tadd %d, %s\n", (int) vcall_offset
, scratch
);
2278 fprintf (file
, "\tmov (%s), %s\n", scratch
, scratch
);
2279 fprintf (file
, "\tadd %s, %s\n", scratch
, _this
);
2282 fputs ("\tjmp ", file
);
2283 assemble_name (file
, XSTR (XEXP (DECL_RTL (function
), 0), 0));
2287 /* Return true if mn10300_output_mi_thunk would be able to output the
2288 assembler code for the thunk function specified by the arguments
2289 it is passed, and false otherwise. */
2292 mn10300_can_output_mi_thunk (const_tree thunk_fndecl ATTRIBUTE_UNUSED
,
2293 HOST_WIDE_INT delta ATTRIBUTE_UNUSED
,
2294 HOST_WIDE_INT vcall_offset ATTRIBUTE_UNUSED
,
2295 const_tree function ATTRIBUTE_UNUSED
)