1 /* Output routines for GCC for Renesas / SuperH SH.
2 Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
5 Contributed by Steve Chamberlain (sac@cygnus.com).
6 Improved by Jim Wilson (wilson@cygnus.com).
8 This file is part of GCC.
10 GCC is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
15 GCC is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with GCC; see the file COPYING3. If not see
22 <http://www.gnu.org/licenses/>. */
26 #include "coretypes.h"
28 #include "insn-config.h"
37 #include "hard-reg-set.h"
39 #include "insn-attr.h"
40 #include "diagnostic-core.h"
43 #include "integrate.h"
47 #include "target-def.h"
48 #include "langhooks.h"
49 #include "basic-block.h"
51 #include "cfglayout.h"
53 #include "sched-int.h"
58 #include "alloc-pool.h"
59 #include "tm-constrs.h"
62 int code_for_indirect_jump_scratch
= CODE_FOR_indirect_jump_scratch
;
64 #define MSW (TARGET_LITTLE_ENDIAN ? 1 : 0)
65 #define LSW (TARGET_LITTLE_ENDIAN ? 0 : 1)
67 /* These are some macros to abstract register modes. */
68 #define CONST_OK_FOR_ADD(size) \
69 (TARGET_SHMEDIA ? CONST_OK_FOR_I10 (size) : CONST_OK_FOR_I08 (size))
70 #define GEN_MOV (*(TARGET_SHMEDIA64 ? gen_movdi : gen_movsi))
71 #define GEN_ADD3 (*(TARGET_SHMEDIA64 ? gen_adddi3 : gen_addsi3))
72 #define GEN_SUB3 (*(TARGET_SHMEDIA64 ? gen_subdi3 : gen_subsi3))
74 /* Used to simplify the logic below. Find the attributes wherever
76 #define SH_ATTRIBUTES(decl) \
77 (TYPE_P (decl)) ? TYPE_ATTRIBUTES (decl) \
78 : DECL_ATTRIBUTES (decl) \
79 ? (DECL_ATTRIBUTES (decl)) \
80 : TYPE_ATTRIBUTES (TREE_TYPE (decl))
82 /* Set to 1 by expand_prologue() when the function is an interrupt handler. */
83 int current_function_interrupt
;
85 tree sh_deferred_function_attributes
;
86 tree
*sh_deferred_function_attributes_tail
= &sh_deferred_function_attributes
;
88 /* Global variables for machine-dependent things. */
90 /* Which cpu are we scheduling for. */
91 enum processor_type sh_cpu
;
93 /* Definitions used in ready queue reordering for first scheduling pass. */
95 /* Reg weights arrays for modes SFmode and SImode, indexed by insn LUID. */
96 static short *regmode_weight
[2];
98 /* Total SFmode and SImode weights of scheduled insns. */
99 static int curr_regmode_pressure
[2];
101 /* Number of r0 life regions. */
102 static int r0_life_regions
;
104 /* If true, skip cycles for Q -> R movement. */
105 static int skip_cycles
= 0;
107 /* Cached value of can_issue_more. This is cached in sh_variable_issue hook
108 and returned from sh_reorder2. */
109 static short cached_can_issue_more
;
111 /* Unique number for UNSPEC_BBR pattern. */
112 static unsigned int unspec_bbr_uid
= 1;
114 /* Provides the class number of the smallest class containing
117 enum reg_class regno_reg_class
[FIRST_PSEUDO_REGISTER
] =
119 R0_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
120 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
121 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
122 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
123 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
124 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
125 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
126 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
127 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
128 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
129 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
130 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
131 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
132 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
133 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
134 GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
, GENERAL_REGS
,
135 FP0_REGS
,FP_REGS
, FP_REGS
, FP_REGS
,
136 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
137 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
138 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
139 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
140 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
141 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
142 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
143 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
144 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
145 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
146 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
147 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
148 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
149 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
150 FP_REGS
, FP_REGS
, FP_REGS
, FP_REGS
,
151 TARGET_REGS
, TARGET_REGS
, TARGET_REGS
, TARGET_REGS
,
152 TARGET_REGS
, TARGET_REGS
, TARGET_REGS
, TARGET_REGS
,
153 DF_REGS
, DF_REGS
, DF_REGS
, DF_REGS
,
154 DF_REGS
, DF_REGS
, DF_REGS
, DF_REGS
,
155 NO_REGS
, GENERAL_REGS
, PR_REGS
, T_REGS
,
156 MAC_REGS
, MAC_REGS
, FPUL_REGS
, FPSCR_REGS
,
157 GENERAL_REGS
, GENERAL_REGS
,
160 char sh_register_names
[FIRST_PSEUDO_REGISTER
] \
161 [MAX_REGISTER_NAME_LENGTH
+ 1] = SH_REGISTER_NAMES_INITIALIZER
;
163 char sh_additional_register_names
[ADDREGNAMES_SIZE
] \
164 [MAX_ADDITIONAL_REGISTER_NAME_LENGTH
+ 1]
165 = SH_ADDITIONAL_REGISTER_NAMES_INITIALIZER
;
167 int assembler_dialect
;
169 static bool shmedia_space_reserved_for_target_registers
;
171 static bool sh_handle_option (size_t, const char *, int);
172 static void split_branches (rtx
);
173 static int branch_dest (rtx
);
174 static void force_into (rtx
, rtx
);
175 static void print_slot (rtx
);
176 static rtx
add_constant (rtx
, enum machine_mode
, rtx
);
177 static void dump_table (rtx
, rtx
);
178 static int hi_const (rtx
);
179 static int broken_move (rtx
);
180 static int mova_p (rtx
);
181 static rtx
find_barrier (int, rtx
, rtx
);
182 static int noncall_uses_reg (rtx
, rtx
, rtx
*);
183 static rtx
gen_block_redirect (rtx
, int, int);
184 static void sh_reorg (void);
185 static void sh_option_override (void);
186 static void sh_option_optimization (int, int);
187 static void output_stack_adjust (int, rtx
, int, HARD_REG_SET
*, bool);
188 static rtx
frame_insn (rtx
);
189 static rtx
push (int);
190 static void pop (int);
191 static void push_regs (HARD_REG_SET
*, int);
192 static int calc_live_regs (HARD_REG_SET
*);
193 static HOST_WIDE_INT
rounded_frame_size (int);
194 static bool sh_frame_pointer_required (void);
195 static rtx
mark_constant_pool_use (rtx
);
196 static tree
sh_handle_interrupt_handler_attribute (tree
*, tree
, tree
, int, bool *);
197 static tree
sh_handle_resbank_handler_attribute (tree
*, tree
,
199 static tree
sh2a_handle_function_vector_handler_attribute (tree
*, tree
,
201 static tree
sh_handle_sp_switch_attribute (tree
*, tree
, tree
, int, bool *);
202 static tree
sh_handle_trap_exit_attribute (tree
*, tree
, tree
, int, bool *);
203 static tree
sh_handle_renesas_attribute (tree
*, tree
, tree
, int, bool *);
204 static void sh_print_operand (FILE *, rtx
, int);
205 static void sh_print_operand_address (FILE *, rtx
);
206 static bool sh_print_operand_punct_valid_p (unsigned char code
);
207 static void sh_output_function_epilogue (FILE *, HOST_WIDE_INT
);
208 static void sh_insert_attributes (tree
, tree
*);
209 static const char *sh_check_pch_target_flags (int);
210 static int sh_register_move_cost (enum machine_mode
, reg_class_t
, reg_class_t
);
211 static int sh_adjust_cost (rtx
, rtx
, rtx
, int);
212 static int sh_issue_rate (void);
213 static int sh_dfa_new_cycle (FILE *, int, rtx
, int, int, int *sort_p
);
214 static short find_set_regmode_weight (rtx
, enum machine_mode
);
215 static short find_insn_regmode_weight (rtx
, enum machine_mode
);
216 static void find_regmode_weight (basic_block
, enum machine_mode
);
217 static int find_r0_life_regions (basic_block
);
218 static void sh_md_init_global (FILE *, int, int);
219 static void sh_md_finish_global (FILE *, int);
220 static int rank_for_reorder (const void *, const void *);
221 static void swap_reorder (rtx
*, int);
222 static void ready_reorder (rtx
*, int);
223 static short high_pressure (enum machine_mode
);
224 static int sh_reorder (FILE *, int, rtx
*, int *, int);
225 static int sh_reorder2 (FILE *, int, rtx
*, int *, int);
226 static void sh_md_init (FILE *, int, int);
227 static int sh_variable_issue (FILE *, int, rtx
, int);
229 static bool sh_function_ok_for_sibcall (tree
, tree
);
231 static bool sh_cannot_modify_jumps_p (void);
232 static reg_class_t
sh_target_reg_class (void);
233 static bool sh_optimize_target_register_callee_saved (bool);
234 static bool sh_ms_bitfield_layout_p (const_tree
);
236 static void sh_init_builtins (void);
237 static tree
sh_builtin_decl (unsigned, bool);
238 static void sh_media_init_builtins (void);
239 static tree
sh_media_builtin_decl (unsigned, bool);
240 static rtx
sh_expand_builtin (tree
, rtx
, rtx
, enum machine_mode
, int);
241 static void sh_output_mi_thunk (FILE *, tree
, HOST_WIDE_INT
, HOST_WIDE_INT
, tree
);
242 static void sh_file_start (void);
243 static int flow_dependent_p (rtx
, rtx
);
244 static void flow_dependent_p_1 (rtx
, const_rtx
, void *);
245 static int shiftcosts (rtx
);
246 static int andcosts (rtx
);
247 static int addsubcosts (rtx
);
248 static int multcosts (rtx
);
249 static bool unspec_caller_rtx_p (rtx
);
250 static bool sh_cannot_copy_insn_p (rtx
);
251 static bool sh_rtx_costs (rtx
, int, int, int *, bool);
252 static int sh_address_cost (rtx
, bool);
253 static int sh_pr_n_sets (void);
254 static rtx
sh_allocate_initial_value (rtx
);
255 static bool sh_legitimate_address_p (enum machine_mode
, rtx
, bool);
256 static rtx
sh_legitimize_address (rtx
, rtx
, enum machine_mode
);
257 static int shmedia_target_regs_stack_space (HARD_REG_SET
*);
258 static int shmedia_reserve_space_for_target_registers_p (int, HARD_REG_SET
*);
259 static int shmedia_target_regs_stack_adjust (HARD_REG_SET
*);
260 static int scavenge_reg (HARD_REG_SET
*s
);
261 struct save_schedule_s
;
262 static struct save_entry_s
*sh5_schedule_saves (HARD_REG_SET
*,
263 struct save_schedule_s
*, int);
265 static rtx
sh_struct_value_rtx (tree
, int);
266 static rtx
sh_function_value (const_tree
, const_tree
, bool);
267 static bool sh_function_value_regno_p (const unsigned int);
268 static rtx
sh_libcall_value (enum machine_mode
, const_rtx
);
269 static bool sh_return_in_memory (const_tree
, const_tree
);
270 static rtx
sh_builtin_saveregs (void);
271 static void sh_setup_incoming_varargs (CUMULATIVE_ARGS
*, enum machine_mode
, tree
, int *, int);
272 static bool sh_strict_argument_naming (CUMULATIVE_ARGS
*);
273 static bool sh_pretend_outgoing_varargs_named (CUMULATIVE_ARGS
*);
274 static tree
sh_build_builtin_va_list (void);
275 static void sh_va_start (tree
, rtx
);
276 static tree
sh_gimplify_va_arg_expr (tree
, tree
, gimple_seq
*, gimple_seq
*);
277 static bool sh_promote_prototypes (const_tree
);
278 static enum machine_mode
sh_promote_function_mode (const_tree type
,
283 static bool sh_pass_by_reference (CUMULATIVE_ARGS
*, enum machine_mode
,
285 static bool sh_callee_copies (CUMULATIVE_ARGS
*, enum machine_mode
,
287 static int sh_arg_partial_bytes (CUMULATIVE_ARGS
*, enum machine_mode
,
289 static void sh_function_arg_advance (CUMULATIVE_ARGS
*, enum machine_mode
,
291 static rtx
sh_function_arg (CUMULATIVE_ARGS
*, enum machine_mode
,
293 static bool sh_scalar_mode_supported_p (enum machine_mode
);
294 static int sh_dwarf_calling_convention (const_tree
);
295 static void sh_encode_section_info (tree
, rtx
, int);
296 static int sh2a_function_vector_p (tree
);
297 static void sh_trampoline_init (rtx
, tree
, rtx
);
298 static rtx
sh_trampoline_adjust_address (rtx
);
300 static const struct attribute_spec sh_attribute_table
[] =
302 /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
303 { "interrupt_handler", 0, 0, true, false, false, sh_handle_interrupt_handler_attribute
},
304 { "sp_switch", 1, 1, true, false, false, sh_handle_sp_switch_attribute
},
305 { "trap_exit", 1, 1, true, false, false, sh_handle_trap_exit_attribute
},
306 { "renesas", 0, 0, false, true, false, sh_handle_renesas_attribute
},
307 { "trapa_handler", 0, 0, true, false, false, sh_handle_interrupt_handler_attribute
},
308 { "nosave_low_regs", 0, 0, true, false, false, sh_handle_interrupt_handler_attribute
},
309 { "resbank", 0, 0, true, false, false, sh_handle_resbank_handler_attribute
},
310 { "function_vector", 1, 1, true, false, false, sh2a_handle_function_vector_handler_attribute
},
312 /* Symbian support adds three new attributes:
313 dllexport - for exporting a function/variable that will live in a dll
314 dllimport - for importing a function/variable from a dll
316 Microsoft allows multiple declspecs in one __declspec, separating
317 them with spaces. We do NOT support this. Instead, use __declspec
319 { "dllimport", 0, 0, true, false, false, sh_symbian_handle_dll_attribute
},
320 { "dllexport", 0, 0, true, false, false, sh_symbian_handle_dll_attribute
},
322 { NULL
, 0, 0, false, false, false, NULL
}
325 /* Initialize the GCC target structure. */
326 #undef TARGET_ATTRIBUTE_TABLE
327 #define TARGET_ATTRIBUTE_TABLE sh_attribute_table
329 /* The next two are used for debug info when compiling with -gdwarf. */
330 #undef TARGET_ASM_UNALIGNED_HI_OP
331 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uaword\t"
332 #undef TARGET_ASM_UNALIGNED_SI_OP
333 #define TARGET_ASM_UNALIGNED_SI_OP "\t.ualong\t"
335 /* These are NULLed out on non-SH5 in TARGET_OPTION_OVERRIDE. */
336 #undef TARGET_ASM_UNALIGNED_DI_OP
337 #define TARGET_ASM_UNALIGNED_DI_OP "\t.uaquad\t"
338 #undef TARGET_ASM_ALIGNED_DI_OP
339 #define TARGET_ASM_ALIGNED_DI_OP "\t.quad\t"
341 #undef TARGET_OPTION_OVERRIDE
342 #define TARGET_OPTION_OVERRIDE sh_option_override
343 #undef TARGET_OPTION_OPTIMIZATION
344 #define TARGET_OPTION_OPTIMIZATION sh_option_optimization
346 #undef TARGET_PRINT_OPERAND
347 #define TARGET_PRINT_OPERAND sh_print_operand
348 #undef TARGET_PRINT_OPERAND_ADDRESS
349 #define TARGET_PRINT_OPERAND_ADDRESS sh_print_operand_address
350 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
351 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sh_print_operand_punct_valid_p
353 #undef TARGET_ASM_FUNCTION_EPILOGUE
354 #define TARGET_ASM_FUNCTION_EPILOGUE sh_output_function_epilogue
356 #undef TARGET_ASM_OUTPUT_MI_THUNK
357 #define TARGET_ASM_OUTPUT_MI_THUNK sh_output_mi_thunk
359 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
360 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
362 #undef TARGET_ASM_FILE_START
363 #define TARGET_ASM_FILE_START sh_file_start
364 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
365 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
367 #undef TARGET_DEFAULT_TARGET_FLAGS
368 #define TARGET_DEFAULT_TARGET_FLAGS TARGET_DEFAULT
369 #undef TARGET_HANDLE_OPTION
370 #define TARGET_HANDLE_OPTION sh_handle_option
372 #undef TARGET_REGISTER_MOVE_COST
373 #define TARGET_REGISTER_MOVE_COST sh_register_move_cost
375 #undef TARGET_INSERT_ATTRIBUTES
376 #define TARGET_INSERT_ATTRIBUTES sh_insert_attributes
378 #undef TARGET_SCHED_ADJUST_COST
379 #define TARGET_SCHED_ADJUST_COST sh_adjust_cost
381 #undef TARGET_SCHED_ISSUE_RATE
382 #define TARGET_SCHED_ISSUE_RATE sh_issue_rate
384 /* The next 5 hooks have been implemented for reenabling sched1. With the
385 help of these macros we are limiting the movement of insns in sched1 to
386 reduce the register pressure. The overall idea is to keep count of SImode
387 and SFmode regs required by already scheduled insns. When these counts
388 cross some threshold values; give priority to insns that free registers.
389 The insn that frees registers is most likely to be the insn with lowest
390 LUID (original insn order); but such an insn might be there in the stalled
391 queue (Q) instead of the ready queue (R). To solve this, we skip cycles
392 upto a max of 8 cycles so that such insns may move from Q -> R.
394 The description of the hooks are as below:
396 TARGET_SCHED_INIT_GLOBAL: Added a new target hook in the generic
397 scheduler; it is called inside the sched_init function just after
398 find_insn_reg_weights function call. It is used to calculate the SImode
399 and SFmode weights of insns of basic blocks; much similar to what
400 find_insn_reg_weights does.
401 TARGET_SCHED_FINISH_GLOBAL: Corresponding cleanup hook.
403 TARGET_SCHED_DFA_NEW_CYCLE: Skip cycles if high register pressure is
404 indicated by TARGET_SCHED_REORDER2; doing this may move insns from
407 TARGET_SCHED_REORDER: If the register pressure for SImode or SFmode is
408 high; reorder the ready queue so that the insn with lowest LUID will be
411 TARGET_SCHED_REORDER2: If the register pressure is high, indicate to
412 TARGET_SCHED_DFA_NEW_CYCLE to skip cycles.
414 TARGET_SCHED_VARIABLE_ISSUE: Cache the value of can_issue_more so that it
415 can be returned from TARGET_SCHED_REORDER2.
417 TARGET_SCHED_INIT: Reset the register pressure counting variables. */
419 #undef TARGET_SCHED_DFA_NEW_CYCLE
420 #define TARGET_SCHED_DFA_NEW_CYCLE sh_dfa_new_cycle
422 #undef TARGET_SCHED_INIT_GLOBAL
423 #define TARGET_SCHED_INIT_GLOBAL sh_md_init_global
425 #undef TARGET_SCHED_FINISH_GLOBAL
426 #define TARGET_SCHED_FINISH_GLOBAL sh_md_finish_global
428 #undef TARGET_SCHED_VARIABLE_ISSUE
429 #define TARGET_SCHED_VARIABLE_ISSUE sh_variable_issue
431 #undef TARGET_SCHED_REORDER
432 #define TARGET_SCHED_REORDER sh_reorder
434 #undef TARGET_SCHED_REORDER2
435 #define TARGET_SCHED_REORDER2 sh_reorder2
437 #undef TARGET_SCHED_INIT
438 #define TARGET_SCHED_INIT sh_md_init
440 #undef TARGET_LEGITIMIZE_ADDRESS
441 #define TARGET_LEGITIMIZE_ADDRESS sh_legitimize_address
443 #undef TARGET_CANNOT_MODIFY_JUMPS_P
444 #define TARGET_CANNOT_MODIFY_JUMPS_P sh_cannot_modify_jumps_p
445 #undef TARGET_BRANCH_TARGET_REGISTER_CLASS
446 #define TARGET_BRANCH_TARGET_REGISTER_CLASS sh_target_reg_class
447 #undef TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED
448 #define TARGET_BRANCH_TARGET_REGISTER_CALLEE_SAVED \
449 sh_optimize_target_register_callee_saved
451 #undef TARGET_MS_BITFIELD_LAYOUT_P
452 #define TARGET_MS_BITFIELD_LAYOUT_P sh_ms_bitfield_layout_p
454 #undef TARGET_INIT_BUILTINS
455 #define TARGET_INIT_BUILTINS sh_init_builtins
456 #undef TARGET_BUILTIN_DECL
457 #define TARGET_BUILTIN_DECL sh_builtin_decl
458 #undef TARGET_EXPAND_BUILTIN
459 #define TARGET_EXPAND_BUILTIN sh_expand_builtin
461 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
462 #define TARGET_FUNCTION_OK_FOR_SIBCALL sh_function_ok_for_sibcall
464 #undef TARGET_CANNOT_COPY_INSN_P
465 #define TARGET_CANNOT_COPY_INSN_P sh_cannot_copy_insn_p
466 #undef TARGET_RTX_COSTS
467 #define TARGET_RTX_COSTS sh_rtx_costs
468 #undef TARGET_ADDRESS_COST
469 #define TARGET_ADDRESS_COST sh_address_cost
470 #undef TARGET_ALLOCATE_INITIAL_VALUE
471 #define TARGET_ALLOCATE_INITIAL_VALUE sh_allocate_initial_value
473 #undef TARGET_MACHINE_DEPENDENT_REORG
474 #define TARGET_MACHINE_DEPENDENT_REORG sh_reorg
476 #undef TARGET_DWARF_REGISTER_SPAN
477 #define TARGET_DWARF_REGISTER_SPAN sh_dwarf_register_span
480 #undef TARGET_HAVE_TLS
481 #define TARGET_HAVE_TLS true
484 #undef TARGET_PROMOTE_PROTOTYPES
485 #define TARGET_PROMOTE_PROTOTYPES sh_promote_prototypes
486 #undef TARGET_PROMOTE_FUNCTION_MODE
487 #define TARGET_PROMOTE_FUNCTION_MODE sh_promote_function_mode
489 #undef TARGET_FUNCTION_VALUE
490 #define TARGET_FUNCTION_VALUE sh_function_value
491 #undef TARGET_FUNCTION_VALUE_REGNO_P
492 #define TARGET_FUNCTION_VALUE_REGNO_P sh_function_value_regno_p
493 #undef TARGET_LIBCALL_VALUE
494 #define TARGET_LIBCALL_VALUE sh_libcall_value
495 #undef TARGET_STRUCT_VALUE_RTX
496 #define TARGET_STRUCT_VALUE_RTX sh_struct_value_rtx
497 #undef TARGET_RETURN_IN_MEMORY
498 #define TARGET_RETURN_IN_MEMORY sh_return_in_memory
500 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
501 #define TARGET_EXPAND_BUILTIN_SAVEREGS sh_builtin_saveregs
502 #undef TARGET_SETUP_INCOMING_VARARGS
503 #define TARGET_SETUP_INCOMING_VARARGS sh_setup_incoming_varargs
504 #undef TARGET_STRICT_ARGUMENT_NAMING
505 #define TARGET_STRICT_ARGUMENT_NAMING sh_strict_argument_naming
506 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
507 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED sh_pretend_outgoing_varargs_named
508 #undef TARGET_MUST_PASS_IN_STACK
509 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
510 #undef TARGET_PASS_BY_REFERENCE
511 #define TARGET_PASS_BY_REFERENCE sh_pass_by_reference
512 #undef TARGET_CALLEE_COPIES
513 #define TARGET_CALLEE_COPIES sh_callee_copies
514 #undef TARGET_ARG_PARTIAL_BYTES
515 #define TARGET_ARG_PARTIAL_BYTES sh_arg_partial_bytes
516 #undef TARGET_FUNCTION_ARG
517 #define TARGET_FUNCTION_ARG sh_function_arg
518 #undef TARGET_FUNCTION_ARG_ADVANCE
519 #define TARGET_FUNCTION_ARG_ADVANCE sh_function_arg_advance
521 #undef TARGET_BUILD_BUILTIN_VA_LIST
522 #define TARGET_BUILD_BUILTIN_VA_LIST sh_build_builtin_va_list
523 #undef TARGET_EXPAND_BUILTIN_VA_START
524 #define TARGET_EXPAND_BUILTIN_VA_START sh_va_start
525 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
526 #define TARGET_GIMPLIFY_VA_ARG_EXPR sh_gimplify_va_arg_expr
528 #undef TARGET_SCALAR_MODE_SUPPORTED_P
529 #define TARGET_SCALAR_MODE_SUPPORTED_P sh_scalar_mode_supported_p
530 #undef TARGET_VECTOR_MODE_SUPPORTED_P
531 #define TARGET_VECTOR_MODE_SUPPORTED_P sh_vector_mode_supported_p
533 #undef TARGET_CHECK_PCH_TARGET_FLAGS
534 #define TARGET_CHECK_PCH_TARGET_FLAGS sh_check_pch_target_flags
536 #undef TARGET_DWARF_CALLING_CONVENTION
537 #define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention
539 #undef TARGET_FRAME_POINTER_REQUIRED
540 #define TARGET_FRAME_POINTER_REQUIRED sh_frame_pointer_required
542 /* Return regmode weight for insn. */
543 #define INSN_REGMODE_WEIGHT(INSN, MODE) regmode_weight[((MODE) == SImode) ? 0 : 1][INSN_UID (INSN)]
545 /* Return current register pressure for regmode. */
546 #define CURR_REGMODE_PRESSURE(MODE) curr_regmode_pressure[((MODE) == SImode) ? 0 : 1]
548 #undef TARGET_ENCODE_SECTION_INFO
549 #define TARGET_ENCODE_SECTION_INFO sh_encode_section_info
553 #undef TARGET_ENCODE_SECTION_INFO
554 #define TARGET_ENCODE_SECTION_INFO sh_symbian_encode_section_info
555 #undef TARGET_STRIP_NAME_ENCODING
556 #define TARGET_STRIP_NAME_ENCODING sh_symbian_strip_name_encoding
557 #undef TARGET_CXX_IMPORT_EXPORT_CLASS
558 #define TARGET_CXX_IMPORT_EXPORT_CLASS sh_symbian_import_export_class
562 #undef TARGET_SECONDARY_RELOAD
563 #define TARGET_SECONDARY_RELOAD sh_secondary_reload
565 #undef TARGET_LEGITIMATE_ADDRESS_P
566 #define TARGET_LEGITIMATE_ADDRESS_P sh_legitimate_address_p
568 #undef TARGET_TRAMPOLINE_INIT
569 #define TARGET_TRAMPOLINE_INIT sh_trampoline_init
570 #undef TARGET_TRAMPOLINE_ADJUST_ADDRESS
571 #define TARGET_TRAMPOLINE_ADJUST_ADDRESS sh_trampoline_adjust_address
573 /* Machine-specific symbol_ref flags. */
574 #define SYMBOL_FLAG_FUNCVEC_FUNCTION (SYMBOL_FLAG_MACH_DEP << 0)
576 struct gcc_target targetm
= TARGET_INITIALIZER
;
578 /* Implement TARGET_HANDLE_OPTION. */
581 sh_handle_option (size_t code
, const char *arg ATTRIBUTE_UNUSED
,
582 int value ATTRIBUTE_UNUSED
)
587 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH1
;
591 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2
;
595 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2A
;
599 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2A_NOFPU
;
603 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2A_SINGLE
;
606 case OPT_m2a_single_only
:
607 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2A_SINGLE_ONLY
;
611 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH2E
;
615 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH3
;
619 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH3E
;
626 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4
;
630 case OPT_m4_100_nofpu
:
631 case OPT_m4_200_nofpu
:
632 case OPT_m4_300_nofpu
:
636 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4_NOFPU
;
640 case OPT_m4_100_single
:
641 case OPT_m4_200_single
:
642 case OPT_m4_300_single
:
643 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4_SINGLE
;
646 case OPT_m4_single_only
:
647 case OPT_m4_100_single_only
:
648 case OPT_m4_200_single_only
:
649 case OPT_m4_300_single_only
:
650 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4_SINGLE_ONLY
;
654 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4A
;
659 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4A_NOFPU
;
663 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4A_SINGLE
;
666 case OPT_m4a_single_only
:
667 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH4A_SINGLE_ONLY
;
671 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_32MEDIA
;
674 case OPT_m5_32media_nofpu
:
675 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_32MEDIA_NOFPU
;
679 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_64MEDIA
;
682 case OPT_m5_64media_nofpu
:
683 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_64MEDIA_NOFPU
;
687 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_COMPACT
;
690 case OPT_m5_compact_nofpu
:
691 target_flags
= (target_flags
& ~MASK_ARCH
) | SELECT_SH5_COMPACT_NOFPU
;
699 /* Set default optimization options. */
701 sh_option_optimization (int level
, int size
)
706 sh_div_str
= "inv:minlat";
710 target_flags
|= MASK_SMALLCODE
;
711 sh_div_str
= SH_DIV_STR_FOR_SIZE
;
714 TARGET_CBRANCHDI4
= 1;
715 /* We can't meaningfully test TARGET_SHMEDIA here, because -m options
716 haven't been parsed yet, hence we'd read only the default.
717 sh_target_reg_class will return NO_REGS if this is not SHMEDIA, so
718 it's OK to always set flag_branch_target_load_optimize. */
721 flag_branch_target_load_optimize
= 1;
723 target_flags
|= MASK_SAVE_ALL_TARGET_REGS
;
725 /* Likewise, we can't meaningfully test TARGET_SH2E / TARGET_IEEE
726 here, so leave it to TARGET_OPTION_OVERRIDE to set
727 flag_finite_math_only. We set it to 2 here so we know if the user
728 explicitly requested this to be on or off. */
729 flag_finite_math_only
= 2;
730 /* If flag_schedule_insns is 1, we set it to 2 here so we know if
731 the user explicitly requested this to be on or off. */
732 if (flag_schedule_insns
> 0)
733 flag_schedule_insns
= 2;
735 set_param_value ("simultaneous-prefetches", 2);
738 /* Implement TARGET_OPTION_OVERRIDE macro. Validate and override
739 various options, and do some machine dependent initialization. */
741 sh_option_override (void)
745 SUBTARGET_OVERRIDE_OPTIONS
;
746 if (flag_finite_math_only
== 2)
747 flag_finite_math_only
748 = !flag_signaling_nans
&& TARGET_SH2E
&& ! TARGET_IEEE
;
749 if (TARGET_SH2E
&& !flag_finite_math_only
)
750 target_flags
|= MASK_IEEE
;
751 sh_cpu
= PROCESSOR_SH1
;
752 assembler_dialect
= 0;
754 sh_cpu
= PROCESSOR_SH2
;
756 sh_cpu
= PROCESSOR_SH2E
;
758 sh_cpu
= PROCESSOR_SH2A
;
760 sh_cpu
= PROCESSOR_SH3
;
762 sh_cpu
= PROCESSOR_SH3E
;
765 assembler_dialect
= 1;
766 sh_cpu
= PROCESSOR_SH4
;
768 if (TARGET_SH4A_ARCH
)
770 assembler_dialect
= 1;
771 sh_cpu
= PROCESSOR_SH4A
;
775 sh_cpu
= PROCESSOR_SH5
;
776 target_flags
|= MASK_ALIGN_DOUBLE
;
777 if (TARGET_SHMEDIA_FPU
)
778 target_flags
|= MASK_FMOVD
;
781 /* There are no delay slots on SHmedia. */
782 flag_delayed_branch
= 0;
783 /* Relaxation isn't yet supported for SHmedia */
784 target_flags
&= ~MASK_RELAX
;
785 /* After reload, if conversion does little good but can cause
787 - find_if_block doesn't do anything for SH because we don't
788 have conditional execution patterns. (We use conditional
789 move patterns, which are handled differently, and only
791 - find_cond_trap doesn't do anything for the SH because we
792 don't have conditional traps.
793 - find_if_case_1 uses redirect_edge_and_branch_force in
794 the only path that does an optimization, and this causes
795 an ICE when branch targets are in registers.
796 - find_if_case_2 doesn't do anything for the SHmedia after
797 reload except when it can redirect a tablejump - and
798 that's rather rare. */
799 flag_if_conversion2
= 0;
800 if (! strcmp (sh_div_str
, "call"))
801 sh_div_strategy
= SH_DIV_CALL
;
802 else if (! strcmp (sh_div_str
, "call2"))
803 sh_div_strategy
= SH_DIV_CALL2
;
804 if (! strcmp (sh_div_str
, "fp") && TARGET_FPU_ANY
)
805 sh_div_strategy
= SH_DIV_FP
;
806 else if (! strcmp (sh_div_str
, "inv"))
807 sh_div_strategy
= SH_DIV_INV
;
808 else if (! strcmp (sh_div_str
, "inv:minlat"))
809 sh_div_strategy
= SH_DIV_INV_MINLAT
;
810 else if (! strcmp (sh_div_str
, "inv20u"))
811 sh_div_strategy
= SH_DIV_INV20U
;
812 else if (! strcmp (sh_div_str
, "inv20l"))
813 sh_div_strategy
= SH_DIV_INV20L
;
814 else if (! strcmp (sh_div_str
, "inv:call2"))
815 sh_div_strategy
= SH_DIV_INV_CALL2
;
816 else if (! strcmp (sh_div_str
, "inv:call"))
817 sh_div_strategy
= SH_DIV_INV_CALL
;
818 else if (! strcmp (sh_div_str
, "inv:fp"))
821 sh_div_strategy
= SH_DIV_INV_FP
;
823 sh_div_strategy
= SH_DIV_INV
;
825 TARGET_CBRANCHDI4
= 0;
826 /* Assembler CFI isn't yet fully supported for SHmedia. */
827 flag_dwarf2_cfi_asm
= 0;
832 /* Only the sh64-elf assembler fully supports .quad properly. */
833 targetm
.asm_out
.aligned_op
.di
= NULL
;
834 targetm
.asm_out
.unaligned_op
.di
= NULL
;
838 if (! strcmp (sh_div_str
, "call-div1"))
839 sh_div_strategy
= SH_DIV_CALL_DIV1
;
840 else if (! strcmp (sh_div_str
, "call-fp")
841 && (TARGET_FPU_DOUBLE
842 || (TARGET_HARD_SH4
&& TARGET_SH2E
)
843 || (TARGET_SHCOMPACT
&& TARGET_FPU_ANY
)))
844 sh_div_strategy
= SH_DIV_CALL_FP
;
845 else if (! strcmp (sh_div_str
, "call-table") && TARGET_SH2
)
846 sh_div_strategy
= SH_DIV_CALL_TABLE
;
848 /* Pick one that makes most sense for the target in general.
849 It is not much good to use different functions depending
850 on -Os, since then we'll end up with two different functions
851 when some of the code is compiled for size, and some for
854 /* SH4 tends to emphasize speed. */
856 sh_div_strategy
= SH_DIV_CALL_TABLE
;
857 /* These have their own way of doing things. */
858 else if (TARGET_SH2A
)
859 sh_div_strategy
= SH_DIV_INTRINSIC
;
860 /* ??? Should we use the integer SHmedia function instead? */
861 else if (TARGET_SHCOMPACT
&& TARGET_FPU_ANY
)
862 sh_div_strategy
= SH_DIV_CALL_FP
;
863 /* SH1 .. SH3 cores often go into small-footprint systems, so
864 default to the smallest implementation available. */
865 else if (TARGET_SH2
) /* ??? EXPERIMENTAL */
866 sh_div_strategy
= SH_DIV_CALL_TABLE
;
868 sh_div_strategy
= SH_DIV_CALL_DIV1
;
871 TARGET_PRETEND_CMOVE
= 0;
872 if (sh_divsi3_libfunc
[0])
873 ; /* User supplied - leave it alone. */
874 else if (TARGET_DIVIDE_CALL_FP
)
875 sh_divsi3_libfunc
= "__sdivsi3_i4";
876 else if (TARGET_DIVIDE_CALL_TABLE
)
877 sh_divsi3_libfunc
= "__sdivsi3_i4i";
879 sh_divsi3_libfunc
= "__sdivsi3_1";
881 sh_divsi3_libfunc
= "__sdivsi3";
882 if (sh_branch_cost
== -1)
884 = TARGET_SH5
? 1 : ! TARGET_SH2
|| TARGET_HARD_SH4
? 2 : 1;
886 for (regno
= 0; regno
< FIRST_PSEUDO_REGISTER
; regno
++)
887 if (! VALID_REGISTER_P (regno
))
888 sh_register_names
[regno
][0] = '\0';
890 for (regno
= 0; regno
< ADDREGNAMES_SIZE
; regno
++)
891 if (! VALID_REGISTER_P (ADDREGNAMES_REGNO (regno
)))
892 sh_additional_register_names
[regno
][0] = '\0';
894 flag_omit_frame_pointer
= (PREFERRED_DEBUGGING_TYPE
== DWARF2_DEBUG
);
896 if ((flag_pic
&& ! TARGET_PREFERGOT
)
897 || (TARGET_SHMEDIA
&& !TARGET_PT_FIXED
))
898 flag_no_function_cse
= 1;
900 if (targetm
.small_register_classes_for_mode_p (VOIDmode
)) \
902 /* Never run scheduling before reload, since that can
903 break global alloc, and generates slower code anyway due
904 to the pressure on R0. */
905 /* Enable sched1 for SH4 if the user explicitly requests.
906 When sched1 is enabled, the ready queue will be reordered by
907 the target hooks if pressure is high. We can not do this for
908 PIC, SH3 and lower as they give spill failures for R0. */
909 if (!TARGET_HARD_SH4
|| flag_pic
)
910 flag_schedule_insns
= 0;
911 /* ??? Current exception handling places basic block boundaries
912 after call_insns. It causes the high pressure on R0 and gives
913 spill failures for R0 in reload. See PR 22553 and the thread
915 <http://gcc.gnu.org/ml/gcc-patches/2005-10/msg00816.html>. */
916 else if (flag_exceptions
)
918 if (flag_schedule_insns
== 1)
919 warning (0, "ignoring -fschedule-insns because of exception handling bug");
920 flag_schedule_insns
= 0;
922 else if (flag_schedule_insns
== 2)
923 flag_schedule_insns
= 0;
926 if ((target_flags_explicit
& MASK_ACCUMULATE_OUTGOING_ARGS
) == 0)
927 target_flags
|= MASK_ACCUMULATE_OUTGOING_ARGS
;
929 /* Unwind info is not correct around the CFG unless either a frame
930 pointer is present or M_A_O_A is set. Fixing this requires rewriting
931 unwind info generation to be aware of the CFG and propagating states
933 if ((flag_unwind_tables
|| flag_asynchronous_unwind_tables
934 || flag_exceptions
|| flag_non_call_exceptions
)
935 && flag_omit_frame_pointer
936 && !(target_flags
& MASK_ACCUMULATE_OUTGOING_ARGS
))
938 if (target_flags_explicit
& MASK_ACCUMULATE_OUTGOING_ARGS
)
939 warning (0, "unwind tables currently require either a frame pointer "
940 "or -maccumulate-outgoing-args for correctness");
941 target_flags
|= MASK_ACCUMULATE_OUTGOING_ARGS
;
944 /* Unwinding with -freorder-blocks-and-partition does not work on this
945 architecture, because it requires far jumps to label crossing between
946 hot/cold sections which are rejected on this architecture. */
947 if (flag_reorder_blocks_and_partition
)
951 inform (input_location
,
952 "-freorder-blocks-and-partition does not work with "
953 "exceptions on this architecture");
954 flag_reorder_blocks_and_partition
= 0;
955 flag_reorder_blocks
= 1;
957 else if (flag_unwind_tables
)
959 inform (input_location
,
960 "-freorder-blocks-and-partition does not support unwind "
961 "info on this architecture");
962 flag_reorder_blocks_and_partition
= 0;
963 flag_reorder_blocks
= 1;
967 if (align_loops
== 0)
968 align_loops
= 1 << (TARGET_SH5
? 3 : 2);
969 if (align_jumps
== 0)
970 align_jumps
= 1 << CACHE_LOG
;
971 else if (align_jumps
< (TARGET_SHMEDIA
? 4 : 2))
972 align_jumps
= TARGET_SHMEDIA
? 4 : 2;
974 /* Allocation boundary (in *bytes*) for the code of a function.
975 SH1: 32 bit alignment is faster, because instructions are always
976 fetched as a pair from a longword boundary.
977 SH2 .. SH5 : align to cache line start. */
978 if (align_functions
== 0)
980 = TARGET_SMALLCODE
? FUNCTION_BOUNDARY
/8 : (1 << CACHE_LOG
);
981 /* The linker relaxation code breaks when a function contains
982 alignments that are larger than that at the start of a
987 = align_loops
> align_jumps
? align_loops
: align_jumps
;
989 /* Also take possible .long constants / mova tables int account. */
992 if (align_functions
< min_align
)
993 align_functions
= min_align
;
996 if (sh_fixed_range_str
)
997 sh_fix_range (sh_fixed_range_str
);
999 /* This target defaults to strict volatile bitfields. */
1000 if (flag_strict_volatile_bitfields
< 0)
1001 flag_strict_volatile_bitfields
= 1;
1004 /* Print the operand address in x to the stream. */
1007 sh_print_operand_address (FILE *stream
, rtx x
)
1009 switch (GET_CODE (x
))
1013 fprintf (stream
, "@%s", reg_names
[true_regnum (x
)]);
1018 rtx base
= XEXP (x
, 0);
1019 rtx index
= XEXP (x
, 1);
1021 switch (GET_CODE (index
))
1024 fprintf (stream
, "@(%d,%s)", (int) INTVAL (index
),
1025 reg_names
[true_regnum (base
)]);
1031 int base_num
= true_regnum (base
);
1032 int index_num
= true_regnum (index
);
1034 fprintf (stream
, "@(r0,%s)",
1035 reg_names
[MAX (base_num
, index_num
)]);
1046 fprintf (stream
, "@-%s", reg_names
[true_regnum (XEXP (x
, 0))]);
1050 fprintf (stream
, "@%s+", reg_names
[true_regnum (XEXP (x
, 0))]);
1054 x
= mark_constant_pool_use (x
);
1055 output_addr_const (stream
, x
);
1060 /* Print operand x (an rtx) in assembler syntax to file stream
1061 according to modifier code.
1063 '.' print a .s if insn needs delay slot
1064 ',' print LOCAL_LABEL_PREFIX
1065 '@' print trap, rte or rts depending upon pragma interruptness
1066 '#' output a nop if there is nothing to put in the delay slot
1067 ''' print likelihood suffix (/u for unlikely).
1068 '>' print branch target if -fverbose-asm
1069 'O' print a constant without the #
1070 'R' print the LSW of a dp value - changes if in little endian
1071 'S' print the MSW of a dp value - changes if in little endian
1072 'T' print the next word of a dp value - same as 'R' in big endian mode.
1073 'M' SHMEDIA: print an `x' if `m' will print `base,index'.
1074 otherwise: print .b / .w / .l / .s / .d suffix if operand is a MEM.
1075 'N' print 'r63' if the operand is (const_int 0).
1076 'd' print a V2SF reg as dN instead of fpN.
1077 'm' print a pair `base,offset' or `base,index', for LD and ST.
1078 'U' Likewise for {LD,ST}{HI,LO}.
1079 'V' print the position of a single bit set.
1080 'W' print the position of a single bit cleared.
1081 't' print a memory address which is a register.
1082 'u' prints the lowest 16 bits of CONST_INT, as an unsigned value.
1083 'o' output an operator. */
1086 sh_print_operand (FILE *stream
, rtx x
, int code
)
1089 enum machine_mode mode
;
1097 && ! INSN_ANNULLED_BRANCH_P (XVECEXP (final_sequence
, 0, 0))
1098 && get_attr_length (XVECEXP (final_sequence
, 0, 1)))
1099 fprintf (stream
, ASSEMBLER_DIALECT
? "/s" : ".s");
1102 fprintf (stream
, "%s", LOCAL_LABEL_PREFIX
);
1105 trapa_attr
= lookup_attribute ("trap_exit",
1106 DECL_ATTRIBUTES (current_function_decl
));
1108 fprintf (stream
, "trapa #%ld",
1109 (long) TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (trapa_attr
))));
1110 else if (sh_cfun_interrupt_handler_p ())
1112 if (sh_cfun_resbank_handler_p ())
1113 fprintf (stream
, "resbank\n");
1114 fprintf (stream
, "rte");
1117 fprintf (stream
, "rts");
1120 /* Output a nop if there's nothing in the delay slot. */
1121 if (dbr_sequence_length () == 0)
1122 fprintf (stream
, "\n\tnop");
1126 rtx note
= find_reg_note (current_output_insn
, REG_BR_PROB
, 0);
1128 if (note
&& INTVAL (XEXP (note
, 0)) * 2 < REG_BR_PROB_BASE
)
1129 fputs ("/u", stream
);
1133 if (flag_verbose_asm
&& JUMP_LABEL (current_output_insn
))
1135 fputs ("\t! target: ", stream
);
1136 output_addr_const (stream
, JUMP_LABEL (current_output_insn
));
1140 x
= mark_constant_pool_use (x
);
1141 output_addr_const (stream
, x
);
1143 /* N.B.: %R / %S / %T adjust memory addresses by four.
1144 For SHMEDIA, that means they can be used to access the first and
1145 second 32 bit part of a 64 bit (or larger) value that
1146 might be held in floating point registers or memory.
1147 While they can be used to access 64 bit parts of a larger value
1148 held in general purpose registers, that won't work with memory -
1149 neither for fp registers, since the frxx names are used. */
1151 if (REG_P (x
) || GET_CODE (x
) == SUBREG
)
1153 regno
= true_regnum (x
);
1154 regno
+= FP_REGISTER_P (regno
) ? 1 : LSW
;
1155 fputs (reg_names
[regno
], (stream
));
1159 x
= adjust_address (x
, SImode
, 4 * LSW
);
1160 sh_print_operand_address (stream
, XEXP (x
, 0));
1166 mode
= GET_MODE (x
);
1167 if (mode
== VOIDmode
)
1169 if (GET_MODE_SIZE (mode
) >= 8)
1170 sub
= simplify_subreg (SImode
, x
, mode
, 4 * LSW
);
1172 sh_print_operand (stream
, sub
, 0);
1174 output_operand_lossage ("invalid operand to %%R");
1178 if (REG_P (x
) || GET_CODE (x
) == SUBREG
)
1180 regno
= true_regnum (x
);
1181 regno
+= FP_REGISTER_P (regno
) ? 0 : MSW
;
1182 fputs (reg_names
[regno
], (stream
));
1186 x
= adjust_address (x
, SImode
, 4 * MSW
);
1187 sh_print_operand_address (stream
, XEXP (x
, 0));
1193 mode
= GET_MODE (x
);
1194 if (mode
== VOIDmode
)
1196 if (GET_MODE_SIZE (mode
) >= 8)
1197 sub
= simplify_subreg (SImode
, x
, mode
, 4 * MSW
);
1199 sh_print_operand (stream
, sub
, 0);
1201 output_operand_lossage ("invalid operand to %%S");
1205 /* Next word of a double. */
1206 switch (GET_CODE (x
))
1209 fputs (reg_names
[REGNO (x
) + 1], (stream
));
1212 if (GET_CODE (XEXP (x
, 0)) != PRE_DEC
1213 && GET_CODE (XEXP (x
, 0)) != POST_INC
)
1214 x
= adjust_address (x
, SImode
, 4);
1215 sh_print_operand_address (stream
, XEXP (x
, 0));
1223 gcc_assert (MEM_P (x
));
1225 switch (GET_CODE (x
))
1229 sh_print_operand (stream
, x
, 0);
1237 switch (GET_CODE (x
))
1239 case PLUS
: fputs ("add", stream
); break;
1240 case MINUS
: fputs ("sub", stream
); break;
1241 case MULT
: fputs ("mul", stream
); break;
1242 case DIV
: fputs ("div", stream
); break;
1243 case EQ
: fputs ("eq", stream
); break;
1244 case NE
: fputs ("ne", stream
); break;
1245 case GT
: case LT
: fputs ("gt", stream
); break;
1246 case GE
: case LE
: fputs ("ge", stream
); break;
1247 case GTU
: case LTU
: fputs ("gtu", stream
); break;
1248 case GEU
: case LEU
: fputs ("geu", stream
); break;
1257 && GET_CODE (XEXP (x
, 0)) == PLUS
1258 && (REG_P (XEXP (XEXP (x
, 0), 1))
1259 || GET_CODE (XEXP (XEXP (x
, 0), 1)) == SUBREG
))
1260 fputc ('x', stream
);
1266 switch (GET_MODE (x
))
1268 case QImode
: fputs (".b", stream
); break;
1269 case HImode
: fputs (".w", stream
); break;
1270 case SImode
: fputs (".l", stream
); break;
1271 case SFmode
: fputs (".s", stream
); break;
1272 case DFmode
: fputs (".d", stream
); break;
1273 default: gcc_unreachable ();
1280 gcc_assert (MEM_P (x
));
1284 switch (GET_CODE (x
))
1288 sh_print_operand (stream
, x
, 0);
1289 fputs (", 0", stream
);
1293 sh_print_operand (stream
, XEXP (x
, 0), 0);
1294 fputs (", ", stream
);
1295 sh_print_operand (stream
, XEXP (x
, 1), 0);
1305 int num
= exact_log2 (INTVAL (x
));
1306 gcc_assert (num
>= 0);
1307 fprintf (stream
, "#%d", num
);
1313 int num
= exact_log2 (~INTVAL (x
));
1314 gcc_assert (num
>= 0);
1315 fprintf (stream
, "#%d", num
);
1320 gcc_assert (REG_P (x
) && GET_MODE (x
) == V2SFmode
);
1322 fprintf ((stream
), "d%s", reg_names
[REGNO (x
)] + 1);
1326 if (x
== CONST0_RTX (GET_MODE (x
)))
1328 fprintf ((stream
), "r63");
1331 goto default_output
;
1333 if (CONST_INT_P (x
))
1335 fprintf ((stream
), "%u", (unsigned) INTVAL (x
) & (0x10000 - 1));
1343 mode
= GET_MODE (x
);
1345 switch (GET_CODE (x
))
1349 rtx inner
= XEXP (x
, 0);
1351 enum machine_mode inner_mode
;
1353 /* We might see SUBREGs with vector mode registers inside. */
1354 if (GET_CODE (inner
) == SUBREG
1355 && (GET_MODE_SIZE (GET_MODE (inner
))
1356 == GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
1357 && subreg_lowpart_p (inner
))
1358 inner
= SUBREG_REG (inner
);
1359 if (CONST_INT_P (inner
))
1361 x
= GEN_INT (trunc_int_for_mode (INTVAL (inner
), GET_MODE (x
)));
1362 goto default_output
;
1364 inner_mode
= GET_MODE (inner
);
1365 if (GET_CODE (inner
) == SUBREG
1366 && (GET_MODE_SIZE (GET_MODE (inner
))
1367 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner
))))
1368 && REG_P (SUBREG_REG (inner
)))
1370 offset
= subreg_regno_offset (REGNO (SUBREG_REG (inner
)),
1371 GET_MODE (SUBREG_REG (inner
)),
1372 SUBREG_BYTE (inner
),
1374 inner
= SUBREG_REG (inner
);
1376 if (!REG_P (inner
) || GET_MODE_SIZE (inner_mode
) > 8)
1378 /* Floating point register pairs are always big endian;
1379 general purpose registers are 64 bit wide. */
1380 regno
= REGNO (inner
);
1381 regno
= (HARD_REGNO_NREGS (regno
, inner_mode
)
1382 - HARD_REGNO_NREGS (regno
, mode
))
1390 /* FIXME: We need this on SHmedia32 because reload generates
1391 some sign-extended HI or QI loads into DImode registers
1392 but, because Pmode is SImode, the address ends up with a
1393 subreg:SI of the DImode register. Maybe reload should be
1394 fixed so as to apply alter_subreg to such loads? */
1396 gcc_assert (trapping_target_operand (x
, VOIDmode
));
1397 x
= XEXP (XEXP (x
, 2), 0);
1398 goto default_output
;
1400 gcc_assert (SUBREG_BYTE (x
) == 0
1401 && REG_P (SUBREG_REG (x
)));
1409 if (FP_REGISTER_P (regno
)
1410 && mode
== V16SFmode
)
1411 fprintf ((stream
), "mtrx%s", reg_names
[regno
] + 2);
1412 else if (FP_REGISTER_P (REGNO (x
))
1413 && mode
== V4SFmode
)
1414 fprintf ((stream
), "fv%s", reg_names
[regno
] + 2);
1416 && mode
== V2SFmode
)
1417 fprintf ((stream
), "fp%s", reg_names
[regno
] + 2);
1418 else if (FP_REGISTER_P (REGNO (x
))
1419 && GET_MODE_SIZE (mode
) > 4)
1420 fprintf ((stream
), "d%s", reg_names
[regno
] + 1);
1422 fputs (reg_names
[regno
], (stream
));
1426 output_address (XEXP (x
, 0));
1431 fputc ('#', stream
);
1432 output_addr_const (stream
, x
);
1440 sh_print_operand_punct_valid_p (unsigned char code
)
1442 return (code
== '.' || code
== '#' || code
== '@' || code
== ','
1443 || code
== '$' || code
== '\'' || code
== '>');
1447 /* Encode symbol attributes of a SYMBOL_REF into its
1448 SYMBOL_REF_FLAGS. */
1450 sh_encode_section_info (tree decl
, rtx rtl
, int first
)
1452 default_encode_section_info (decl
, rtl
, first
);
1454 if (TREE_CODE (decl
) == FUNCTION_DECL
1455 && sh2a_function_vector_p (decl
) && TARGET_SH2A
)
1456 SYMBOL_REF_FLAGS (XEXP (rtl
, 0)) |= SYMBOL_FLAG_FUNCVEC_FUNCTION
;
1459 /* Like force_operand, but guarantees that VALUE ends up in TARGET. */
1461 force_into (rtx value
, rtx target
)
1463 value
= force_operand (value
, target
);
1464 if (! rtx_equal_p (value
, target
))
1465 emit_insn (gen_move_insn (target
, value
));
1468 /* Emit code to perform a block move. Choose the best method.
1470 OPERANDS[0] is the destination.
1471 OPERANDS[1] is the source.
1472 OPERANDS[2] is the size.
1473 OPERANDS[3] is the alignment safe to use. */
1476 expand_block_move (rtx
*operands
)
1478 int align
= INTVAL (operands
[3]);
1479 int constp
= (CONST_INT_P (operands
[2]));
1480 int bytes
= (constp
? INTVAL (operands
[2]) : 0);
1485 /* If we could use mov.l to move words and dest is word-aligned, we
1486 can use movua.l for loads and still generate a relatively short
1487 and efficient sequence. */
1488 if (TARGET_SH4A_ARCH
&& align
< 4
1489 && MEM_ALIGN (operands
[0]) >= 32
1490 && can_move_by_pieces (bytes
, 32))
1492 rtx dest
= copy_rtx (operands
[0]);
1493 rtx src
= copy_rtx (operands
[1]);
1494 /* We could use different pseudos for each copied word, but
1495 since movua can only load into r0, it's kind of
1497 rtx temp
= gen_reg_rtx (SImode
);
1498 rtx src_addr
= copy_addr_to_reg (XEXP (src
, 0));
1501 while (copied
+ 4 <= bytes
)
1503 rtx to
= adjust_address (dest
, SImode
, copied
);
1504 rtx from
= adjust_automodify_address (src
, BLKmode
,
1507 set_mem_size (from
, GEN_INT (4));
1508 emit_insn (gen_movua (temp
, from
));
1509 emit_move_insn (src_addr
, plus_constant (src_addr
, 4));
1510 emit_move_insn (to
, temp
);
1515 move_by_pieces (adjust_address (dest
, BLKmode
, copied
),
1516 adjust_automodify_address (src
, BLKmode
,
1518 bytes
- copied
, align
, 0);
1523 /* If it isn't a constant number of bytes, or if it doesn't have 4 byte
1524 alignment, or if it isn't a multiple of 4 bytes, then fail. */
1525 if (align
< 4 || (bytes
% 4 != 0))
1528 if (TARGET_HARD_SH4
)
1532 else if (bytes
== 12)
1534 rtx func_addr_rtx
= gen_reg_rtx (Pmode
);
1535 rtx r4
= gen_rtx_REG (SImode
, 4);
1536 rtx r5
= gen_rtx_REG (SImode
, 5);
1538 function_symbol (func_addr_rtx
, "__movmemSI12_i4", SFUNC_STATIC
);
1539 force_into (XEXP (operands
[0], 0), r4
);
1540 force_into (XEXP (operands
[1], 0), r5
);
1541 emit_insn (gen_block_move_real_i4 (func_addr_rtx
));
1544 else if (! TARGET_SMALLCODE
)
1546 const char *entry_name
;
1547 rtx func_addr_rtx
= gen_reg_rtx (Pmode
);
1549 rtx r4
= gen_rtx_REG (SImode
, 4);
1550 rtx r5
= gen_rtx_REG (SImode
, 5);
1551 rtx r6
= gen_rtx_REG (SImode
, 6);
1553 entry_name
= (bytes
& 4 ? "__movmem_i4_odd" : "__movmem_i4_even");
1554 function_symbol (func_addr_rtx
, entry_name
, SFUNC_STATIC
);
1555 force_into (XEXP (operands
[0], 0), r4
);
1556 force_into (XEXP (operands
[1], 0), r5
);
1558 dwords
= bytes
>> 3;
1559 emit_insn (gen_move_insn (r6
, GEN_INT (dwords
- 1)));
1560 emit_insn (gen_block_lump_real_i4 (func_addr_rtx
));
1569 rtx func_addr_rtx
= gen_reg_rtx (Pmode
);
1570 rtx r4
= gen_rtx_REG (SImode
, 4);
1571 rtx r5
= gen_rtx_REG (SImode
, 5);
1573 sprintf (entry
, "__movmemSI%d", bytes
);
1574 function_symbol (func_addr_rtx
, entry
, SFUNC_STATIC
);
1575 force_into (XEXP (operands
[0], 0), r4
);
1576 force_into (XEXP (operands
[1], 0), r5
);
1577 emit_insn (gen_block_move_real (func_addr_rtx
));
1581 /* This is the same number of bytes as a memcpy call, but to a different
1582 less common function name, so this will occasionally use more space. */
1583 if (! TARGET_SMALLCODE
)
1585 rtx func_addr_rtx
= gen_reg_rtx (Pmode
);
1586 int final_switch
, while_loop
;
1587 rtx r4
= gen_rtx_REG (SImode
, 4);
1588 rtx r5
= gen_rtx_REG (SImode
, 5);
1589 rtx r6
= gen_rtx_REG (SImode
, 6);
1591 function_symbol (func_addr_rtx
, "__movmem", SFUNC_STATIC
);
1592 force_into (XEXP (operands
[0], 0), r4
);
1593 force_into (XEXP (operands
[1], 0), r5
);
1595 /* r6 controls the size of the move. 16 is decremented from it
1596 for each 64 bytes moved. Then the negative bit left over is used
1597 as an index into a list of move instructions. e.g., a 72 byte move
1598 would be set up with size(r6) = 14, for one iteration through the
1599 big while loop, and a switch of -2 for the last part. */
1601 final_switch
= 16 - ((bytes
/ 4) % 16);
1602 while_loop
= ((bytes
/ 4) / 16 - 1) * 16;
1603 emit_insn (gen_move_insn (r6
, GEN_INT (while_loop
+ final_switch
)));
1604 emit_insn (gen_block_lump_real (func_addr_rtx
));
1611 /* Prepare operands for a move define_expand; specifically, one of the
1612 operands must be in a register. */
1615 prepare_move_operands (rtx operands
[], enum machine_mode mode
)
1617 if ((mode
== SImode
|| mode
== DImode
)
1619 && ! ((mode
== Pmode
|| mode
== ptr_mode
)
1620 && tls_symbolic_operand (operands
[1], Pmode
) != TLS_MODEL_NONE
))
1623 if (SYMBOLIC_CONST_P (operands
[1]))
1625 if (MEM_P (operands
[0]))
1626 operands
[1] = force_reg (Pmode
, operands
[1]);
1627 else if (TARGET_SHMEDIA
1628 && GET_CODE (operands
[1]) == LABEL_REF
1629 && target_reg_operand (operands
[0], mode
))
1633 temp
= (!can_create_pseudo_p ()
1635 : gen_reg_rtx (Pmode
));
1636 operands
[1] = legitimize_pic_address (operands
[1], mode
, temp
);
1639 else if (GET_CODE (operands
[1]) == CONST
1640 && GET_CODE (XEXP (operands
[1], 0)) == PLUS
1641 && SYMBOLIC_CONST_P (XEXP (XEXP (operands
[1], 0), 0)))
1643 temp
= !can_create_pseudo_p () ? operands
[0] : gen_reg_rtx (Pmode
);
1644 temp
= legitimize_pic_address (XEXP (XEXP (operands
[1], 0), 0),
1646 operands
[1] = expand_binop (mode
, add_optab
, temp
,
1647 XEXP (XEXP (operands
[1], 0), 1),
1648 (!can_create_pseudo_p ()
1650 : gen_reg_rtx (Pmode
)),
1651 0, OPTAB_LIB_WIDEN
);
1655 if (! reload_in_progress
&& ! reload_completed
)
1657 /* Copy the source to a register if both operands aren't registers. */
1658 if (! register_operand (operands
[0], mode
)
1659 && ! sh_register_operand (operands
[1], mode
))
1660 operands
[1] = copy_to_mode_reg (mode
, operands
[1]);
1662 if (MEM_P (operands
[0]) && ! memory_operand (operands
[0], mode
))
1664 /* This is like change_address_1 (operands[0], mode, 0, 1) ,
1665 except that we can't use that function because it is static. */
1666 rtx new_rtx
= change_address (operands
[0], mode
, 0);
1667 MEM_COPY_ATTRIBUTES (new_rtx
, operands
[0]);
1668 operands
[0] = new_rtx
;
1671 /* This case can happen while generating code to move the result
1672 of a library call to the target. Reject `st r0,@(rX,rY)' because
1673 reload will fail to find a spill register for rX, since r0 is already
1674 being used for the source. */
1676 && refers_to_regno_p (R0_REG
, R0_REG
+ 1, operands
[1], (rtx
*)0)
1677 && MEM_P (operands
[0])
1678 && GET_CODE (XEXP (operands
[0], 0)) == PLUS
1679 && REG_P (XEXP (XEXP (operands
[0], 0), 1)))
1680 operands
[1] = copy_to_mode_reg (mode
, operands
[1]);
1683 if (mode
== Pmode
|| mode
== ptr_mode
)
1686 enum tls_model tls_kind
;
1690 if (GET_CODE (op1
) == CONST
1691 && GET_CODE (XEXP (op1
, 0)) == PLUS
1692 && (tls_symbolic_operand (XEXP (XEXP (op1
, 0), 0), Pmode
)
1695 opc
= XEXP (XEXP (op1
, 0), 1);
1696 op1
= XEXP (XEXP (op1
, 0), 0);
1701 if ((tls_kind
= tls_symbolic_operand (op1
, Pmode
)) != TLS_MODEL_NONE
)
1703 rtx tga_op1
, tga_ret
, tmp
, tmp2
;
1707 case TLS_MODEL_GLOBAL_DYNAMIC
:
1708 tga_ret
= gen_rtx_REG (Pmode
, R0_REG
);
1709 emit_call_insn (gen_tls_global_dynamic (tga_ret
, op1
));
1713 case TLS_MODEL_LOCAL_DYNAMIC
:
1714 tga_ret
= gen_rtx_REG (Pmode
, R0_REG
);
1715 emit_call_insn (gen_tls_local_dynamic (tga_ret
, op1
));
1717 tmp
= gen_reg_rtx (Pmode
);
1718 emit_move_insn (tmp
, tga_ret
);
1720 if (register_operand (op0
, Pmode
))
1723 tmp2
= gen_reg_rtx (Pmode
);
1725 emit_insn (gen_symDTPOFF2reg (tmp2
, op1
, tmp
));
1729 case TLS_MODEL_INITIAL_EXEC
:
1732 /* Don't schedule insns for getting GOT address when
1733 the first scheduling is enabled, to avoid spill
1735 if (flag_schedule_insns
)
1736 emit_insn (gen_blockage ());
1737 emit_insn (gen_GOTaddr2picreg ());
1738 emit_use (gen_rtx_REG (SImode
, PIC_REG
));
1739 if (flag_schedule_insns
)
1740 emit_insn (gen_blockage ());
1742 tga_op1
= !can_create_pseudo_p () ? op0
: gen_reg_rtx (Pmode
);
1743 tmp
= gen_sym2GOTTPOFF (op1
);
1744 emit_insn (gen_tls_initial_exec (tga_op1
, tmp
));
1748 case TLS_MODEL_LOCAL_EXEC
:
1749 tmp2
= gen_reg_rtx (Pmode
);
1750 emit_insn (gen_load_gbr (tmp2
));
1751 tmp
= gen_reg_rtx (Pmode
);
1752 emit_insn (gen_symTPOFF2reg (tmp
, op1
));
1754 if (register_operand (op0
, Pmode
))
1757 op1
= gen_reg_rtx (Pmode
);
1759 emit_insn (gen_addsi3 (op1
, tmp
, tmp2
));
1766 emit_insn (gen_addsi3 (op1
, op1
, force_reg (SImode
, opc
)));
1775 prepare_cbranch_operands (rtx
*operands
, enum machine_mode mode
,
1776 enum rtx_code comparison
)
1779 rtx scratch
= NULL_RTX
;
1781 if (comparison
== LAST_AND_UNUSED_RTX_CODE
)
1782 comparison
= GET_CODE (operands
[0]);
1784 scratch
= operands
[4];
1785 if (CONST_INT_P (operands
[1])
1786 && !CONST_INT_P (operands
[2]))
1788 rtx tmp
= operands
[1];
1790 operands
[1] = operands
[2];
1792 comparison
= swap_condition (comparison
);
1794 if (CONST_INT_P (operands
[2]))
1796 HOST_WIDE_INT val
= INTVAL (operands
[2]);
1797 if ((val
== -1 || val
== -0x81)
1798 && (comparison
== GT
|| comparison
== LE
))
1800 comparison
= (comparison
== GT
) ? GE
: LT
;
1801 operands
[2] = gen_int_mode (val
+ 1, mode
);
1803 else if ((val
== 1 || val
== 0x80)
1804 && (comparison
== GE
|| comparison
== LT
))
1806 comparison
= (comparison
== GE
) ? GT
: LE
;
1807 operands
[2] = gen_int_mode (val
- 1, mode
);
1809 else if (val
== 1 && (comparison
== GEU
|| comparison
== LTU
))
1811 comparison
= (comparison
== GEU
) ? NE
: EQ
;
1812 operands
[2] = CONST0_RTX (mode
);
1814 else if (val
== 0x80 && (comparison
== GEU
|| comparison
== LTU
))
1816 comparison
= (comparison
== GEU
) ? GTU
: LEU
;
1817 operands
[2] = gen_int_mode (val
- 1, mode
);
1819 else if (val
== 0 && (comparison
== GTU
|| comparison
== LEU
))
1820 comparison
= (comparison
== GTU
) ? NE
: EQ
;
1821 else if (mode
== SImode
1822 && ((val
== 0x7fffffff
1823 && (comparison
== GTU
|| comparison
== LEU
))
1824 || ((unsigned HOST_WIDE_INT
) val
1825 == (unsigned HOST_WIDE_INT
) 0x7fffffff + 1
1826 && (comparison
== GEU
|| comparison
== LTU
))))
1828 comparison
= (comparison
== GTU
|| comparison
== GEU
) ? LT
: GE
;
1829 operands
[2] = CONST0_RTX (mode
);
1833 if (can_create_pseudo_p ())
1834 operands
[1] = force_reg (mode
, op1
);
1835 /* When we are handling DImode comparisons, we want to keep constants so
1836 that we can optimize the component comparisons; however, memory loads
1837 are better issued as a whole so that they can be scheduled well.
1838 SImode equality comparisons allow I08 constants, but only when they
1839 compare r0. Hence, if operands[1] has to be loaded from somewhere else
1840 into a register, that register might as well be r0, and we allow the
1841 constant. If it is already in a register, this is likely to be
1842 allocated to a different hard register, thus we load the constant into
1843 a register unless it is zero. */
1844 if (!REG_P (operands
[2])
1845 && (!CONST_INT_P (operands
[2])
1846 || (mode
== SImode
&& operands
[2] != CONST0_RTX (SImode
)
1847 && ((comparison
!= EQ
&& comparison
!= NE
)
1848 || (REG_P (op1
) && REGNO (op1
) != R0_REG
)
1849 || !satisfies_constraint_I08 (operands
[2])))))
1851 if (scratch
&& GET_MODE (scratch
) == mode
)
1853 emit_move_insn (scratch
, operands
[2]);
1854 operands
[2] = scratch
;
1856 else if (can_create_pseudo_p ())
1857 operands
[2] = force_reg (mode
, operands
[2]);
1863 expand_cbranchsi4 (rtx
*operands
, enum rtx_code comparison
, int probability
)
1865 rtx (*branch_expander
) (rtx
) = gen_branch_true
;
1868 comparison
= prepare_cbranch_operands (operands
, SImode
, comparison
);
1871 case NE
: case LT
: case LE
: case LTU
: case LEU
:
1872 comparison
= reverse_condition (comparison
);
1873 branch_expander
= gen_branch_false
;
1876 emit_insn (gen_rtx_SET (VOIDmode
, gen_rtx_REG (SImode
, T_REG
),
1877 gen_rtx_fmt_ee (comparison
, SImode
,
1878 operands
[1], operands
[2])));
1879 jump
= emit_jump_insn (branch_expander (operands
[3]));
1880 if (probability
>= 0)
1881 add_reg_note (jump
, REG_BR_PROB
, GEN_INT (probability
));
1885 /* ??? How should we distribute probabilities when more than one branch
1886 is generated. So far we only have soem ad-hoc observations:
1887 - If the operands are random, they are likely to differ in both parts.
1888 - If comparing items in a hash chain, the operands are random or equal;
1889 operation should be EQ or NE.
1890 - If items are searched in an ordered tree from the root, we can expect
1891 the highpart to be unequal about half of the time; operation should be
1892 an inequality comparison, operands non-constant, and overall probability
1893 about 50%. Likewise for quicksort.
1894 - Range checks will be often made against constants. Even if we assume for
1895 simplicity an even distribution of the non-constant operand over a
1896 sub-range here, the same probability could be generated with differently
1897 wide sub-ranges - as long as the ratio of the part of the subrange that
1898 is before the threshold to the part that comes after the threshold stays
1899 the same. Thus, we can't really tell anything here;
1900 assuming random distribution is at least simple.
1904 expand_cbranchdi4 (rtx
*operands
, enum rtx_code comparison
)
1906 enum rtx_code msw_taken
, msw_skip
, lsw_taken
;
1907 rtx skip_label
= NULL_RTX
;
1908 rtx op1h
, op1l
, op2h
, op2l
;
1911 int msw_taken_prob
= -1, msw_skip_prob
= -1, lsw_taken_prob
= -1;
1912 rtx scratch
= operands
[4];
1914 comparison
= prepare_cbranch_operands (operands
, DImode
, comparison
);
1915 op1h
= gen_highpart_mode (SImode
, DImode
, operands
[1]);
1916 op2h
= gen_highpart_mode (SImode
, DImode
, operands
[2]);
1917 op1l
= gen_lowpart (SImode
, operands
[1]);
1918 op2l
= gen_lowpart (SImode
, operands
[2]);
1919 msw_taken
= msw_skip
= lsw_taken
= LAST_AND_UNUSED_RTX_CODE
;
1920 prob
= split_branch_probability
;
1921 rev_prob
= REG_BR_PROB_BASE
- prob
;
1924 /* ??? Should we use the cmpeqdi_t pattern for equality comparisons?
1925 That costs 1 cycle more when the first branch can be predicted taken,
1926 but saves us mispredicts because only one branch needs prediction.
1927 It also enables generating the cmpeqdi_t-1 pattern. */
1929 if (TARGET_CMPEQDI_T
)
1931 emit_insn (gen_cmpeqdi_t (operands
[1], operands
[2]));
1932 emit_jump_insn (gen_branch_true (operands
[3]));
1939 /* If we had more precision, we'd use rev_prob - (rev_prob >> 32) .
1941 msw_skip_prob
= rev_prob
;
1942 if (REG_BR_PROB_BASE
<= 65535)
1943 lsw_taken_prob
= prob
? REG_BR_PROB_BASE
: 0;
1946 gcc_assert (HOST_BITS_PER_WIDEST_INT
>= 64);
1950 - ((HOST_WIDEST_INT
) REG_BR_PROB_BASE
* rev_prob
1951 / ((HOST_WIDEST_INT
) prob
<< 32)))
1957 if (TARGET_CMPEQDI_T
)
1959 emit_insn (gen_cmpeqdi_t (operands
[1], operands
[2]));
1960 emit_jump_insn (gen_branch_false (operands
[3]));
1964 msw_taken_prob
= prob
;
1969 msw_taken
= comparison
;
1970 if (CONST_INT_P (op2l
) && INTVAL (op2l
) == -1)
1972 if (comparison
!= GTU
|| op2h
!= CONST0_RTX (SImode
))
1973 msw_skip
= swap_condition (msw_taken
);
1977 if (op2l
== CONST0_RTX (SImode
))
1978 msw_taken
= comparison
;
1981 msw_taken
= comparison
== GE
? GT
: GTU
;
1982 msw_skip
= swap_condition (msw_taken
);
1987 msw_taken
= comparison
;
1988 if (op2l
== CONST0_RTX (SImode
))
1990 msw_skip
= swap_condition (msw_taken
);
1994 if (CONST_INT_P (op2l
) && INTVAL (op2l
) == -1)
1995 msw_taken
= comparison
;
1999 if (comparison
== LE
)
2001 else if (op2h
!= CONST0_RTX (SImode
))
2005 msw_skip
= swap_condition (msw_taken
);
2008 default: return false;
2010 num_branches
= ((msw_taken
!= LAST_AND_UNUSED_RTX_CODE
)
2011 + (msw_skip
!= LAST_AND_UNUSED_RTX_CODE
)
2012 + (lsw_taken
!= LAST_AND_UNUSED_RTX_CODE
));
2013 if (comparison
!= EQ
&& comparison
!= NE
&& num_branches
> 1)
2015 if (!CONSTANT_P (operands
[2])
2016 && prob
>= (int) (REG_BR_PROB_BASE
* 3 / 8U)
2017 && prob
<= (int) (REG_BR_PROB_BASE
* 5 / 8U))
2019 msw_taken_prob
= prob
/ 2U;
2021 = REG_BR_PROB_BASE
* rev_prob
/ (REG_BR_PROB_BASE
+ rev_prob
);
2022 lsw_taken_prob
= prob
;
2026 msw_taken_prob
= prob
;
2027 msw_skip_prob
= REG_BR_PROB_BASE
;
2028 /* ??? If we have a constant op2h, should we use that when
2029 calculating lsw_taken_prob? */
2030 lsw_taken_prob
= prob
;
2035 operands
[4] = NULL_RTX
;
2036 if (reload_completed
2037 && ! arith_reg_or_0_operand (op2h
, SImode
)
2038 && (true_regnum (op1h
) || (comparison
!= EQ
&& comparison
!= NE
))
2039 && (msw_taken
!= LAST_AND_UNUSED_RTX_CODE
2040 || msw_skip
!= LAST_AND_UNUSED_RTX_CODE
))
2042 emit_move_insn (scratch
, operands
[2]);
2043 operands
[2] = scratch
;
2045 if (msw_taken
!= LAST_AND_UNUSED_RTX_CODE
)
2046 expand_cbranchsi4 (operands
, msw_taken
, msw_taken_prob
);
2047 if (msw_skip
!= LAST_AND_UNUSED_RTX_CODE
)
2049 rtx taken_label
= operands
[3];
2051 /* Operands were possibly modified, but msw_skip doesn't expect this.
2052 Always use the original ones. */
2053 if (msw_taken
!= LAST_AND_UNUSED_RTX_CODE
)
2059 operands
[3] = skip_label
= gen_label_rtx ();
2060 expand_cbranchsi4 (operands
, msw_skip
, msw_skip_prob
);
2061 operands
[3] = taken_label
;
2065 if (lsw_taken
!= LAST_AND_UNUSED_RTX_CODE
)
2067 if (reload_completed
2068 && ! arith_reg_or_0_operand (op2l
, SImode
)
2069 && (true_regnum (op1l
) || (lsw_taken
!= EQ
&& lsw_taken
!= NE
)))
2071 emit_move_insn (scratch
, operands
[2]);
2072 operands
[2] = scratch
;
2074 expand_cbranchsi4 (operands
, lsw_taken
, lsw_taken_prob
);
2076 if (msw_skip
!= LAST_AND_UNUSED_RTX_CODE
)
2077 emit_label (skip_label
);
2081 /* Emit INSN, possibly in a PARALLEL with an USE of fpscr for SH4. */
2084 sh_emit_set_t_insn (rtx insn
, enum machine_mode mode
)
2086 if ((TARGET_SH4
|| TARGET_SH2A
) && GET_MODE_CLASS (mode
) == MODE_FLOAT
)
2088 insn
= gen_rtx_PARALLEL (VOIDmode
,
2090 gen_rtx_USE (VOIDmode
, get_fpscr_rtx ())));
2091 (mode
== SFmode
? emit_sf_insn
: emit_df_insn
) (insn
);
2097 /* Prepare the operands for an scc instruction; make sure that the
2098 compare has been done and the result is in T_REG. */
2100 sh_emit_scc_to_t (enum rtx_code code
, rtx op0
, rtx op1
)
2102 rtx t_reg
= gen_rtx_REG (SImode
, T_REG
);
2103 enum rtx_code oldcode
= code
;
2104 enum machine_mode mode
;
2106 /* First need a compare insn. */
2110 /* It isn't possible to handle this case. */
2127 if (code
!= oldcode
)
2134 mode
= GET_MODE (op0
);
2135 if (mode
== VOIDmode
)
2136 mode
= GET_MODE (op1
);
2138 op0
= force_reg (mode
, op0
);
2139 if ((code
!= EQ
&& code
!= NE
2140 && (op1
!= const0_rtx
2141 || code
== GTU
|| code
== GEU
|| code
== LTU
|| code
== LEU
))
2142 || (mode
== DImode
&& op1
!= const0_rtx
)
2143 || (TARGET_SH2E
&& GET_MODE_CLASS (mode
) == MODE_FLOAT
))
2144 op1
= force_reg (mode
, op1
);
2146 sh_emit_set_t_insn (gen_rtx_SET (VOIDmode
, t_reg
,
2147 gen_rtx_fmt_ee (code
, SImode
, op0
, op1
)),
2152 sh_emit_cheap_store_flag (enum machine_mode mode
, enum rtx_code code
,
2155 rtx target
= gen_reg_rtx (SImode
);
2158 gcc_assert (TARGET_SHMEDIA
);
2167 tmp
= gen_rtx_fmt_ee (code
, SImode
, op0
, op1
);
2168 emit_insn (gen_cstore4_media (target
, tmp
, op0
, op1
));
2178 tmp
= gen_rtx_fmt_ee (reverse_condition (code
), mode
, op0
, op1
);
2179 emit_insn (gen_cstore4_media (target
, tmp
, op0
, op1
));
2197 rtx t2
= gen_reg_rtx (DImode
);
2198 emit_insn (gen_extendsidi2 (t2
, target
));
2202 return gen_rtx_fmt_ee (code
, VOIDmode
, target
, const0_rtx
);
2205 /* Called from the md file, set up the operands of a compare instruction. */
2208 sh_emit_compare_and_branch (rtx
*operands
, enum machine_mode mode
)
2210 enum rtx_code code
= GET_CODE (operands
[0]);
2211 enum rtx_code branch_code
;
2212 rtx op0
= operands
[1];
2213 rtx op1
= operands
[2];
2215 bool need_ccmpeq
= false;
2217 if (TARGET_SH2E
&& GET_MODE_CLASS (mode
) == MODE_FLOAT
)
2219 op0
= force_reg (mode
, op0
);
2220 op1
= force_reg (mode
, op1
);
2224 if (code
!= EQ
|| mode
== DImode
)
2226 /* Force args into regs, since we can't use constants here. */
2227 op0
= force_reg (mode
, op0
);
2228 if (op1
!= const0_rtx
|| code
== GTU
|| code
== GEU
)
2229 op1
= force_reg (mode
, op1
);
2233 if (GET_MODE_CLASS (mode
) == MODE_FLOAT
)
2236 || (code
== LE
&& TARGET_IEEE
&& TARGET_SH2E
)
2237 || (code
== GE
&& !(TARGET_IEEE
&& TARGET_SH2E
)))
2239 tem
= op0
, op0
= op1
, op1
= tem
;
2240 code
= swap_condition (code
);
2243 /* GE becomes fcmp/gt+fcmp/eq, for SH2E and TARGET_IEEE only. */
2246 gcc_assert (TARGET_IEEE
&& TARGET_SH2E
);
2251 /* Now we can have EQ, NE, GT, LE. NE and LE are then transformed
2252 to EQ/GT respectively. */
2253 gcc_assert (code
== EQ
|| code
== GT
|| code
== NE
|| code
== LE
);
2270 branch_code
= reverse_condition (code
);
2276 insn
= gen_rtx_SET (VOIDmode
,
2277 gen_rtx_REG (SImode
, T_REG
),
2278 gen_rtx_fmt_ee (branch_code
, SImode
, op0
, op1
));
2280 sh_emit_set_t_insn (insn
, mode
);
2282 sh_emit_set_t_insn (gen_ieee_ccmpeqsf_t (op0
, op1
), mode
);
2284 if (branch_code
== code
)
2285 emit_jump_insn (gen_branch_true (operands
[3]));
2287 emit_jump_insn (gen_branch_false (operands
[3]));
2291 sh_emit_compare_and_set (rtx
*operands
, enum machine_mode mode
)
2293 enum rtx_code code
= GET_CODE (operands
[1]);
2294 rtx op0
= operands
[2];
2295 rtx op1
= operands
[3];
2297 bool invert
= false;
2300 op0
= force_reg (mode
, op0
);
2301 if ((code
!= EQ
&& code
!= NE
2302 && (op1
!= const0_rtx
2303 || code
== GTU
|| code
== GEU
|| code
== LTU
|| code
== LEU
))
2304 || (mode
== DImode
&& op1
!= const0_rtx
)
2305 || (TARGET_SH2E
&& GET_MODE_CLASS (mode
) == MODE_FLOAT
))
2306 op1
= force_reg (mode
, op1
);
2308 if (GET_MODE_CLASS (mode
) == MODE_FLOAT
)
2310 if (code
== LT
|| code
== LE
)
2312 code
= swap_condition (code
);
2313 tem
= op0
, op0
= op1
, op1
= tem
;
2319 lab
= gen_label_rtx ();
2320 sh_emit_scc_to_t (EQ
, op0
, op1
);
2321 emit_jump_insn (gen_branch_true (lab
));
2338 sh_emit_scc_to_t (code
, op0
, op1
);
2342 emit_insn (gen_movnegt (operands
[0]));
2344 emit_move_insn (operands
[0], gen_rtx_REG (SImode
, T_REG
));
2347 /* Functions to output assembly code. */
2349 /* Return a sequence of instructions to perform DI or DF move.
2351 Since the SH cannot move a DI or DF in one instruction, we have
2352 to take care when we see overlapping source and dest registers. */
2355 output_movedouble (rtx insn ATTRIBUTE_UNUSED
, rtx operands
[],
2356 enum machine_mode mode
)
2358 rtx dst
= operands
[0];
2359 rtx src
= operands
[1];
2362 && GET_CODE (XEXP (dst
, 0)) == PRE_DEC
)
2363 return "mov.l %T1,%0\n\tmov.l %1,%0";
2365 if (register_operand (dst
, mode
)
2366 && register_operand (src
, mode
))
2368 if (REGNO (src
) == MACH_REG
)
2369 return "sts mach,%S0\n\tsts macl,%R0";
2371 /* When mov.d r1,r2 do r2->r3 then r1->r2;
2372 when mov.d r1,r0 do r1->r0 then r2->r1. */
2374 if (REGNO (src
) + 1 == REGNO (dst
))
2375 return "mov %T1,%T0\n\tmov %1,%0";
2377 return "mov %1,%0\n\tmov %T1,%T0";
2379 else if (CONST_INT_P (src
))
2381 if (INTVAL (src
) < 0)
2382 output_asm_insn ("mov #-1,%S0", operands
);
2384 output_asm_insn ("mov #0,%S0", operands
);
2386 return "mov %1,%R0";
2388 else if (MEM_P (src
))
2391 int dreg
= REGNO (dst
);
2392 rtx inside
= XEXP (src
, 0);
2394 switch (GET_CODE (inside
))
2397 ptrreg
= REGNO (inside
);
2401 ptrreg
= subreg_regno (inside
);
2405 ptrreg
= REGNO (XEXP (inside
, 0));
2406 /* ??? A r0+REG address shouldn't be possible here, because it isn't
2407 an offsettable address. Unfortunately, offsettable addresses use
2408 QImode to check the offset, and a QImode offsettable address
2409 requires r0 for the other operand, which is not currently
2410 supported, so we can't use the 'o' constraint.
2411 Thus we must check for and handle r0+REG addresses here.
2412 We punt for now, since this is likely very rare. */
2413 gcc_assert (!REG_P (XEXP (inside
, 1)));
2417 return "mov.l %1,%0\n\tmov.l %1+4,%T0";
2419 return "mov.l %1,%0\n\tmov.l %1,%T0";
2424 /* Work out the safe way to copy. Copy into the second half first. */
2426 return "mov.l %T1,%T0\n\tmov.l %1,%0";
2429 return "mov.l %1,%0\n\tmov.l %T1,%T0";
2432 /* Print an instruction which would have gone into a delay slot after
2433 another instruction, but couldn't because the other instruction expanded
2434 into a sequence where putting the slot insn at the end wouldn't work. */
2437 print_slot (rtx insn
)
2439 final_scan_insn (XVECEXP (insn
, 0, 1), asm_out_file
, optimize
, 1, NULL
);
2441 INSN_DELETED_P (XVECEXP (insn
, 0, 1)) = 1;
2445 output_far_jump (rtx insn
, rtx op
)
2447 struct { rtx lab
, reg
, op
; } this_jmp
;
2448 rtx braf_base_lab
= NULL_RTX
;
2451 int offset
= branch_dest (insn
) - INSN_ADDRESSES (INSN_UID (insn
));
2454 this_jmp
.lab
= gen_label_rtx ();
2458 && offset
- get_attr_length (insn
) <= 32766)
2461 jump
= "mov.w %O0,%1; braf %1";
2469 jump
= "mov.l %O0,%1; braf %1";
2471 jump
= "mov.l r0,@-r15; mova %O0,r0; mov.l @r0,%1; add r0,%1; mov.l @r15+,r0; jmp @%1";
2474 jump
= "mov.l %O0,%1; jmp @%1";
2476 /* If we have a scratch register available, use it. */
2477 if (NONJUMP_INSN_P ((prev
= prev_nonnote_insn (insn
)))
2478 && INSN_CODE (prev
) == CODE_FOR_indirect_jump_scratch
)
2480 this_jmp
.reg
= SET_DEST (XVECEXP (PATTERN (prev
), 0, 0));
2481 if (REGNO (this_jmp
.reg
) == R0_REG
&& flag_pic
&& ! TARGET_SH2
)
2482 jump
= "mov.l r1,@-r15; mova %O0,r0; mov.l @r0,r1; add r1,r0; mov.l @r15+,r1; jmp @%1";
2483 output_asm_insn (jump
, &this_jmp
.lab
);
2484 if (dbr_sequence_length ())
2485 print_slot (final_sequence
);
2487 output_asm_insn ("nop", 0);
2491 /* Output the delay slot insn first if any. */
2492 if (dbr_sequence_length ())
2493 print_slot (final_sequence
);
2495 this_jmp
.reg
= gen_rtx_REG (SImode
, 13);
2496 /* We must keep the stack aligned to 8-byte boundaries on SH5.
2497 Fortunately, MACL is fixed and call-clobbered, and we never
2498 need its value across jumps, so save r13 in it instead of in
2501 output_asm_insn ("lds r13, macl", 0);
2503 output_asm_insn ("mov.l r13,@-r15", 0);
2504 output_asm_insn (jump
, &this_jmp
.lab
);
2506 output_asm_insn ("sts macl, r13", 0);
2508 output_asm_insn ("mov.l @r15+,r13", 0);
2510 if (far
&& flag_pic
&& TARGET_SH2
)
2512 braf_base_lab
= gen_label_rtx ();
2513 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L",
2514 CODE_LABEL_NUMBER (braf_base_lab
));
2517 output_asm_insn (".align 2", 0);
2518 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L", CODE_LABEL_NUMBER (this_jmp
.lab
));
2520 if (far
&& flag_pic
)
2523 this_jmp
.lab
= braf_base_lab
;
2524 output_asm_insn (".long %O2-%O0", &this_jmp
.lab
);
2527 output_asm_insn (far
? ".long %O2" : ".word %O2-%O0", &this_jmp
.lab
);
2531 /* Local label counter, used for constants in the pool and inside
2532 pattern branches. */
2534 static int lf
= 100;
2536 /* Output code for ordinary branches. */
2539 output_branch (int logic
, rtx insn
, rtx
*operands
)
2541 switch (get_attr_length (insn
))
2544 /* This can happen if filling the delay slot has caused a forward
2545 branch to exceed its range (we could reverse it, but only
2546 when we know we won't overextend other branches; this should
2547 best be handled by relaxation).
2548 It can also happen when other condbranches hoist delay slot insn
2549 from their destination, thus leading to code size increase.
2550 But the branch will still be in the range -4092..+4098 bytes. */
2555 /* The call to print_slot will clobber the operands. */
2556 rtx op0
= operands
[0];
2558 /* If the instruction in the delay slot is annulled (true), then
2559 there is no delay slot where we can put it now. The only safe
2560 place for it is after the label. final will do that by default. */
2563 && ! INSN_ANNULLED_BRANCH_P (XVECEXP (final_sequence
, 0, 0))
2564 && get_attr_length (XVECEXP (final_sequence
, 0, 1)))
2566 asm_fprintf (asm_out_file
, "\tb%s%ss\t%LLF%d\n", logic
? "f" : "t",
2567 ASSEMBLER_DIALECT
? "/" : ".", label
);
2568 print_slot (final_sequence
);
2571 asm_fprintf (asm_out_file
, "\tb%s\t%LLF%d\n", logic
? "f" : "t", label
);
2573 output_asm_insn ("bra\t%l0", &op0
);
2574 fprintf (asm_out_file
, "\tnop\n");
2575 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "LF", label
);
2579 /* When relaxing, handle this like a short branch. The linker
2580 will fix it up if it still doesn't fit after relaxation. */
2582 return logic
? "bt%.\t%l0" : "bf%.\t%l0";
2584 /* These are for SH2e, in which we have to account for the
2585 extra nop because of the hardware bug in annulled branches. */
2591 gcc_assert (!final_sequence
2592 || !(INSN_ANNULLED_BRANCH_P
2593 (XVECEXP (final_sequence
, 0, 0))));
2594 asm_fprintf (asm_out_file
, "b%s%ss\t%LLF%d\n",
2596 ASSEMBLER_DIALECT
? "/" : ".", label
);
2597 fprintf (asm_out_file
, "\tnop\n");
2598 output_asm_insn ("bra\t%l0", operands
);
2599 fprintf (asm_out_file
, "\tnop\n");
2600 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "LF", label
);
2604 /* When relaxing, fall through. */
2609 sprintf (buffer
, "b%s%ss\t%%l0",
2611 ASSEMBLER_DIALECT
? "/" : ".");
2612 output_asm_insn (buffer
, &operands
[0]);
2617 /* There should be no longer branches now - that would
2618 indicate that something has destroyed the branches set
2619 up in machine_dependent_reorg. */
2624 /* Output a code sequence for INSN using TEMPL with OPERANDS; but before,
2625 fill in operands 9 as a label to the successor insn.
2626 We try to use jump threading where possible.
2627 IF CODE matches the comparison in the IF_THEN_ELSE of a following jump,
2628 we assume the jump is taken. I.e. EQ means follow jmp and bf, NE means
2629 follow jmp and bt, if the address is in range. */
2631 output_branchy_insn (enum rtx_code code
, const char *templ
,
2632 rtx insn
, rtx
*operands
)
2634 rtx next_insn
= NEXT_INSN (insn
);
2636 if (next_insn
&& JUMP_P (next_insn
) && condjump_p (next_insn
))
2638 rtx src
= SET_SRC (PATTERN (next_insn
));
2639 if (GET_CODE (src
) == IF_THEN_ELSE
&& GET_CODE (XEXP (src
, 0)) != code
)
2641 /* Following branch not taken */
2642 operands
[9] = gen_label_rtx ();
2643 emit_label_after (operands
[9], next_insn
);
2644 INSN_ADDRESSES_NEW (operands
[9],
2645 INSN_ADDRESSES (INSN_UID (next_insn
))
2646 + get_attr_length (next_insn
));
2651 int offset
= (branch_dest (next_insn
)
2652 - INSN_ADDRESSES (INSN_UID (next_insn
)) + 4);
2653 if (offset
>= -252 && offset
<= 258)
2655 if (GET_CODE (src
) == IF_THEN_ELSE
)
2657 src
= XEXP (src
, 1);
2663 operands
[9] = gen_label_rtx ();
2664 emit_label_after (operands
[9], insn
);
2665 INSN_ADDRESSES_NEW (operands
[9],
2666 INSN_ADDRESSES (INSN_UID (insn
))
2667 + get_attr_length (insn
));
2672 output_ieee_ccmpeq (rtx insn
, rtx
*operands
)
2674 return output_branchy_insn (NE
, "bt\t%l9\n\tfcmp/eq\t%1,%0",
2678 /* Output the start of the assembler file. */
2681 sh_file_start (void)
2683 default_file_start ();
2686 /* Declare the .directive section before it is used. */
2687 fputs ("\t.section .directive, \"SM\", @progbits, 1\n", asm_out_file
);
2688 fputs ("\t.asciz \"#<SYMEDIT>#\\n\"\n", asm_out_file
);
2692 /* We need to show the text section with the proper
2693 attributes as in TEXT_SECTION_ASM_OP, before dwarf2out
2694 emits it without attributes in TEXT_SECTION_ASM_OP, else GAS
2695 will complain. We can teach GAS specifically about the
2696 default attributes for our choice of text section, but
2697 then we would have to change GAS again if/when we change
2698 the text section name. */
2699 fprintf (asm_out_file
, "%s\n", TEXT_SECTION_ASM_OP
);
2701 /* Switch to the data section so that the coffsem symbol
2702 isn't in the text section. */
2703 switch_to_section (data_section
);
2705 if (TARGET_LITTLE_ENDIAN
)
2706 fputs ("\t.little\n", asm_out_file
);
2710 if (TARGET_SHCOMPACT
)
2711 fputs ("\t.mode\tSHcompact\n", asm_out_file
);
2712 else if (TARGET_SHMEDIA
)
2713 fprintf (asm_out_file
, "\t.mode\tSHmedia\n\t.abi\t%i\n",
2714 TARGET_SHMEDIA64
? 64 : 32);
2718 /* Check if PAT includes UNSPEC_CALLER unspec pattern. */
2721 unspec_caller_rtx_p (rtx pat
)
2726 split_const (pat
, &base
, &offset
);
2727 if (GET_CODE (base
) == UNSPEC
)
2729 if (XINT (base
, 1) == UNSPEC_CALLER
)
2731 for (i
= 0; i
< XVECLEN (base
, 0); i
++)
2732 if (unspec_caller_rtx_p (XVECEXP (base
, 0, i
)))
2738 /* Indicate that INSN cannot be duplicated. This is true for insn
2739 that generates a unique label. */
2742 sh_cannot_copy_insn_p (rtx insn
)
2746 if (!reload_completed
|| !flag_pic
)
2749 if (!NONJUMP_INSN_P (insn
))
2751 if (asm_noperands (insn
) >= 0)
2754 pat
= PATTERN (insn
);
2755 if (GET_CODE (pat
) != SET
)
2757 pat
= SET_SRC (pat
);
2759 if (unspec_caller_rtx_p (pat
))
2765 /* Actual number of instructions used to make a shift by N. */
2766 static const char ashiftrt_insns
[] =
2767 { 0,1,2,3,4,5,8,8,8,8,8,8,8,8,8,8,2,3,4,5,8,8,8,8,8,8,8,8,8,8,8,2};
2769 /* Left shift and logical right shift are the same. */
2770 static const char shift_insns
[] =
2771 { 0,1,1,2,2,3,3,4,1,2,2,3,3,4,3,3,1,2,2,3,3,4,3,3,2,3,3,4,4,4,3,3};
2773 /* Individual shift amounts needed to get the above length sequences.
2774 One bit right shifts clobber the T bit, so when possible, put one bit
2775 shifts in the middle of the sequence, so the ends are eligible for
2776 branch delay slots. */
2777 static const short shift_amounts
[32][5] = {
2778 {0}, {1}, {2}, {2, 1},
2779 {2, 2}, {2, 1, 2}, {2, 2, 2}, {2, 2, 1, 2},
2780 {8}, {8, 1}, {8, 2}, {8, 1, 2},
2781 {8, 2, 2}, {8, 2, 1, 2}, {8, -2, 8}, {8, -1, 8},
2782 {16}, {16, 1}, {16, 2}, {16, 1, 2},
2783 {16, 2, 2}, {16, 2, 1, 2}, {16, -2, 8}, {16, -1, 8},
2784 {16, 8}, {16, 1, 8}, {16, 8, 2}, {16, 8, 1, 2},
2785 {16, 8, 2, 2}, {16, -1, -2, 16}, {16, -2, 16}, {16, -1, 16}};
2787 /* Likewise, but for shift amounts < 16, up to three highmost bits
2788 might be clobbered. This is typically used when combined with some
2789 kind of sign or zero extension. */
2791 static const char ext_shift_insns
[] =
2792 { 0,1,1,2,2,3,2,2,1,2,2,3,3,3,2,2,1,2,2,3,3,4,3,3,2,3,3,4,4,4,3,3};
2794 static const short ext_shift_amounts
[32][4] = {
2795 {0}, {1}, {2}, {2, 1},
2796 {2, 2}, {2, 1, 2}, {8, -2}, {8, -1},
2797 {8}, {8, 1}, {8, 2}, {8, 1, 2},
2798 {8, 2, 2}, {16, -2, -1}, {16, -2}, {16, -1},
2799 {16}, {16, 1}, {16, 2}, {16, 1, 2},
2800 {16, 2, 2}, {16, 2, 1, 2}, {16, -2, 8}, {16, -1, 8},
2801 {16, 8}, {16, 1, 8}, {16, 8, 2}, {16, 8, 1, 2},
2802 {16, 8, 2, 2}, {16, -1, -2, 16}, {16, -2, 16}, {16, -1, 16}};
2804 /* Assuming we have a value that has been sign-extended by at least one bit,
2805 can we use the ext_shift_amounts with the last shift turned to an arithmetic shift
2806 to shift it by N without data loss, and quicker than by other means? */
2807 #define EXT_SHIFT_SIGNED(n) (((n) | 8) == 15)
2809 /* This is used in length attributes in sh.md to help compute the length
2810 of arbitrary constant shift instructions. */
2813 shift_insns_rtx (rtx insn
)
2815 rtx set_src
= SET_SRC (XVECEXP (PATTERN (insn
), 0, 0));
2816 int shift_count
= INTVAL (XEXP (set_src
, 1)) & 31;
2817 enum rtx_code shift_code
= GET_CODE (set_src
);
2822 return ashiftrt_insns
[shift_count
];
2825 return shift_insns
[shift_count
];
2831 /* Return the cost of a shift. */
2841 if (GET_MODE_SIZE (GET_MODE (x
)) > UNITS_PER_WORD
)
2843 if (GET_MODE (x
) == DImode
2844 && CONST_INT_P (XEXP (x
, 1))
2845 && INTVAL (XEXP (x
, 1)) == 1)
2848 /* Everything else is invalid, because there is no pattern for it. */
2851 /* If shift by a non constant, then this will be expensive. */
2852 if (!CONST_INT_P (XEXP (x
, 1)))
2853 return SH_DYNAMIC_SHIFT_COST
;
2855 /* Otherwise, return the true cost in instructions. Cope with out of range
2856 shift counts more or less arbitrarily. */
2857 value
= INTVAL (XEXP (x
, 1)) & 31;
2859 if (GET_CODE (x
) == ASHIFTRT
)
2861 int cost
= ashiftrt_insns
[value
];
2862 /* If SH3, then we put the constant in a reg and use shad. */
2863 if (cost
> 1 + SH_DYNAMIC_SHIFT_COST
)
2864 cost
= 1 + SH_DYNAMIC_SHIFT_COST
;
2868 return shift_insns
[value
];
2871 /* Return the cost of an AND operation. */
2878 /* Anding with a register is a single cycle and instruction. */
2879 if (!CONST_INT_P (XEXP (x
, 1)))
2882 i
= INTVAL (XEXP (x
, 1));
2886 if (satisfies_constraint_I10 (XEXP (x
, 1))
2887 || satisfies_constraint_J16 (XEXP (x
, 1)))
2890 return 1 + rtx_cost (XEXP (x
, 1), AND
, !optimize_size
);
2893 /* These constants are single cycle extu.[bw] instructions. */
2894 if (i
== 0xff || i
== 0xffff)
2896 /* Constants that can be used in an and immediate instruction in a single
2897 cycle, but this requires r0, so make it a little more expensive. */
2898 if (CONST_OK_FOR_K08 (i
))
2900 /* Constants that can be loaded with a mov immediate and an and.
2901 This case is probably unnecessary. */
2902 if (CONST_OK_FOR_I08 (i
))
2904 /* Any other constants requires a 2 cycle pc-relative load plus an and.
2905 This case is probably unnecessary. */
2909 /* Return the cost of an addition or a subtraction. */
2914 /* Adding a register is a single cycle insn. */
2915 if (REG_P (XEXP (x
, 1))
2916 || GET_CODE (XEXP (x
, 1)) == SUBREG
)
2919 /* Likewise for small constants. */
2920 if (CONST_INT_P (XEXP (x
, 1))
2921 && CONST_OK_FOR_ADD (INTVAL (XEXP (x
, 1))))
2925 switch (GET_CODE (XEXP (x
, 1)))
2930 return TARGET_SHMEDIA64
? 5 : 3;
2933 if (CONST_OK_FOR_I16 (INTVAL (XEXP (x
, 1))))
2935 else if (CONST_OK_FOR_I16 (INTVAL (XEXP (x
, 1)) >> 16))
2937 else if (CONST_OK_FOR_I16 ((INTVAL (XEXP (x
, 1)) >> 16) >> 16))
2945 /* Any other constant requires a 2 cycle pc-relative load plus an
2950 /* Return the cost of a multiply. */
2952 multcosts (rtx x ATTRIBUTE_UNUSED
)
2954 if (sh_multcost
>= 0)
2957 /* ??? We have a mul insn, but it has a latency of three, and doesn't
2958 accept constants. Ideally, we would use a cost of one or two and
2959 add the cost of the operand, but disregard the latter when inside loops
2960 and loop invariant code motion is still to follow.
2961 Using a multiply first and splitting it later if it's a loss
2962 doesn't work because of different sign / zero extension semantics
2963 of multiplies vs. shifts. */
2964 return TARGET_SMALLCODE
? 2 : 3;
2968 /* We have a mul insn, so we can never take more than the mul and the
2969 read of the mac reg, but count more because of the latency and extra
2971 if (TARGET_SMALLCODE
)
2976 /* If we're aiming at small code, then just count the number of
2977 insns in a multiply call sequence. */
2978 if (TARGET_SMALLCODE
)
2981 /* Otherwise count all the insns in the routine we'd be calling too. */
2985 /* Compute a (partial) cost for rtx X. Return true if the complete
2986 cost has been computed, and false if subexpressions should be
2987 scanned. In either case, *TOTAL contains the cost result. */
2990 sh_rtx_costs (rtx x
, int code
, int outer_code
, int *total
,
2991 bool speed ATTRIBUTE_UNUSED
)
2998 if (INTVAL (x
) == 0)
3000 else if (outer_code
== AND
&& and_operand ((x
), DImode
))
3002 else if ((outer_code
== IOR
|| outer_code
== XOR
3003 || outer_code
== PLUS
)
3004 && CONST_OK_FOR_I10 (INTVAL (x
)))
3006 else if (CONST_OK_FOR_I16 (INTVAL (x
)))
3007 *total
= COSTS_N_INSNS (outer_code
!= SET
);
3008 else if (CONST_OK_FOR_I16 (INTVAL (x
) >> 16))
3009 *total
= COSTS_N_INSNS ((outer_code
!= SET
) + 1);
3010 else if (CONST_OK_FOR_I16 ((INTVAL (x
) >> 16) >> 16))
3011 *total
= COSTS_N_INSNS ((outer_code
!= SET
) + 2);
3013 *total
= COSTS_N_INSNS ((outer_code
!= SET
) + 3);
3016 if (CONST_OK_FOR_I08 (INTVAL (x
)))
3018 else if ((outer_code
== AND
|| outer_code
== IOR
|| outer_code
== XOR
)
3019 && CONST_OK_FOR_K08 (INTVAL (x
)))
3021 /* prepare_cmp_insn will force costly constants int registers before
3022 the cbranch[sd]i4 patterns can see them, so preserve potentially
3023 interesting ones not covered by I08 above. */
3024 else if (outer_code
== COMPARE
3025 && ((unsigned HOST_WIDE_INT
) INTVAL (x
)
3026 == (unsigned HOST_WIDE_INT
) 0x7fffffff + 1
3027 || INTVAL (x
) == 0x7fffffff
3028 || INTVAL (x
) == 0x80 || INTVAL (x
) == -0x81))
3037 if (TARGET_SHMEDIA64
)
3038 *total
= COSTS_N_INSNS (4);
3039 else if (TARGET_SHMEDIA32
)
3040 *total
= COSTS_N_INSNS (2);
3047 *total
= COSTS_N_INSNS (4);
3048 /* prepare_cmp_insn will force costly constants int registers before
3049 the cbranchdi4 pattern can see them, so preserve potentially
3050 interesting ones. */
3051 else if (outer_code
== COMPARE
&& GET_MODE (x
) == DImode
)
3057 if (x
== CONST0_RTX (GET_MODE (x
)))
3059 else if (sh_1el_vec (x
, VOIDmode
))
3060 *total
= outer_code
!= SET
;
3061 if (sh_rep_vec (x
, VOIDmode
))
3062 *total
= ((GET_MODE_UNIT_SIZE (GET_MODE (x
)) + 3) / 4
3063 + (outer_code
!= SET
));
3064 *total
= COSTS_N_INSNS (3) + (outer_code
!= SET
);
3069 *total
= COSTS_N_INSNS (addsubcosts (x
));
3073 *total
= COSTS_N_INSNS (andcosts (x
));
3077 *total
= COSTS_N_INSNS (multcosts (x
));
3083 *total
= COSTS_N_INSNS (shiftcosts (x
));
3090 *total
= COSTS_N_INSNS (20);
3094 if (sh_1el_vec (x
, VOIDmode
))
3095 *total
= outer_code
!= SET
;
3096 if (sh_rep_vec (x
, VOIDmode
))
3097 *total
= ((GET_MODE_UNIT_SIZE (GET_MODE (x
)) + 3) / 4
3098 + (outer_code
!= SET
));
3099 *total
= COSTS_N_INSNS (3) + (outer_code
!= SET
);
3112 /* Compute the cost of an address. For the SH, all valid addresses are
3113 the same cost. Use a slightly higher cost for reg + reg addressing,
3114 since it increases pressure on r0. */
3117 sh_address_cost (rtx X
,
3118 bool speed ATTRIBUTE_UNUSED
)
3120 return (GET_CODE (X
) == PLUS
3121 && ! CONSTANT_P (XEXP (X
, 1))
3122 && ! TARGET_SHMEDIA
? 1 : 0);
3125 /* Code to expand a shift. */
3128 gen_ashift (int type
, int n
, rtx reg
)
3130 /* Negative values here come from the shift_amounts array. */
3143 emit_insn (gen_ashrsi3_k (reg
, reg
, GEN_INT (n
)));
3147 emit_insn (gen_lshrsi3_m (reg
, reg
, GEN_INT (n
)));
3149 emit_insn (gen_lshrsi3_k (reg
, reg
, GEN_INT (n
)));
3152 emit_insn (gen_ashlsi3_std (reg
, reg
, GEN_INT (n
)));
3157 /* Same for HImode */
3160 gen_ashift_hi (int type
, int n
, rtx reg
)
3162 /* Negative values here come from the shift_amounts array. */
3176 /* We don't have HImode right shift operations because using the
3177 ordinary 32 bit shift instructions for that doesn't generate proper
3178 zero/sign extension.
3179 gen_ashift_hi is only called in contexts where we know that the
3180 sign extension works out correctly. */
3183 if (GET_CODE (reg
) == SUBREG
)
3185 offset
= SUBREG_BYTE (reg
);
3186 reg
= SUBREG_REG (reg
);
3188 gen_ashift (type
, n
, gen_rtx_SUBREG (SImode
, reg
, offset
));
3192 emit_insn (gen_ashlhi3_k (reg
, reg
, GEN_INT (n
)));
3197 /* Output RTL to split a constant shift into its component SH constant
3198 shift instructions. */
3201 gen_shifty_op (int code
, rtx
*operands
)
3203 int value
= INTVAL (operands
[2]);
3206 /* Truncate the shift count in case it is out of bounds. */
3211 if (code
== LSHIFTRT
)
3213 emit_insn (gen_rotlsi3_1 (operands
[0], operands
[0]));
3214 emit_insn (gen_movt (operands
[0]));
3217 else if (code
== ASHIFT
)
3219 /* There is a two instruction sequence for 31 bit left shifts,
3220 but it requires r0. */
3221 if (REG_P (operands
[0]) && REGNO (operands
[0]) == 0)
3223 emit_insn (gen_andsi3 (operands
[0], operands
[0], const1_rtx
));
3224 emit_insn (gen_rotlsi3_31 (operands
[0], operands
[0]));
3229 else if (value
== 0)
3231 /* This can happen even when optimizing, if there were subregs before
3232 reload. Don't output a nop here, as this is never optimized away;
3233 use a no-op move instead. */
3234 emit_insn (gen_rtx_SET (VOIDmode
, operands
[0], operands
[0]));
3238 max
= shift_insns
[value
];
3239 for (i
= 0; i
< max
; i
++)
3240 gen_ashift (code
, shift_amounts
[value
][i
], operands
[0]);
3243 /* Same as above, but optimized for values where the topmost bits don't
3247 gen_shifty_hi_op (int code
, rtx
*operands
)
3249 int value
= INTVAL (operands
[2]);
3251 void (*gen_fun
) (int, int, rtx
);
3253 /* This operation is used by and_shl for SImode values with a few
3254 high bits known to be cleared. */
3258 emit_insn (gen_nop ());
3262 gen_fun
= GET_MODE (operands
[0]) == HImode
? gen_ashift_hi
: gen_ashift
;
3265 max
= ext_shift_insns
[value
];
3266 for (i
= 0; i
< max
; i
++)
3267 gen_fun (code
, ext_shift_amounts
[value
][i
], operands
[0]);
3270 /* When shifting right, emit the shifts in reverse order, so that
3271 solitary negative values come first. */
3272 for (i
= ext_shift_insns
[value
] - 1; i
>= 0; i
--)
3273 gen_fun (code
, ext_shift_amounts
[value
][i
], operands
[0]);
3276 /* Output RTL for an arithmetic right shift. */
3278 /* ??? Rewrite to use super-optimizer sequences. */
3281 expand_ashiftrt (rtx
*operands
)
3289 if (!CONST_INT_P (operands
[2]))
3291 rtx count
= copy_to_mode_reg (SImode
, operands
[2]);
3292 emit_insn (gen_negsi2 (count
, count
));
3293 emit_insn (gen_ashrsi3_d (operands
[0], operands
[1], count
));
3296 else if (ashiftrt_insns
[INTVAL (operands
[2]) & 31]
3297 > 1 + SH_DYNAMIC_SHIFT_COST
)
3300 = force_reg (SImode
, GEN_INT (- (INTVAL (operands
[2]) & 31)));
3301 emit_insn (gen_ashrsi3_d (operands
[0], operands
[1], count
));
3305 if (!CONST_INT_P (operands
[2]))
3308 value
= INTVAL (operands
[2]) & 31;
3312 /* If we are called from abs expansion, arrange things so that we
3313 we can use a single MT instruction that doesn't clobber the source,
3314 if LICM can hoist out the load of the constant zero. */
3315 if (currently_expanding_to_rtl
)
3317 emit_insn (gen_cmpgtsi_t (force_reg (SImode
, CONST0_RTX (SImode
)),
3319 emit_insn (gen_mov_neg_si_t (operands
[0]));
3322 emit_insn (gen_ashrsi2_31 (operands
[0], operands
[1]));
3325 else if (value
>= 16 && value
<= 19)
3327 wrk
= gen_reg_rtx (SImode
);
3328 emit_insn (gen_ashrsi2_16 (wrk
, operands
[1]));
3331 gen_ashift (ASHIFTRT
, 1, wrk
);
3332 emit_move_insn (operands
[0], wrk
);
3335 /* Expand a short sequence inline, longer call a magic routine. */
3336 else if (value
<= 5)
3338 wrk
= gen_reg_rtx (SImode
);
3339 emit_move_insn (wrk
, operands
[1]);
3341 gen_ashift (ASHIFTRT
, 1, wrk
);
3342 emit_move_insn (operands
[0], wrk
);
3346 wrk
= gen_reg_rtx (Pmode
);
3348 /* Load the value into an arg reg and call a helper. */
3349 emit_move_insn (gen_rtx_REG (SImode
, 4), operands
[1]);
3350 sprintf (func
, "__ashiftrt_r4_%d", value
);
3351 function_symbol (wrk
, func
, SFUNC_STATIC
);
3352 emit_insn (gen_ashrsi3_n (GEN_INT (value
), wrk
));
3353 emit_move_insn (operands
[0], gen_rtx_REG (SImode
, 4));
3358 sh_dynamicalize_shift_p (rtx count
)
3360 return shift_insns
[INTVAL (count
) & 31] > 1 + SH_DYNAMIC_SHIFT_COST
;
3363 /* Try to find a good way to implement the combiner pattern
3364 [(set (match_operand:SI 0 "register_operand" "r")
3365 (and:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
3366 (match_operand:SI 2 "const_int_operand" "n"))
3367 (match_operand:SI 3 "const_int_operand" "n"))) .
3368 LEFT_RTX is operand 2 in the above pattern, and MASK_RTX is operand 3.
3369 return 0 for simple right / left or left/right shift combination.
3370 return 1 for a combination of shifts with zero_extend.
3371 return 2 for a combination of shifts with an AND that needs r0.
3372 return 3 for a combination of shifts with an AND that needs an extra
3373 scratch register, when the three highmost bits of the AND mask are clear.
3374 return 4 for a combination of shifts with an AND that needs an extra
3375 scratch register, when any of the three highmost bits of the AND mask
3377 If ATTRP is set, store an initial right shift width in ATTRP[0],
3378 and the instruction length in ATTRP[1] . These values are not valid
3380 When ATTRP is set and returning 1, ATTRP[2] gets set to the index into
3381 shift_amounts for the last shift value that is to be used before the
3384 shl_and_kind (rtx left_rtx
, rtx mask_rtx
, int *attrp
)
3386 unsigned HOST_WIDE_INT mask
, lsb
, mask2
, lsb2
;
3387 int left
= INTVAL (left_rtx
), right
;
3389 int cost
, best_cost
= 10000;
3390 int best_right
= 0, best_len
= 0;
3394 if (left
< 0 || left
> 31)
3396 if (CONST_INT_P (mask_rtx
))
3397 mask
= (unsigned HOST_WIDE_INT
) INTVAL (mask_rtx
) >> left
;
3399 mask
= (unsigned HOST_WIDE_INT
) GET_MODE_MASK (SImode
) >> left
;
3400 /* Can this be expressed as a right shift / left shift pair? */
3401 lsb
= ((mask
^ (mask
- 1)) >> 1) + 1;
3402 right
= exact_log2 (lsb
);
3403 mask2
= ~(mask
+ lsb
- 1);
3404 lsb2
= ((mask2
^ (mask2
- 1)) >> 1) + 1;
3405 /* mask has no zeroes but trailing zeroes <==> ! mask2 */
3407 best_cost
= shift_insns
[right
] + shift_insns
[right
+ left
];
3408 /* mask has no trailing zeroes <==> ! right */
3409 else if (! right
&& mask2
== ~(lsb2
- 1))
3411 int late_right
= exact_log2 (lsb2
);
3412 best_cost
= shift_insns
[left
+ late_right
] + shift_insns
[late_right
];
3414 /* Try to use zero extend. */
3415 if (mask2
== ~(lsb2
- 1))
3419 for (width
= 8; width
<= 16; width
+= 8)
3421 /* Can we zero-extend right away? */
3422 if (lsb2
== (unsigned HOST_WIDE_INT
) 1 << width
)
3425 = 1 + ext_shift_insns
[right
] + ext_shift_insns
[left
+ right
];
3426 if (cost
< best_cost
)
3437 /* ??? Could try to put zero extend into initial right shift,
3438 or even shift a bit left before the right shift. */
3439 /* Determine value of first part of left shift, to get to the
3440 zero extend cut-off point. */
3441 first
= width
- exact_log2 (lsb2
) + right
;
3442 if (first
>= 0 && right
+ left
- first
>= 0)
3444 cost
= ext_shift_insns
[right
] + ext_shift_insns
[first
] + 1
3445 + ext_shift_insns
[right
+ left
- first
];
3446 if (cost
< best_cost
)
3458 /* Try to use r0 AND pattern */
3459 for (i
= 0; i
<= 2; i
++)
3463 if (! CONST_OK_FOR_K08 (mask
>> i
))
3465 cost
= (i
!= 0) + 2 + ext_shift_insns
[left
+ i
];
3466 if (cost
< best_cost
)
3471 best_len
= cost
- 1;
3474 /* Try to use a scratch register to hold the AND operand. */
3475 can_ext
= ((mask
<< left
) & ((unsigned HOST_WIDE_INT
) 3 << 30)) == 0;
3476 for (i
= 0; i
<= 2; i
++)
3480 cost
= (i
!= 0) + (CONST_OK_FOR_I08 (mask
>> i
) ? 2 : 3)
3481 + (can_ext
? ext_shift_insns
: shift_insns
)[left
+ i
];
3482 if (cost
< best_cost
)
3487 best_len
= cost
- 1 - ! CONST_OK_FOR_I08 (mask
>> i
);
3493 attrp
[0] = best_right
;
3494 attrp
[1] = best_len
;
3499 /* This is used in length attributes of the unnamed instructions
3500 corresponding to shl_and_kind return values of 1 and 2. */
3502 shl_and_length (rtx insn
)
3504 rtx set_src
, left_rtx
, mask_rtx
;
3507 set_src
= SET_SRC (XVECEXP (PATTERN (insn
), 0, 0));
3508 left_rtx
= XEXP (XEXP (set_src
, 0), 1);
3509 mask_rtx
= XEXP (set_src
, 1);
3510 shl_and_kind (left_rtx
, mask_rtx
, attributes
);
3511 return attributes
[1];
3514 /* This is used in length attribute of the and_shl_scratch instruction. */
3517 shl_and_scr_length (rtx insn
)
3519 rtx set_src
= SET_SRC (XVECEXP (PATTERN (insn
), 0, 0));
3520 int len
= shift_insns
[INTVAL (XEXP (set_src
, 1)) & 31];
3521 rtx op
= XEXP (set_src
, 0);
3522 len
+= shift_insns
[INTVAL (XEXP (op
, 1)) & 31] + 1;
3523 op
= XEXP (XEXP (op
, 0), 0);
3524 return len
+ shift_insns
[INTVAL (XEXP (op
, 1)) & 31];
3527 /* Generate rtl for instructions for which shl_and_kind advised a particular
3528 method of generating them, i.e. returned zero. */
3531 gen_shl_and (rtx dest
, rtx left_rtx
, rtx mask_rtx
, rtx source
)
3534 unsigned HOST_WIDE_INT mask
;
3535 int kind
= shl_and_kind (left_rtx
, mask_rtx
, attributes
);
3536 int right
, total_shift
;
3537 void (*shift_gen_fun
) (int, rtx
*) = gen_shifty_hi_op
;
3539 right
= attributes
[0];
3540 total_shift
= INTVAL (left_rtx
) + right
;
3541 mask
= (unsigned HOST_WIDE_INT
) INTVAL (mask_rtx
) >> total_shift
;
3548 int first
= attributes
[2];
3553 emit_insn ((mask
<< right
) <= 0xff
3554 ? gen_zero_extendqisi2 (dest
,
3555 gen_lowpart (QImode
, source
))
3556 : gen_zero_extendhisi2 (dest
,
3557 gen_lowpart (HImode
, source
)));
3561 emit_insn (gen_movsi (dest
, source
));
3565 operands
[2] = GEN_INT (right
);
3566 gen_shifty_hi_op (LSHIFTRT
, operands
);
3570 operands
[2] = GEN_INT (first
);
3571 gen_shifty_hi_op (ASHIFT
, operands
);
3572 total_shift
-= first
;
3576 emit_insn (mask
<= 0xff
3577 ? gen_zero_extendqisi2 (dest
, gen_lowpart (QImode
, dest
))
3578 : gen_zero_extendhisi2 (dest
, gen_lowpart (HImode
, dest
)));
3579 if (total_shift
> 0)
3581 operands
[2] = GEN_INT (total_shift
);
3582 gen_shifty_hi_op (ASHIFT
, operands
);
3587 shift_gen_fun
= gen_shifty_op
;
3589 /* If the topmost bit that matters is set, set the topmost bits
3590 that don't matter. This way, we might be able to get a shorter
3592 if (mask
& ((HOST_WIDE_INT
) 1 << (31 - total_shift
)))
3593 mask
|= (HOST_WIDE_INT
) ~0 << (31 - total_shift
);
3595 /* Don't expand fine-grained when combining, because that will
3596 make the pattern fail. */
3597 if (currently_expanding_to_rtl
3598 || reload_in_progress
|| reload_completed
)
3602 /* Cases 3 and 4 should be handled by this split
3603 only while combining */
3604 gcc_assert (kind
<= 2);
3607 emit_insn (gen_lshrsi3 (dest
, source
, GEN_INT (right
)));
3610 emit_insn (gen_andsi3 (dest
, source
, GEN_INT (mask
)));
3615 operands
[2] = GEN_INT (total_shift
);
3616 shift_gen_fun (ASHIFT
, operands
);
3623 if (kind
!= 4 && total_shift
< 16)
3625 neg
= -ext_shift_amounts
[total_shift
][1];
3627 neg
-= ext_shift_amounts
[total_shift
][2];
3631 emit_insn (gen_and_shl_scratch (dest
, source
,
3634 GEN_INT (total_shift
+ neg
),
3636 emit_insn (gen_movsi (dest
, dest
));
3643 /* Try to find a good way to implement the combiner pattern
3644 [(set (match_operand:SI 0 "register_operand" "=r")
3645 (sign_extract:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
3646 (match_operand:SI 2 "const_int_operand" "n")
3647 (match_operand:SI 3 "const_int_operand" "n")
3649 (clobber (reg:SI T_REG))]
3650 LEFT_RTX is operand 2 in the above pattern, and SIZE_RTX is operand 3.
3651 return 0 for simple left / right shift combination.
3652 return 1 for left shift / 8 bit sign extend / left shift.
3653 return 2 for left shift / 16 bit sign extend / left shift.
3654 return 3 for left shift / 8 bit sign extend / shift / sign extend.
3655 return 4 for left shift / 16 bit sign extend / shift / sign extend.
3656 return 5 for left shift / 16 bit sign extend / right shift
3657 return 6 for < 8 bit sign extend / left shift.
3658 return 7 for < 8 bit sign extend / left shift / single right shift.
3659 If COSTP is nonzero, assign the calculated cost to *COSTP. */
3662 shl_sext_kind (rtx left_rtx
, rtx size_rtx
, int *costp
)
3664 int left
, size
, insize
, ext
;
3665 int cost
= 0, best_cost
;
3668 left
= INTVAL (left_rtx
);
3669 size
= INTVAL (size_rtx
);
3670 insize
= size
- left
;
3671 gcc_assert (insize
> 0);
3672 /* Default to left / right shift. */
3674 best_cost
= shift_insns
[32 - insize
] + ashiftrt_insns
[32 - size
];
3677 /* 16 bit shift / sign extend / 16 bit shift */
3678 cost
= shift_insns
[16 - insize
] + 1 + ashiftrt_insns
[16 - size
];
3679 /* If ashiftrt_insns[16 - size] is 8, this choice will be overridden
3680 below, by alternative 3 or something even better. */
3681 if (cost
< best_cost
)
3687 /* Try a plain sign extend between two shifts. */
3688 for (ext
= 16; ext
>= insize
; ext
-= 8)
3692 cost
= ext_shift_insns
[ext
- insize
] + 1 + shift_insns
[size
- ext
];
3693 if (cost
< best_cost
)
3695 kind
= ext
/ (unsigned) 8;
3699 /* Check if we can do a sloppy shift with a final signed shift
3700 restoring the sign. */
3701 if (EXT_SHIFT_SIGNED (size
- ext
))
3702 cost
= ext_shift_insns
[ext
- insize
] + ext_shift_insns
[size
- ext
] + 1;
3703 /* If not, maybe it's still cheaper to do the second shift sloppy,
3704 and do a final sign extend? */
3705 else if (size
<= 16)
3706 cost
= ext_shift_insns
[ext
- insize
] + 1
3707 + ext_shift_insns
[size
> ext
? size
- ext
: ext
- size
] + 1;
3710 if (cost
< best_cost
)
3712 kind
= ext
/ (unsigned) 8 + 2;
3716 /* Check if we can sign extend in r0 */
3719 cost
= 3 + shift_insns
[left
];
3720 if (cost
< best_cost
)
3725 /* Try the same with a final signed shift. */
3728 cost
= 3 + ext_shift_insns
[left
+ 1] + 1;
3729 if (cost
< best_cost
)
3738 /* Try to use a dynamic shift. */
3739 cost
= shift_insns
[32 - insize
] + 1 + SH_DYNAMIC_SHIFT_COST
;
3740 if (cost
< best_cost
)
3751 /* Function to be used in the length attribute of the instructions
3752 implementing this pattern. */
3755 shl_sext_length (rtx insn
)
3757 rtx set_src
, left_rtx
, size_rtx
;
3760 set_src
= SET_SRC (XVECEXP (PATTERN (insn
), 0, 0));
3761 left_rtx
= XEXP (XEXP (set_src
, 0), 1);
3762 size_rtx
= XEXP (set_src
, 1);
3763 shl_sext_kind (left_rtx
, size_rtx
, &cost
);
3767 /* Generate rtl for this pattern */
3770 gen_shl_sext (rtx dest
, rtx left_rtx
, rtx size_rtx
, rtx source
)
3773 int left
, size
, insize
, cost
;
3776 kind
= shl_sext_kind (left_rtx
, size_rtx
, &cost
);
3777 left
= INTVAL (left_rtx
);
3778 size
= INTVAL (size_rtx
);
3779 insize
= size
- left
;
3787 int ext
= kind
& 1 ? 8 : 16;
3788 int shift2
= size
- ext
;
3790 /* Don't expand fine-grained when combining, because that will
3791 make the pattern fail. */
3792 if (! currently_expanding_to_rtl
3793 && ! reload_in_progress
&& ! reload_completed
)
3795 emit_insn (gen_shl_sext_ext (dest
, source
, left_rtx
, size_rtx
));
3796 emit_insn (gen_movsi (dest
, source
));
3800 emit_insn (gen_movsi (dest
, source
));
3804 operands
[2] = GEN_INT (ext
- insize
);
3805 gen_shifty_hi_op (ASHIFT
, operands
);
3808 ? gen_extendqisi2 (dest
, gen_lowpart (QImode
, dest
))
3809 : gen_extendhisi2 (dest
, gen_lowpart (HImode
, dest
)));
3814 operands
[2] = GEN_INT (shift2
);
3815 gen_shifty_op (ASHIFT
, operands
);
3822 if (EXT_SHIFT_SIGNED (shift2
))
3824 operands
[2] = GEN_INT (shift2
+ 1);
3825 gen_shifty_op (ASHIFT
, operands
);
3826 operands
[2] = const1_rtx
;
3827 gen_shifty_op (ASHIFTRT
, operands
);
3830 operands
[2] = GEN_INT (shift2
);
3831 gen_shifty_hi_op (ASHIFT
, operands
);
3835 operands
[2] = GEN_INT (-shift2
);
3836 gen_shifty_hi_op (LSHIFTRT
, operands
);
3838 emit_insn (size
<= 8
3839 ? gen_extendqisi2 (dest
, gen_lowpart (QImode
, dest
))
3840 : gen_extendhisi2 (dest
, gen_lowpart (HImode
, dest
)));
3847 if (! currently_expanding_to_rtl
3848 && ! reload_in_progress
&& ! reload_completed
)
3849 emit_insn (gen_shl_sext_ext (dest
, source
, left_rtx
, size_rtx
));
3853 operands
[2] = GEN_INT (16 - insize
);
3854 gen_shifty_hi_op (ASHIFT
, operands
);
3855 emit_insn (gen_extendhisi2 (dest
, gen_lowpart (HImode
, dest
)));
3857 /* Don't use gen_ashrsi3 because it generates new pseudos. */
3859 gen_ashift (ASHIFTRT
, 1, dest
);
3864 /* Don't expand fine-grained when combining, because that will
3865 make the pattern fail. */
3866 if (! currently_expanding_to_rtl
3867 && ! reload_in_progress
&& ! reload_completed
)
3869 emit_insn (gen_shl_sext_ext (dest
, source
, left_rtx
, size_rtx
));
3870 emit_insn (gen_movsi (dest
, source
));
3873 emit_insn (gen_andsi3 (dest
, source
, GEN_INT ((1 << insize
) - 1)));
3874 emit_insn (gen_xorsi3 (dest
, dest
, GEN_INT (1 << (insize
- 1))));
3875 emit_insn (gen_addsi3 (dest
, dest
, GEN_INT (-1 << (insize
- 1))));
3877 operands
[2] = kind
== 7 ? GEN_INT (left
+ 1) : left_rtx
;
3878 gen_shifty_op (ASHIFT
, operands
);
3880 emit_insn (gen_ashrsi3_k (dest
, dest
, const1_rtx
));
3888 /* Prefix a symbol_ref name with "datalabel". */
3891 gen_datalabel_ref (rtx sym
)
3895 if (GET_CODE (sym
) == LABEL_REF
)
3896 return gen_rtx_CONST (GET_MODE (sym
),
3897 gen_rtx_UNSPEC (GET_MODE (sym
),
3901 gcc_assert (GET_CODE (sym
) == SYMBOL_REF
);
3903 str
= XSTR (sym
, 0);
3904 /* Share all SYMBOL_REF strings with the same value - that is important
3906 str
= IDENTIFIER_POINTER (get_identifier (str
));
3907 XSTR (sym
, 0) = str
;
3913 static alloc_pool label_ref_list_pool
;
3915 typedef struct label_ref_list_d
3918 struct label_ref_list_d
*next
;
3919 } *label_ref_list_t
;
3921 /* The SH cannot load a large constant into a register, constants have to
3922 come from a pc relative load. The reference of a pc relative load
3923 instruction must be less than 1k in front of the instruction. This
3924 means that we often have to dump a constant inside a function, and
3925 generate code to branch around it.
3927 It is important to minimize this, since the branches will slow things
3928 down and make things bigger.
3930 Worst case code looks like:
3948 We fix this by performing a scan before scheduling, which notices which
3949 instructions need to have their operands fetched from the constant table
3950 and builds the table.
3954 scan, find an instruction which needs a pcrel move. Look forward, find the
3955 last barrier which is within MAX_COUNT bytes of the requirement.
3956 If there isn't one, make one. Process all the instructions between
3957 the find and the barrier.
3959 In the above example, we can tell that L3 is within 1k of L1, so
3960 the first move can be shrunk from the 3 insn+constant sequence into
3961 just 1 insn, and the constant moved to L3 to make:
3972 Then the second move becomes the target for the shortening process. */
3976 rtx value
; /* Value in table. */
3977 rtx label
; /* Label of value. */
3978 label_ref_list_t wend
; /* End of window. */
3979 enum machine_mode mode
; /* Mode of value. */
3981 /* True if this constant is accessed as part of a post-increment
3982 sequence. Note that HImode constants are never accessed in this way. */
3983 bool part_of_sequence_p
;
3986 /* The maximum number of constants that can fit into one pool, since
3987 constants in the range 0..510 are at least 2 bytes long, and in the
3988 range from there to 1018 at least 4 bytes. */
3990 #define MAX_POOL_SIZE 372
3991 static pool_node pool_vector
[MAX_POOL_SIZE
];
3992 static int pool_size
;
3993 static rtx pool_window_label
;
3994 static int pool_window_last
;
3996 static int max_labelno_before_reorg
;
3998 /* ??? If we need a constant in HImode which is the truncated value of a
3999 constant we need in SImode, we could combine the two entries thus saving
4000 two bytes. Is this common enough to be worth the effort of implementing
4003 /* ??? This stuff should be done at the same time that we shorten branches.
4004 As it is now, we must assume that all branches are the maximum size, and
4005 this causes us to almost always output constant pools sooner than
4008 /* Add a constant to the pool and return its label. */
4011 add_constant (rtx x
, enum machine_mode mode
, rtx last_value
)
4015 label_ref_list_t ref
, newref
;
4017 /* First see if we've already got it. */
4018 for (i
= 0; i
< pool_size
; i
++)
4020 if (x
->code
== pool_vector
[i
].value
->code
4021 && mode
== pool_vector
[i
].mode
)
4023 if (x
->code
== CODE_LABEL
)
4025 if (XINT (x
, 3) != XINT (pool_vector
[i
].value
, 3))
4028 if (rtx_equal_p (x
, pool_vector
[i
].value
))
4033 || ! rtx_equal_p (last_value
, pool_vector
[i
-1].value
))
4035 new_rtx
= gen_label_rtx ();
4036 LABEL_REFS (new_rtx
) = pool_vector
[i
].label
;
4037 pool_vector
[i
].label
= lab
= new_rtx
;
4039 if (lab
&& pool_window_label
)
4041 newref
= (label_ref_list_t
) pool_alloc (label_ref_list_pool
);
4042 newref
->label
= pool_window_label
;
4043 ref
= pool_vector
[pool_window_last
].wend
;
4045 pool_vector
[pool_window_last
].wend
= newref
;
4048 pool_window_label
= new_rtx
;
4049 pool_window_last
= i
;
4055 /* Need a new one. */
4056 pool_vector
[pool_size
].value
= x
;
4057 if (last_value
&& rtx_equal_p (last_value
, pool_vector
[pool_size
- 1].value
))
4060 pool_vector
[pool_size
- 1].part_of_sequence_p
= true;
4063 lab
= gen_label_rtx ();
4064 pool_vector
[pool_size
].mode
= mode
;
4065 pool_vector
[pool_size
].label
= lab
;
4066 pool_vector
[pool_size
].wend
= NULL
;
4067 pool_vector
[pool_size
].part_of_sequence_p
= (lab
== 0);
4068 if (lab
&& pool_window_label
)
4070 newref
= (label_ref_list_t
) pool_alloc (label_ref_list_pool
);
4071 newref
->label
= pool_window_label
;
4072 ref
= pool_vector
[pool_window_last
].wend
;
4074 pool_vector
[pool_window_last
].wend
= newref
;
4077 pool_window_label
= lab
;
4078 pool_window_last
= pool_size
;
4083 /* Output the literal table. START, if nonzero, is the first instruction
4084 this table is needed for, and also indicates that there is at least one
4085 casesi_worker_2 instruction; We have to emit the operand3 labels from
4086 these insns at a 4-byte aligned position. BARRIER is the barrier
4087 after which we are to place the table. */
4090 dump_table (rtx start
, rtx barrier
)
4096 label_ref_list_t ref
;
4099 /* Do two passes, first time dump out the HI sized constants. */
4101 for (i
= 0; i
< pool_size
; i
++)
4103 pool_node
*p
= &pool_vector
[i
];
4105 if (p
->mode
== HImode
)
4109 scan
= emit_insn_after (gen_align_2 (), scan
);
4112 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4113 scan
= emit_label_after (lab
, scan
);
4114 scan
= emit_insn_after (gen_consttable_2 (p
->value
, const0_rtx
),
4116 for (ref
= p
->wend
; ref
; ref
= ref
->next
)
4119 scan
= emit_insn_after (gen_consttable_window_end (lab
), scan
);
4122 else if (p
->mode
== DFmode
)
4130 scan
= emit_insn_after (gen_align_4 (), scan
);
4132 for (; start
!= barrier
; start
= NEXT_INSN (start
))
4133 if (NONJUMP_INSN_P (start
)
4134 && recog_memoized (start
) == CODE_FOR_casesi_worker_2
)
4136 rtx src
= SET_SRC (XVECEXP (PATTERN (start
), 0, 0));
4137 rtx lab
= XEXP (XVECEXP (src
, 0, 3), 0);
4139 scan
= emit_label_after (lab
, scan
);
4142 if (TARGET_FMOVD
&& TARGET_ALIGN_DOUBLE
&& have_df
)
4144 rtx align_insn
= NULL_RTX
;
4146 scan
= emit_label_after (gen_label_rtx (), scan
);
4147 scan
= emit_insn_after (gen_align_log (GEN_INT (3)), scan
);
4150 for (i
= 0; i
< pool_size
; i
++)
4152 pool_node
*p
= &pool_vector
[i
];
4160 if (align_insn
&& !p
->part_of_sequence_p
)
4162 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4163 emit_label_before (lab
, align_insn
);
4164 emit_insn_before (gen_consttable_4 (p
->value
, const0_rtx
),
4166 for (ref
= p
->wend
; ref
; ref
= ref
->next
)
4169 emit_insn_before (gen_consttable_window_end (lab
),
4172 delete_insn (align_insn
);
4173 align_insn
= NULL_RTX
;
4178 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4179 scan
= emit_label_after (lab
, scan
);
4180 scan
= emit_insn_after (gen_consttable_4 (p
->value
,
4182 need_align
= ! need_align
;
4188 scan
= emit_insn_after (gen_align_log (GEN_INT (3)), scan
);
4193 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4194 scan
= emit_label_after (lab
, scan
);
4195 scan
= emit_insn_after (gen_consttable_8 (p
->value
, const0_rtx
),
4202 if (p
->mode
!= HImode
)
4204 for (ref
= p
->wend
; ref
; ref
= ref
->next
)
4207 scan
= emit_insn_after (gen_consttable_window_end (lab
),
4216 for (i
= 0; i
< pool_size
; i
++)
4218 pool_node
*p
= &pool_vector
[i
];
4229 scan
= emit_label_after (gen_label_rtx (), scan
);
4230 scan
= emit_insn_after (gen_align_4 (), scan
);
4232 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4233 scan
= emit_label_after (lab
, scan
);
4234 scan
= emit_insn_after (gen_consttable_4 (p
->value
, const0_rtx
),
4242 scan
= emit_label_after (gen_label_rtx (), scan
);
4243 scan
= emit_insn_after (gen_align_4 (), scan
);
4245 for (lab
= p
->label
; lab
; lab
= LABEL_REFS (lab
))
4246 scan
= emit_label_after (lab
, scan
);
4247 scan
= emit_insn_after (gen_consttable_8 (p
->value
, const0_rtx
),
4254 if (p
->mode
!= HImode
)
4256 for (ref
= p
->wend
; ref
; ref
= ref
->next
)
4259 scan
= emit_insn_after (gen_consttable_window_end (lab
), scan
);
4264 scan
= emit_insn_after (gen_consttable_end (), scan
);
4265 scan
= emit_barrier_after (scan
);
4267 pool_window_label
= NULL_RTX
;
4268 pool_window_last
= 0;
4271 /* Return nonzero if constant would be an ok source for a
4272 mov.w instead of a mov.l. */
4277 return (CONST_INT_P (src
)
4278 && INTVAL (src
) >= -32768
4279 && INTVAL (src
) <= 32767);
4282 #define MOVA_LABELREF(mova) XVECEXP (SET_SRC (PATTERN (mova)), 0, 0)
4284 /* Nonzero if the insn is a move instruction which needs to be fixed. */
4286 /* ??? For a DImode/DFmode moves, we don't need to fix it if each half of the
4287 CONST_DOUBLE input value is CONST_OK_FOR_I08. For a SFmode move, we don't
4288 need to fix it if the input value is CONST_OK_FOR_I08. */
4291 broken_move (rtx insn
)
4293 if (NONJUMP_INSN_P (insn
))
4295 rtx pat
= PATTERN (insn
);
4296 if (GET_CODE (pat
) == PARALLEL
)
4297 pat
= XVECEXP (pat
, 0, 0);
4298 if (GET_CODE (pat
) == SET
4299 /* We can load any 8-bit value if we don't care what the high
4300 order bits end up as. */
4301 && GET_MODE (SET_DEST (pat
)) != QImode
4302 && (CONSTANT_P (SET_SRC (pat
))
4303 /* Match mova_const. */
4304 || (GET_CODE (SET_SRC (pat
)) == UNSPEC
4305 && XINT (SET_SRC (pat
), 1) == UNSPEC_MOVA
4306 && GET_CODE (XVECEXP (SET_SRC (pat
), 0, 0)) == CONST
))
4308 && GET_CODE (SET_SRC (pat
)) == CONST_DOUBLE
4309 && (fp_zero_operand (SET_SRC (pat
))
4310 || fp_one_operand (SET_SRC (pat
)))
4311 /* In general we don't know the current setting of fpscr, so disable fldi.
4312 There is an exception if this was a register-register move
4313 before reload - and hence it was ascertained that we have
4314 single precision setting - and in a post-reload optimization
4315 we changed this to do a constant load. In that case
4316 we don't have an r0 clobber, hence we must use fldi. */
4318 || (GET_CODE (XEXP (XVECEXP (PATTERN (insn
), 0, 2), 0))
4320 && REG_P (SET_DEST (pat
))
4321 && FP_REGISTER_P (REGNO (SET_DEST (pat
))))
4323 && GET_MODE (SET_DEST (pat
)) == SImode
4324 && (satisfies_constraint_I20 (SET_SRC (pat
))
4325 || satisfies_constraint_I28 (SET_SRC (pat
))))
4326 && ! satisfies_constraint_I08 (SET_SRC (pat
)))
4336 return (NONJUMP_INSN_P (insn
)
4337 && GET_CODE (PATTERN (insn
)) == SET
4338 && GET_CODE (SET_SRC (PATTERN (insn
))) == UNSPEC
4339 && XINT (SET_SRC (PATTERN (insn
)), 1) == UNSPEC_MOVA
4340 /* Don't match mova_const. */
4341 && GET_CODE (MOVA_LABELREF (insn
)) == LABEL_REF
);
4344 /* Fix up a mova from a switch that went out of range. */
4346 fixup_mova (rtx mova
)
4348 PUT_MODE (XEXP (MOVA_LABELREF (mova
), 0), QImode
);
4351 SET_SRC (PATTERN (mova
)) = MOVA_LABELREF (mova
);
4352 INSN_CODE (mova
) = -1;
4357 rtx lab
= gen_label_rtx ();
4358 rtx wpat
, wpat0
, wpat1
, wsrc
, target
, base
, diff
;
4362 worker
= NEXT_INSN (worker
);
4364 && !LABEL_P (worker
)
4365 && !JUMP_P (worker
));
4366 } while (NOTE_P (worker
)
4367 || recog_memoized (worker
) != CODE_FOR_casesi_worker_1
);
4368 wpat
= PATTERN (worker
);
4369 wpat0
= XVECEXP (wpat
, 0, 0);
4370 wpat1
= XVECEXP (wpat
, 0, 1);
4371 wsrc
= SET_SRC (wpat0
);
4372 PATTERN (worker
) = (gen_casesi_worker_2
4373 (SET_DEST (wpat0
), XVECEXP (wsrc
, 0, 1),
4374 XEXP (XVECEXP (wsrc
, 0, 2), 0), lab
,
4376 INSN_CODE (worker
) = -1;
4377 target
= XVECEXP (SET_SRC (PATTERN (mova
)), 0, 0);
4378 base
= gen_rtx_LABEL_REF (Pmode
, lab
);
4379 diff
= gen_rtx_UNSPEC (Pmode
, gen_rtvec (2, target
, base
), UNSPEC_SYMOFF
);
4380 SET_SRC (PATTERN (mova
)) = gen_rtx_CONST (Pmode
, diff
);
4381 INSN_CODE (mova
) = -1;
4385 /* NEW_MOVA is a mova we've just encountered while scanning forward. Update
4386 *num_mova, and check if the new mova is not nested within the first one.
4387 return 0 if *first_mova was replaced, 1 if new_mova was replaced,
4388 2 if new_mova has been assigned to *first_mova, -1 otherwise.. */
4390 untangle_mova (int *num_mova
, rtx
*first_mova
, rtx new_mova
)
4392 int n_addr
= 0; /* Initialization to shut up spurious warning. */
4393 int f_target
, n_target
= 0; /* Likewise. */
4397 /* If NEW_MOVA has no address yet, it will be handled later. */
4398 if (INSN_ADDRESSES_SIZE() <= (unsigned) INSN_UID (new_mova
))
4401 n_addr
= INSN_ADDRESSES (INSN_UID (new_mova
));
4402 n_target
= INSN_ADDRESSES (INSN_UID (XEXP (MOVA_LABELREF (new_mova
), 0)));
4403 if (n_addr
> n_target
|| n_addr
+ 1022 < n_target
)
4405 /* Change the mova into a load.
4406 broken_move will then return true for it. */
4407 fixup_mova (new_mova
);
4413 *first_mova
= new_mova
;
4418 = INSN_ADDRESSES (INSN_UID (XEXP (MOVA_LABELREF (*first_mova
), 0))))
4423 if (f_target
- INSN_ADDRESSES (INSN_UID (*first_mova
))
4424 > n_target
- n_addr
)
4426 fixup_mova (*first_mova
);
4431 fixup_mova (new_mova
);
4436 /* Find the last barrier from insn FROM which is close enough to hold the
4437 constant pool. If we can't find one, then create one near the end of
4441 find_barrier (int num_mova
, rtx mova
, rtx from
)
4450 int leading_mova
= num_mova
;
4451 rtx barrier_before_mova
= 0, found_barrier
= 0, good_barrier
= 0;
4455 rtx last_got
= NULL_RTX
;
4456 rtx last_symoff
= NULL_RTX
;
4458 /* For HImode: range is 510, add 4 because pc counts from address of
4459 second instruction after this one, subtract 2 for the jump instruction
4460 that we may need to emit before the table, subtract 2 for the instruction
4461 that fills the jump delay slot (in very rare cases, reorg will take an
4462 instruction from after the constant pool or will leave the delay slot
4463 empty). This gives 510.
4464 For SImode: range is 1020, add 4 because pc counts from address of
4465 second instruction after this one, subtract 2 in case pc is 2 byte
4466 aligned, subtract 2 for the jump instruction that we may need to emit
4467 before the table, subtract 2 for the instruction that fills the jump
4468 delay slot. This gives 1018. */
4470 /* The branch will always be shortened now that the reference address for
4471 forward branches is the successor address, thus we need no longer make
4472 adjustments to the [sh]i_limit for -O0. */
4477 while (from
&& count_si
< si_limit
&& count_hi
< hi_limit
)
4479 int inc
= get_attr_length (from
);
4482 /* If this is a label that existed at the time of the compute_alignments
4483 call, determine the alignment. N.B. When find_barrier recurses for
4484 an out-of-reach mova, we might see labels at the start of previously
4485 inserted constant tables. */
4487 && CODE_LABEL_NUMBER (from
) <= max_labelno_before_reorg
)
4490 new_align
= 1 << label_to_alignment (from
);
4491 else if (BARRIER_P (prev_nonnote_insn (from
)))
4492 new_align
= 1 << barrier_align (from
);
4497 /* In case we are scanning a constant table because of recursion, check
4498 for explicit alignments. If the table is long, we might be forced
4499 to emit the new table in front of it; the length of the alignment
4500 might be the last straw. */
4501 else if (NONJUMP_INSN_P (from
)
4502 && GET_CODE (PATTERN (from
)) == UNSPEC_VOLATILE
4503 && XINT (PATTERN (from
), 1) == UNSPECV_ALIGN
)
4504 new_align
= INTVAL (XVECEXP (PATTERN (from
), 0, 0));
4505 /* When we find the end of a constant table, paste the new constant
4506 at the end. That is better than putting it in front because
4507 this way, we don't need extra alignment for adding a 4-byte-aligned
4508 mov(a) label to a 2/4 or 8/4 byte aligned table. */
4509 else if (NONJUMP_INSN_P (from
)
4510 && GET_CODE (PATTERN (from
)) == UNSPEC_VOLATILE
4511 && XINT (PATTERN (from
), 1) == UNSPECV_CONST_END
)
4514 if (BARRIER_P (from
))
4518 found_barrier
= from
;
4520 /* If we are at the end of the function, or in front of an alignment
4521 instruction, we need not insert an extra alignment. We prefer
4522 this kind of barrier. */
4523 if (barrier_align (from
) > 2)
4524 good_barrier
= from
;
4526 /* If we are at the end of a hot/cold block, dump the constants
4528 next
= NEXT_INSN (from
);
4531 && NOTE_KIND (next
) == NOTE_INSN_SWITCH_TEXT_SECTIONS
)
4535 if (broken_move (from
))
4538 enum machine_mode mode
;
4540 pat
= PATTERN (from
);
4541 if (GET_CODE (pat
) == PARALLEL
)
4542 pat
= XVECEXP (pat
, 0, 0);
4543 src
= SET_SRC (pat
);
4544 dst
= SET_DEST (pat
);
4545 mode
= GET_MODE (dst
);
4547 /* GOT pcrelat setting comes in pair of
4550 instructions. (plus add r0,r12).
4551 Remember if we see one without the other. */
4552 if (GET_CODE (src
) == UNSPEC
&& PIC_ADDR_P (XVECEXP (src
, 0, 0)))
4553 last_got
= last_got
? NULL_RTX
: from
;
4554 else if (PIC_ADDR_P (src
))
4555 last_got
= last_got
? NULL_RTX
: from
;
4557 /* We must explicitly check the mode, because sometimes the
4558 front end will generate code to load unsigned constants into
4559 HImode targets without properly sign extending them. */
4561 || (mode
== SImode
&& hi_const (src
) && REGNO (dst
) != FPUL_REG
))
4564 /* We put the short constants before the long constants, so
4565 we must count the length of short constants in the range
4566 for the long constants. */
4567 /* ??? This isn't optimal, but is easy to do. */
4572 /* We dump DF/DI constants before SF/SI ones, because
4573 the limit is the same, but the alignment requirements
4574 are higher. We may waste up to 4 additional bytes
4575 for alignment, and the DF/DI constant may have
4576 another SF/SI constant placed before it. */
4577 if (TARGET_SHCOMPACT
4579 && (mode
== DFmode
|| mode
== DImode
))
4584 while (si_align
> 2 && found_si
+ si_align
- 2 > count_si
)
4586 if (found_si
> count_si
)
4587 count_si
= found_si
;
4588 found_si
+= GET_MODE_SIZE (mode
);
4590 si_limit
-= GET_MODE_SIZE (mode
);
4596 switch (untangle_mova (&num_mova
, &mova
, from
))
4601 rtx src
= SET_SRC (PATTERN (from
));
4602 if (GET_CODE (src
) == CONST
4603 && GET_CODE (XEXP (src
, 0)) == UNSPEC
4604 && XINT (XEXP (src
, 0), 1) == UNSPEC_SYMOFF
)
4608 case 0: return find_barrier (0, 0, mova
);
4613 = good_barrier
? good_barrier
: found_barrier
;
4617 if (found_si
> count_si
)
4618 count_si
= found_si
;
4620 else if (JUMP_TABLE_DATA_P (from
))
4622 if ((num_mova
> 1 && GET_MODE (prev_nonnote_insn (from
)) == VOIDmode
)
4624 && (prev_nonnote_insn (from
)
4625 == XEXP (MOVA_LABELREF (mova
), 0))))
4627 if (barrier_align (next_real_insn (from
)) == align_jumps_log
)
4629 /* We have just passed the barrier in front of the
4630 ADDR_DIFF_VEC, which is stored in found_barrier. Since
4631 the ADDR_DIFF_VEC is accessed as data, just like our pool
4632 constants, this is a good opportunity to accommodate what
4633 we have gathered so far.
4634 If we waited any longer, we could end up at a barrier in
4635 front of code, which gives worse cache usage for separated
4636 instruction / data caches. */
4637 good_barrier
= found_barrier
;
4642 rtx body
= PATTERN (from
);
4643 inc
= XVECLEN (body
, 1) * GET_MODE_SIZE (GET_MODE (body
));
4646 /* For the SH1, we generate alignments even after jumps-around-jumps. */
4647 else if (JUMP_P (from
)
4649 && ! TARGET_SMALLCODE
)
4652 /* There is a possibility that a bf is transformed into a bf/s by the
4653 delay slot scheduler. */
4654 if (JUMP_P (from
) && !JUMP_TABLE_DATA_P (from
)
4655 && get_attr_type (from
) == TYPE_CBRANCH
4656 && GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (from
)))) != SEQUENCE
)
4662 if (new_align
> si_align
)
4664 si_limit
-= (count_si
- 1) & (new_align
- si_align
);
4665 si_align
= new_align
;
4667 count_si
= (count_si
+ new_align
- 1) & -new_align
;
4672 if (new_align
> hi_align
)
4674 hi_limit
-= (count_hi
- 1) & (new_align
- hi_align
);
4675 hi_align
= new_align
;
4677 count_hi
= (count_hi
+ new_align
- 1) & -new_align
;
4679 from
= NEXT_INSN (from
);
4686 /* Try as we might, the leading mova is out of range. Change
4687 it into a load (which will become a pcload) and retry. */
4689 return find_barrier (0, 0, mova
);
4693 /* Insert the constant pool table before the mova instruction,
4694 to prevent the mova label reference from going out of range. */
4696 good_barrier
= found_barrier
= barrier_before_mova
;
4702 if (good_barrier
&& next_real_insn (found_barrier
))
4703 found_barrier
= good_barrier
;
4707 /* We didn't find a barrier in time to dump our stuff,
4708 so we'll make one. */
4709 rtx label
= gen_label_rtx ();
4711 /* Don't emit a constant table in the middle of insns for
4712 casesi_worker_2. This is a bit overkill but is enough
4713 because casesi_worker_2 wouldn't appear so frequently. */
4717 /* If we exceeded the range, then we must back up over the last
4718 instruction we looked at. Otherwise, we just need to undo the
4719 NEXT_INSN at the end of the loop. */
4720 if (PREV_INSN (from
) != orig
4721 && (count_hi
> hi_limit
|| count_si
> si_limit
))
4722 from
= PREV_INSN (PREV_INSN (from
));
4724 from
= PREV_INSN (from
);
4726 /* Don't emit a constant table int the middle of global pointer setting,
4727 since that that would move the addressing base GOT into another table.
4728 We need the first mov instruction before the _GLOBAL_OFFSET_TABLE_
4729 in the pool anyway, so just move up the whole constant pool. */
4731 from
= PREV_INSN (last_got
);
4733 /* Don't insert the constant pool table at the position which
4734 may be the landing pad. */
4737 && find_reg_note (from
, REG_EH_REGION
, NULL_RTX
))
4738 from
= PREV_INSN (from
);
4740 /* Walk back to be just before any jump or label.
4741 Putting it before a label reduces the number of times the branch
4742 around the constant pool table will be hit. Putting it before
4743 a jump makes it more likely that the bra delay slot will be
4745 while (NOTE_P (from
) || JUMP_P (from
)
4747 from
= PREV_INSN (from
);
4749 from
= emit_jump_insn_after (gen_jump (label
), from
);
4750 JUMP_LABEL (from
) = label
;
4751 LABEL_NUSES (label
) = 1;
4752 found_barrier
= emit_barrier_after (from
);
4753 emit_label_after (label
, found_barrier
);
4756 return found_barrier
;
4759 /* If the instruction INSN is implemented by a special function, and we can
4760 positively find the register that is used to call the sfunc, and this
4761 register is not used anywhere else in this instruction - except as the
4762 destination of a set, return this register; else, return 0. */
4764 sfunc_uses_reg (rtx insn
)
4767 rtx pattern
, part
, reg_part
, reg
;
4769 if (!NONJUMP_INSN_P (insn
))
4771 pattern
= PATTERN (insn
);
4772 if (GET_CODE (pattern
) != PARALLEL
|| get_attr_type (insn
) != TYPE_SFUNC
)
4775 for (reg_part
= 0, i
= XVECLEN (pattern
, 0) - 1; i
>= 1; i
--)
4777 part
= XVECEXP (pattern
, 0, i
);
4778 if (GET_CODE (part
) == USE
&& GET_MODE (XEXP (part
, 0)) == SImode
)
4783 reg
= XEXP (reg_part
, 0);
4784 for (i
= XVECLEN (pattern
, 0) - 1; i
>= 0; i
--)
4786 part
= XVECEXP (pattern
, 0, i
);
4787 if (part
== reg_part
|| GET_CODE (part
) == CLOBBER
)
4789 if (reg_mentioned_p (reg
, ((GET_CODE (part
) == SET
4790 && REG_P (SET_DEST (part
)))
4791 ? SET_SRC (part
) : part
)))
4797 /* See if the only way in which INSN uses REG is by calling it, or by
4798 setting it while calling it. Set *SET to a SET rtx if the register
4802 noncall_uses_reg (rtx reg
, rtx insn
, rtx
*set
)
4808 reg2
= sfunc_uses_reg (insn
);
4809 if (reg2
&& REGNO (reg2
) == REGNO (reg
))
4811 pattern
= single_set (insn
);
4813 && REG_P (SET_DEST (pattern
))
4814 && REGNO (reg
) == REGNO (SET_DEST (pattern
)))
4820 /* We don't use rtx_equal_p because we don't care if the mode is
4822 pattern
= single_set (insn
);
4824 && REG_P (SET_DEST (pattern
))
4825 && REGNO (reg
) == REGNO (SET_DEST (pattern
)))
4831 par
= PATTERN (insn
);
4832 if (GET_CODE (par
) == PARALLEL
)
4833 for (i
= XVECLEN (par
, 0) - 1; i
>= 0; i
--)
4835 part
= XVECEXP (par
, 0, i
);
4836 if (GET_CODE (part
) != SET
&& reg_mentioned_p (reg
, part
))
4839 return reg_mentioned_p (reg
, SET_SRC (pattern
));
4845 pattern
= PATTERN (insn
);
4847 if (GET_CODE (pattern
) == PARALLEL
)
4851 for (i
= XVECLEN (pattern
, 0) - 1; i
>= 1; i
--)
4852 if (reg_mentioned_p (reg
, XVECEXP (pattern
, 0, i
)))
4854 pattern
= XVECEXP (pattern
, 0, 0);
4857 if (GET_CODE (pattern
) == SET
)
4859 if (reg_mentioned_p (reg
, SET_DEST (pattern
)))
4861 /* We don't use rtx_equal_p, because we don't care if the
4862 mode is different. */
4863 if (!REG_P (SET_DEST (pattern
))
4864 || REGNO (reg
) != REGNO (SET_DEST (pattern
)))
4870 pattern
= SET_SRC (pattern
);
4873 if (GET_CODE (pattern
) != CALL
4874 || !MEM_P (XEXP (pattern
, 0))
4875 || ! rtx_equal_p (reg
, XEXP (XEXP (pattern
, 0), 0)))
4881 /* Given a X, a pattern of an insn or a part of it, return a mask of used
4882 general registers. Bits 0..15 mean that the respective registers
4883 are used as inputs in the instruction. Bits 16..31 mean that the
4884 registers 0..15, respectively, are used as outputs, or are clobbered.
4885 IS_DEST should be set to 16 if X is the destination of a SET, else to 0. */
4887 regs_used (rtx x
, int is_dest
)
4895 code
= GET_CODE (x
);
4900 return (((1 << HARD_REGNO_NREGS (0, GET_MODE (x
))) - 1)
4901 << (REGNO (x
) + is_dest
));
4905 rtx y
= SUBREG_REG (x
);
4910 return (((1 << HARD_REGNO_NREGS (0, GET_MODE (x
))) - 1)
4912 subreg_regno_offset (REGNO (y
),
4915 GET_MODE (x
)) + is_dest
));
4919 return regs_used (SET_SRC (x
), 0) | regs_used (SET_DEST (x
), 16);
4921 /* If there was a return value, it must have been indicated with USE. */
4936 fmt
= GET_RTX_FORMAT (code
);
4938 for (i
= GET_RTX_LENGTH (code
) - 1; i
>= 0; i
--)
4943 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
4944 used
|= regs_used (XVECEXP (x
, i
, j
), is_dest
);
4946 else if (fmt
[i
] == 'e')
4947 used
|= regs_used (XEXP (x
, i
), is_dest
);
4952 /* Create an instruction that prevents redirection of a conditional branch
4953 to the destination of the JUMP with address ADDR.
4954 If the branch needs to be implemented as an indirect jump, try to find
4955 a scratch register for it.
4956 If NEED_BLOCK is 0, don't do anything unless we need a scratch register.
4957 If any preceding insn that doesn't fit into a delay slot is good enough,
4958 pass 1. Pass 2 if a definite blocking insn is needed.
4959 -1 is used internally to avoid deep recursion.
4960 If a blocking instruction is made or recognized, return it. */
4963 gen_block_redirect (rtx jump
, int addr
, int need_block
)
4966 rtx prev
= prev_nonnote_insn (jump
);
4969 /* First, check if we already have an instruction that satisfies our need. */
4970 if (prev
&& NONJUMP_INSN_P (prev
) && ! INSN_DELETED_P (prev
))
4972 if (INSN_CODE (prev
) == CODE_FOR_indirect_jump_scratch
)
4974 if (GET_CODE (PATTERN (prev
)) == USE
4975 || GET_CODE (PATTERN (prev
)) == CLOBBER
4976 || get_attr_in_delay_slot (prev
) == IN_DELAY_SLOT_YES
)
4978 else if ((need_block
&= ~1) < 0)
4980 else if (recog_memoized (prev
) == CODE_FOR_block_branch_redirect
)
4983 if (GET_CODE (PATTERN (jump
)) == RETURN
)
4987 /* Reorg even does nasty things with return insns that cause branches
4988 to go out of range - see find_end_label and callers. */
4989 return emit_insn_before (gen_block_branch_redirect (const0_rtx
) , jump
);
4991 /* We can't use JUMP_LABEL here because it might be undefined
4992 when not optimizing. */
4993 dest
= XEXP (SET_SRC (PATTERN (jump
)), 0);
4994 /* If the branch is out of range, try to find a scratch register for it. */
4996 && (INSN_ADDRESSES (INSN_UID (dest
)) - addr
+ (unsigned) 4092
5000 /* Don't look for the stack pointer as a scratch register,
5001 it would cause trouble if an interrupt occurred. */
5002 unsigned attempt
= 0x7fff, used
;
5003 int jump_left
= flag_expensive_optimizations
+ 1;
5005 /* It is likely that the most recent eligible instruction is wanted for
5006 the delay slot. Therefore, find out which registers it uses, and
5007 try to avoid using them. */
5009 for (scan
= jump
; (scan
= PREV_INSN (scan
)); )
5013 if (INSN_DELETED_P (scan
))
5015 code
= GET_CODE (scan
);
5016 if (code
== CODE_LABEL
|| code
== JUMP_INSN
)
5019 && GET_CODE (PATTERN (scan
)) != USE
5020 && GET_CODE (PATTERN (scan
)) != CLOBBER
5021 && get_attr_in_delay_slot (scan
) == IN_DELAY_SLOT_YES
)
5023 attempt
&= ~regs_used (PATTERN (scan
), 0);
5027 for (used
= dead
= 0, scan
= JUMP_LABEL (jump
);
5028 (scan
= NEXT_INSN (scan
)); )
5032 if (INSN_DELETED_P (scan
))
5034 code
= GET_CODE (scan
);
5037 used
|= regs_used (PATTERN (scan
), 0);
5038 if (code
== CALL_INSN
)
5039 used
|= regs_used (CALL_INSN_FUNCTION_USAGE (scan
), 0);
5040 dead
|= (used
>> 16) & ~used
;
5046 if (code
== JUMP_INSN
)
5048 if (jump_left
-- && simplejump_p (scan
))
5049 scan
= JUMP_LABEL (scan
);
5055 /* Mask out the stack pointer again, in case it was
5056 the only 'free' register we have found. */
5059 /* If the immediate destination is still in range, check for possible
5060 threading with a jump beyond the delay slot insn.
5061 Don't check if we are called recursively; the jump has been or will be
5062 checked in a different invocation then. */
5064 else if (optimize
&& need_block
>= 0)
5066 rtx next
= next_active_insn (next_active_insn (dest
));
5067 if (next
&& JUMP_P (next
)
5068 && GET_CODE (PATTERN (next
)) == SET
5069 && recog_memoized (next
) == CODE_FOR_jump_compact
)
5071 dest
= JUMP_LABEL (next
);
5073 && (INSN_ADDRESSES (INSN_UID (dest
)) - addr
+ (unsigned) 4092
5075 gen_block_redirect (next
, INSN_ADDRESSES (INSN_UID (next
)), -1);
5081 rtx reg
= gen_rtx_REG (SImode
, exact_log2 (dead
& -dead
));
5083 /* It would be nice if we could convert the jump into an indirect
5084 jump / far branch right now, and thus exposing all constituent
5085 instructions to further optimization. However, reorg uses
5086 simplejump_p to determine if there is an unconditional jump where
5087 it should try to schedule instructions from the target of the
5088 branch; simplejump_p fails for indirect jumps even if they have
5090 rtx insn
= emit_insn_before (gen_indirect_jump_scratch
5091 (reg
, GEN_INT (unspec_bbr_uid
++)),
5093 /* ??? We would like this to have the scope of the jump, but that
5094 scope will change when a delay slot insn of an inner scope is added.
5095 Hence, after delay slot scheduling, we'll have to expect
5096 NOTE_INSN_BLOCK_END notes between the indirect_jump_scratch and
5099 INSN_LOCATOR (insn
) = INSN_LOCATOR (jump
);
5100 INSN_CODE (insn
) = CODE_FOR_indirect_jump_scratch
;
5103 else if (need_block
)
5104 /* We can't use JUMP_LABEL here because it might be undefined
5105 when not optimizing. */
5106 return emit_insn_before (gen_block_branch_redirect
5107 (GEN_INT (unspec_bbr_uid
++)),
5112 #define CONDJUMP_MIN -252
5113 #define CONDJUMP_MAX 262
5116 /* A label (to be placed) in front of the jump
5117 that jumps to our ultimate destination. */
5119 /* Where we are going to insert it if we cannot move the jump any farther,
5120 or the jump itself if we have picked up an existing jump. */
5122 /* The ultimate destination. */
5124 struct far_branch
*prev
;
5125 /* If the branch has already been created, its address;
5126 else the address of its first prospective user. */
5130 static void gen_far_branch (struct far_branch
*);
5131 enum mdep_reorg_phase_e mdep_reorg_phase
;
5133 gen_far_branch (struct far_branch
*bp
)
5135 rtx insn
= bp
->insert_place
;
5137 rtx label
= gen_label_rtx ();
5140 emit_label_after (label
, insn
);
5143 jump
= emit_jump_insn_after (gen_jump (bp
->far_label
), insn
);
5144 LABEL_NUSES (bp
->far_label
)++;
5147 jump
= emit_jump_insn_after (gen_return (), insn
);
5148 /* Emit a barrier so that reorg knows that any following instructions
5149 are not reachable via a fall-through path.
5150 But don't do this when not optimizing, since we wouldn't suppress the
5151 alignment for the barrier then, and could end up with out-of-range
5152 pc-relative loads. */
5154 emit_barrier_after (jump
);
5155 emit_label_after (bp
->near_label
, insn
);
5156 JUMP_LABEL (jump
) = bp
->far_label
;
5157 ok
= invert_jump (insn
, label
, 1);
5160 /* If we are branching around a jump (rather than a return), prevent
5161 reorg from using an insn from the jump target as the delay slot insn -
5162 when reorg did this, it pessimized code (we rather hide the delay slot)
5163 and it could cause branches to go out of range. */
5166 (gen_stuff_delay_slot
5167 (GEN_INT (unspec_bbr_uid
++),
5168 GEN_INT (recog_memoized (insn
) == CODE_FOR_branch_false
)),
5170 /* Prevent reorg from undoing our splits. */
5171 gen_block_redirect (jump
, bp
->address
+= 2, 2);
5174 /* Fix up ADDR_DIFF_VECs. */
5176 fixup_addr_diff_vecs (rtx first
)
5180 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5182 rtx vec_lab
, pat
, prev
, prevpat
, x
, braf_label
;
5185 || GET_CODE (PATTERN (insn
)) != ADDR_DIFF_VEC
)
5187 pat
= PATTERN (insn
);
5188 vec_lab
= XEXP (XEXP (pat
, 0), 0);
5190 /* Search the matching casesi_jump_2. */
5191 for (prev
= vec_lab
; ; prev
= PREV_INSN (prev
))
5195 prevpat
= PATTERN (prev
);
5196 if (GET_CODE (prevpat
) != PARALLEL
|| XVECLEN (prevpat
, 0) != 2)
5198 x
= XVECEXP (prevpat
, 0, 1);
5199 if (GET_CODE (x
) != USE
)
5202 if (GET_CODE (x
) == LABEL_REF
&& XEXP (x
, 0) == vec_lab
)
5205 /* FIXME: This is a bug in the optimizer, but it seems harmless
5206 to just avoid panicing. */
5210 /* Emit the reference label of the braf where it belongs, right after
5211 the casesi_jump_2 (i.e. braf). */
5212 braf_label
= XEXP (XEXP (SET_SRC (XVECEXP (prevpat
, 0, 0)), 1), 0);
5213 emit_label_after (braf_label
, prev
);
5215 /* Fix up the ADDR_DIF_VEC to be relative
5216 to the reference address of the braf. */
5217 XEXP (XEXP (pat
, 0), 0) = braf_label
;
5221 /* BARRIER_OR_LABEL is either a BARRIER or a CODE_LABEL immediately following
5222 a barrier. Return the base 2 logarithm of the desired alignment. */
5224 barrier_align (rtx barrier_or_label
)
5226 rtx next
= next_real_insn (barrier_or_label
), pat
, prev
;
5227 int slot
, credit
, jump_to_next
= 0;
5232 pat
= PATTERN (next
);
5234 if (GET_CODE (pat
) == ADDR_DIFF_VEC
)
5237 if (GET_CODE (pat
) == UNSPEC_VOLATILE
&& XINT (pat
, 1) == UNSPECV_ALIGN
)
5238 /* This is a barrier in front of a constant table. */
5241 prev
= prev_real_insn (barrier_or_label
);
5242 if (GET_CODE (PATTERN (prev
)) == ADDR_DIFF_VEC
)
5244 pat
= PATTERN (prev
);
5245 /* If this is a very small table, we want to keep the alignment after
5246 the table to the minimum for proper code alignment. */
5247 return ((TARGET_SMALLCODE
5248 || ((unsigned) XVECLEN (pat
, 1) * GET_MODE_SIZE (GET_MODE (pat
))
5249 <= (unsigned) 1 << (CACHE_LOG
- 2)))
5250 ? 1 << TARGET_SHMEDIA
: align_jumps_log
);
5253 if (TARGET_SMALLCODE
)
5256 if (! TARGET_SH2
|| ! optimize
)
5257 return align_jumps_log
;
5259 /* When fixing up pcloads, a constant table might be inserted just before
5260 the basic block that ends with the barrier. Thus, we can't trust the
5261 instruction lengths before that. */
5262 if (mdep_reorg_phase
> SH_FIXUP_PCLOAD
)
5264 /* Check if there is an immediately preceding branch to the insn beyond
5265 the barrier. We must weight the cost of discarding useful information
5266 from the current cache line when executing this branch and there is
5267 an alignment, against that of fetching unneeded insn in front of the
5268 branch target when there is no alignment. */
5270 /* There are two delay_slot cases to consider. One is the simple case
5271 where the preceding branch is to the insn beyond the barrier (simple
5272 delay slot filling), and the other is where the preceding branch has
5273 a delay slot that is a duplicate of the insn after the barrier
5274 (fill_eager_delay_slots) and the branch is to the insn after the insn
5275 after the barrier. */
5277 /* PREV is presumed to be the JUMP_INSN for the barrier under
5278 investigation. Skip to the insn before it. */
5279 prev
= prev_real_insn (prev
);
5281 for (slot
= 2, credit
= (1 << (CACHE_LOG
- 2)) + 2;
5282 credit
>= 0 && prev
&& NONJUMP_INSN_P (prev
);
5283 prev
= prev_real_insn (prev
))
5286 if (GET_CODE (PATTERN (prev
)) == USE
5287 || GET_CODE (PATTERN (prev
)) == CLOBBER
)
5289 if (GET_CODE (PATTERN (prev
)) == SEQUENCE
)
5291 prev
= XVECEXP (PATTERN (prev
), 0, 1);
5292 if (INSN_UID (prev
) == INSN_UID (next
))
5294 /* Delay slot was filled with insn at jump target. */
5301 get_attr_in_delay_slot (prev
) == IN_DELAY_SLOT_YES
)
5303 credit
-= get_attr_length (prev
);
5307 && JUMP_LABEL (prev
))
5311 || next_real_insn (JUMP_LABEL (prev
)) == next
5312 /* If relax_delay_slots() decides NEXT was redundant
5313 with some previous instruction, it will have
5314 redirected PREV's jump to the following insn. */
5315 || JUMP_LABEL (prev
) == next_nonnote_insn (next
)
5316 /* There is no upper bound on redundant instructions
5317 that might have been skipped, but we must not put an
5318 alignment where none had been before. */
5319 || (x
= (NEXT_INSN (NEXT_INSN (PREV_INSN (prev
)))),
5321 && (INSN_CODE (x
) == CODE_FOR_block_branch_redirect
5322 || INSN_CODE (x
) == CODE_FOR_indirect_jump_scratch
5323 || INSN_CODE (x
) == CODE_FOR_stuff_delay_slot
))))
5325 rtx pat
= PATTERN (prev
);
5326 if (GET_CODE (pat
) == PARALLEL
)
5327 pat
= XVECEXP (pat
, 0, 0);
5328 if (credit
- slot
>= (GET_CODE (SET_SRC (pat
)) == PC
? 2 : 0))
5334 return align_jumps_log
;
5337 /* If we are inside a phony loop, almost any kind of label can turn up as the
5338 first one in the loop. Aligning a braf label causes incorrect switch
5339 destination addresses; we can detect braf labels because they are
5340 followed by a BARRIER.
5341 Applying loop alignment to small constant or switch tables is a waste
5342 of space, so we suppress this too. */
5344 sh_loop_align (rtx label
)
5349 next
= next_nonnote_insn (next
);
5350 while (next
&& LABEL_P (next
));
5354 || GET_CODE (PATTERN (next
)) == ADDR_DIFF_VEC
5355 || recog_memoized (next
) == CODE_FOR_consttable_2
)
5358 return align_loops_log
;
5361 /* Do a final pass over the function, just before delayed branch
5367 rtx first
, insn
, mova
= NULL_RTX
;
5369 rtx r0_rtx
= gen_rtx_REG (Pmode
, 0);
5370 rtx r0_inc_rtx
= gen_rtx_POST_INC (Pmode
, r0_rtx
);
5372 first
= get_insns ();
5373 max_labelno_before_reorg
= max_label_num ();
5375 /* We must split call insns before introducing `mova's. If we're
5376 optimizing, they'll have already been split. Otherwise, make
5377 sure we don't split them too late. */
5379 split_all_insns_noflow ();
5384 /* If relaxing, generate pseudo-ops to associate function calls with
5385 the symbols they call. It does no harm to not generate these
5386 pseudo-ops. However, when we can generate them, it enables to
5387 linker to potentially relax the jsr to a bsr, and eliminate the
5388 register load and, possibly, the constant pool entry. */
5390 mdep_reorg_phase
= SH_INSERT_USES_LABELS
;
5393 /* Remove all REG_LABEL_OPERAND notes. We want to use them for our
5394 own purposes. This works because none of the remaining passes
5395 need to look at them.
5397 ??? But it may break in the future. We should use a machine
5398 dependent REG_NOTE, or some other approach entirely. */
5399 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5405 while ((note
= find_reg_note (insn
, REG_LABEL_OPERAND
,
5407 remove_note (insn
, note
);
5411 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5413 rtx pattern
, reg
, link
, set
, scan
, dies
, label
;
5414 int rescan
= 0, foundinsn
= 0;
5418 pattern
= PATTERN (insn
);
5420 if (GET_CODE (pattern
) == PARALLEL
)
5421 pattern
= XVECEXP (pattern
, 0, 0);
5422 if (GET_CODE (pattern
) == SET
)
5423 pattern
= SET_SRC (pattern
);
5425 if (GET_CODE (pattern
) != CALL
5426 || !MEM_P (XEXP (pattern
, 0)))
5429 reg
= XEXP (XEXP (pattern
, 0), 0);
5433 reg
= sfunc_uses_reg (insn
);
5441 /* Try scanning backward to find where the register is set. */
5443 for (scan
= PREV_INSN (insn
);
5444 scan
&& !LABEL_P (scan
);
5445 scan
= PREV_INSN (scan
))
5447 if (! INSN_P (scan
))
5450 if (! reg_mentioned_p (reg
, scan
))
5453 if (noncall_uses_reg (reg
, scan
, &set
))
5466 /* The register is set at LINK. */
5468 /* We can only optimize the function call if the register is
5469 being set to a symbol. In theory, we could sometimes
5470 optimize calls to a constant location, but the assembler
5471 and linker do not support that at present. */
5472 if (GET_CODE (SET_SRC (set
)) != SYMBOL_REF
5473 && GET_CODE (SET_SRC (set
)) != LABEL_REF
)
5476 /* Scan forward from LINK to the place where REG dies, and
5477 make sure that the only insns which use REG are
5478 themselves function calls. */
5480 /* ??? This doesn't work for call targets that were allocated
5481 by reload, since there may not be a REG_DEAD note for the
5485 for (scan
= NEXT_INSN (link
); scan
; scan
= NEXT_INSN (scan
))
5489 /* Don't try to trace forward past a CODE_LABEL if we haven't
5490 seen INSN yet. Ordinarily, we will only find the setting insn
5491 if it is in the same basic block. However,
5492 cross-jumping can insert code labels in between the load and
5493 the call, and can result in situations where a single call
5494 insn may have two targets depending on where we came from. */
5496 if (LABEL_P (scan
) && ! foundinsn
)
5499 if (! INSN_P (scan
))
5502 /* Don't try to trace forward past a JUMP. To optimize
5503 safely, we would have to check that all the
5504 instructions at the jump destination did not use REG. */
5509 if (! reg_mentioned_p (reg
, scan
))
5512 if (noncall_uses_reg (reg
, scan
, &scanset
))
5519 && (CALL_P (scan
) || sfunc_uses_reg (scan
)))
5521 /* There is a function call to this register other
5522 than the one we are checking. If we optimize
5523 this call, we need to rescan again below. */
5527 /* ??? We shouldn't have to worry about SCANSET here.
5528 We should just be able to check for a REG_DEAD note
5529 on a function call. However, the REG_DEAD notes are
5530 apparently not dependable around libcalls; c-torture
5531 execute/920501-2 is a test case. If SCANSET is set,
5532 then this insn sets the register, so it must have
5533 died earlier. Unfortunately, this will only handle
5534 the cases in which the register is, in fact, set in a
5537 /* ??? We shouldn't have to use FOUNDINSN here.
5538 This dates back to when we used LOG_LINKS to find
5539 the most recent insn which sets the register. */
5543 || find_reg_note (scan
, REG_DEAD
, reg
)))
5552 /* Either there was a branch, or some insn used REG
5553 other than as a function call address. */
5557 /* Create a code label, and put it in a REG_LABEL_OPERAND note
5558 on the insn which sets the register, and on each call insn
5559 which uses the register. In final_prescan_insn we look for
5560 the REG_LABEL_OPERAND notes, and output the appropriate label
5563 label
= gen_label_rtx ();
5564 add_reg_note (link
, REG_LABEL_OPERAND
, label
);
5565 add_reg_note (insn
, REG_LABEL_OPERAND
, label
);
5573 scan
= NEXT_INSN (scan
);
5576 && reg_mentioned_p (reg
, scan
))
5577 || ((reg2
= sfunc_uses_reg (scan
))
5578 && REGNO (reg2
) == REGNO (reg
))))
5579 add_reg_note (scan
, REG_LABEL_OPERAND
, label
);
5581 while (scan
!= dies
);
5587 fixup_addr_diff_vecs (first
);
5591 mdep_reorg_phase
= SH_SHORTEN_BRANCHES0
;
5592 shorten_branches (first
);
5595 /* Scan the function looking for move instructions which have to be
5596 changed to pc-relative loads and insert the literal tables. */
5597 label_ref_list_pool
= create_alloc_pool ("label references list",
5598 sizeof (struct label_ref_list_d
),
5600 mdep_reorg_phase
= SH_FIXUP_PCLOAD
;
5601 for (insn
= first
, num_mova
= 0; insn
; insn
= NEXT_INSN (insn
))
5605 /* ??? basic block reordering can move a switch table dispatch
5606 below the switch table. Check if that has happened.
5607 We only have the addresses available when optimizing; but then,
5608 this check shouldn't be needed when not optimizing. */
5609 if (!untangle_mova (&num_mova
, &mova
, insn
))
5615 else if (JUMP_P (insn
)
5616 && GET_CODE (PATTERN (insn
)) == ADDR_DIFF_VEC
5618 /* ??? loop invariant motion can also move a mova out of a
5619 loop. Since loop does this code motion anyway, maybe we
5620 should wrap UNSPEC_MOVA into a CONST, so that reload can
5623 && GET_MODE (prev_nonnote_insn (insn
)) == VOIDmode
)
5624 || (prev_nonnote_insn (insn
)
5625 == XEXP (MOVA_LABELREF (mova
), 0))))
5632 /* Some code might have been inserted between the mova and
5633 its ADDR_DIFF_VEC. Check if the mova is still in range. */
5634 for (scan
= mova
, total
= 0; scan
!= insn
; scan
= NEXT_INSN (scan
))
5635 total
+= get_attr_length (scan
);
5637 /* range of mova is 1020, add 4 because pc counts from address of
5638 second instruction after this one, subtract 2 in case pc is 2
5639 byte aligned. Possible alignment needed for the ADDR_DIFF_VEC
5640 cancels out with alignment effects of the mova itself. */
5643 /* Change the mova into a load, and restart scanning
5644 there. broken_move will then return true for mova. */
5649 if (broken_move (insn
)
5650 || (NONJUMP_INSN_P (insn
)
5651 && recog_memoized (insn
) == CODE_FOR_casesi_worker_2
))
5654 /* Scan ahead looking for a barrier to stick the constant table
5656 rtx barrier
= find_barrier (num_mova
, mova
, insn
);
5657 rtx last_float_move
= NULL_RTX
, last_float
= 0, *last_float_addr
= NULL
;
5658 int need_aligned_label
= 0;
5660 if (num_mova
&& ! mova_p (mova
))
5662 /* find_barrier had to change the first mova into a
5663 pcload; thus, we have to start with this new pcload. */
5667 /* Now find all the moves between the points and modify them. */
5668 for (scan
= insn
; scan
!= barrier
; scan
= NEXT_INSN (scan
))
5672 if (NONJUMP_INSN_P (scan
)
5673 && recog_memoized (scan
) == CODE_FOR_casesi_worker_2
)
5674 need_aligned_label
= 1;
5675 if (broken_move (scan
))
5677 rtx
*patp
= &PATTERN (scan
), pat
= *patp
;
5681 enum machine_mode mode
;
5683 if (GET_CODE (pat
) == PARALLEL
)
5684 patp
= &XVECEXP (pat
, 0, 0), pat
= *patp
;
5685 src
= SET_SRC (pat
);
5686 dst
= SET_DEST (pat
);
5687 mode
= GET_MODE (dst
);
5689 if (mode
== SImode
&& hi_const (src
)
5690 && REGNO (dst
) != FPUL_REG
)
5695 while (GET_CODE (dst
) == SUBREG
)
5697 offset
+= subreg_regno_offset (REGNO (SUBREG_REG (dst
)),
5698 GET_MODE (SUBREG_REG (dst
)),
5701 dst
= SUBREG_REG (dst
);
5703 dst
= gen_rtx_REG (HImode
, REGNO (dst
) + offset
);
5705 if (REG_P (dst
) && FP_ANY_REGISTER_P (REGNO (dst
)))
5707 /* This must be an insn that clobbers r0. */
5708 rtx
*clobberp
= &XVECEXP (PATTERN (scan
), 0,
5709 XVECLEN (PATTERN (scan
), 0)
5711 rtx clobber
= *clobberp
;
5713 gcc_assert (GET_CODE (clobber
) == CLOBBER
5714 && rtx_equal_p (XEXP (clobber
, 0), r0_rtx
));
5717 && reg_set_between_p (r0_rtx
, last_float_move
, scan
))
5721 && GET_MODE_SIZE (mode
) != 4
5722 && GET_MODE_SIZE (GET_MODE (last_float
)) == 4)
5724 lab
= add_constant (src
, mode
, last_float
);
5726 emit_insn_before (gen_mova (lab
), scan
);
5729 /* There will be a REG_UNUSED note for r0 on
5730 LAST_FLOAT_MOVE; we have to change it to REG_INC,
5731 lest reorg:mark_target_live_regs will not
5732 consider r0 to be used, and we end up with delay
5733 slot insn in front of SCAN that clobbers r0. */
5735 = find_regno_note (last_float_move
, REG_UNUSED
, 0);
5737 /* If we are not optimizing, then there may not be
5740 PUT_REG_NOTE_KIND (note
, REG_INC
);
5742 *last_float_addr
= r0_inc_rtx
;
5744 last_float_move
= scan
;
5746 newsrc
= gen_const_mem (mode
,
5747 (((TARGET_SH4
&& ! TARGET_FMOVD
)
5748 || REGNO (dst
) == FPUL_REG
)
5751 last_float_addr
= &XEXP (newsrc
, 0);
5753 /* Remove the clobber of r0. */
5754 *clobberp
= gen_rtx_CLOBBER (GET_MODE (clobber
),
5755 gen_rtx_SCRATCH (Pmode
));
5757 /* This is a mova needing a label. Create it. */
5758 else if (GET_CODE (src
) == UNSPEC
5759 && XINT (src
, 1) == UNSPEC_MOVA
5760 && GET_CODE (XVECEXP (src
, 0, 0)) == CONST
)
5762 lab
= add_constant (XVECEXP (src
, 0, 0), mode
, 0);
5763 newsrc
= gen_rtx_LABEL_REF (VOIDmode
, lab
);
5764 newsrc
= gen_rtx_UNSPEC (SImode
,
5765 gen_rtvec (1, newsrc
),
5770 lab
= add_constant (src
, mode
, 0);
5771 newsrc
= gen_rtx_LABEL_REF (VOIDmode
, lab
);
5772 newsrc
= gen_const_mem (mode
, newsrc
);
5774 *patp
= gen_rtx_SET (VOIDmode
, dst
, newsrc
);
5775 INSN_CODE (scan
) = -1;
5778 dump_table (need_aligned_label
? insn
: 0, barrier
);
5782 free_alloc_pool (label_ref_list_pool
);
5783 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5784 PUT_MODE (insn
, VOIDmode
);
5786 mdep_reorg_phase
= SH_SHORTEN_BRANCHES1
;
5787 INSN_ADDRESSES_FREE ();
5788 split_branches (first
);
5790 /* The INSN_REFERENCES_ARE_DELAYED in sh.h is problematic because it
5791 also has an effect on the register that holds the address of the sfunc.
5792 Insert an extra dummy insn in front of each sfunc that pretends to
5793 use this register. */
5794 if (flag_delayed_branch
)
5796 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5798 rtx reg
= sfunc_uses_reg (insn
);
5802 emit_insn_before (gen_use_sfunc_addr (reg
), insn
);
5806 /* fpscr is not actually a user variable, but we pretend it is for the
5807 sake of the previous optimization passes, since we want it handled like
5808 one. However, we don't have any debugging information for it, so turn
5809 it into a non-user variable now. */
5811 REG_USERVAR_P (get_fpscr_rtx ()) = 0;
5813 mdep_reorg_phase
= SH_AFTER_MDEP_REORG
;
5817 get_dest_uid (rtx label
, int max_uid
)
5819 rtx dest
= next_real_insn (label
);
5822 /* This can happen for an undefined label. */
5824 dest_uid
= INSN_UID (dest
);
5825 /* If this is a newly created branch redirection blocking instruction,
5826 we cannot index the branch_uid or insn_addresses arrays with its
5827 uid. But then, we won't need to, because the actual destination is
5828 the following branch. */
5829 while (dest_uid
>= max_uid
)
5831 dest
= NEXT_INSN (dest
);
5832 dest_uid
= INSN_UID (dest
);
5834 if (JUMP_P (dest
) && GET_CODE (PATTERN (dest
)) == RETURN
)
5839 /* Split condbranches that are out of range. Also add clobbers for
5840 scratch registers that are needed in far jumps.
5841 We do this before delay slot scheduling, so that it can take our
5842 newly created instructions into account. It also allows us to
5843 find branches with common targets more easily. */
5846 split_branches (rtx first
)
5849 struct far_branch
**uid_branch
, *far_branch_list
= 0;
5850 int max_uid
= get_max_uid ();
5853 /* Find out which branches are out of range. */
5854 shorten_branches (first
);
5856 uid_branch
= (struct far_branch
**) alloca (max_uid
* sizeof *uid_branch
);
5857 memset ((char *) uid_branch
, 0, max_uid
* sizeof *uid_branch
);
5859 for (insn
= first
; insn
; insn
= NEXT_INSN (insn
))
5860 if (! INSN_P (insn
))
5862 else if (INSN_DELETED_P (insn
))
5864 /* Shorten_branches would split this instruction again,
5865 so transform it into a note. */
5866 SET_INSN_DELETED (insn
);
5868 else if (JUMP_P (insn
)
5869 /* Don't mess with ADDR_DIFF_VEC */
5870 && (GET_CODE (PATTERN (insn
)) == SET
5871 || GET_CODE (PATTERN (insn
)) == RETURN
))
5873 enum attr_type type
= get_attr_type (insn
);
5874 if (type
== TYPE_CBRANCH
)
5878 if (get_attr_length (insn
) > 4)
5880 rtx src
= SET_SRC (PATTERN (insn
));
5881 rtx olabel
= XEXP (XEXP (src
, 1), 0);
5882 int addr
= INSN_ADDRESSES (INSN_UID (insn
));
5884 int dest_uid
= get_dest_uid (olabel
, max_uid
);
5885 struct far_branch
*bp
= uid_branch
[dest_uid
];
5887 /* redirect_jump needs a valid JUMP_LABEL, and it might delete
5888 the label if the LABEL_NUSES count drops to zero. There is
5889 always a jump_optimize pass that sets these values, but it
5890 proceeds to delete unreferenced code, and then if not
5891 optimizing, to un-delete the deleted instructions, thus
5892 leaving labels with too low uses counts. */
5895 JUMP_LABEL (insn
) = olabel
;
5896 LABEL_NUSES (olabel
)++;
5900 bp
= (struct far_branch
*) alloca (sizeof *bp
);
5901 uid_branch
[dest_uid
] = bp
;
5902 bp
->prev
= far_branch_list
;
5903 far_branch_list
= bp
;
5905 = XEXP (XEXP (SET_SRC (PATTERN (insn
)), 1), 0);
5906 LABEL_NUSES (bp
->far_label
)++;
5910 label
= bp
->near_label
;
5911 if (! label
&& bp
->address
- addr
>= CONDJUMP_MIN
)
5913 rtx block
= bp
->insert_place
;
5915 if (GET_CODE (PATTERN (block
)) == RETURN
)
5916 block
= PREV_INSN (block
);
5918 block
= gen_block_redirect (block
,
5920 label
= emit_label_after (gen_label_rtx (),
5922 bp
->near_label
= label
;
5924 else if (label
&& ! NEXT_INSN (label
))
5926 if (addr
+ 2 - bp
->address
<= CONDJUMP_MAX
)
5927 bp
->insert_place
= insn
;
5929 gen_far_branch (bp
);
5933 || (NEXT_INSN (label
) && bp
->address
- addr
< CONDJUMP_MIN
))
5935 bp
->near_label
= label
= gen_label_rtx ();
5936 bp
->insert_place
= insn
;
5939 ok
= redirect_jump (insn
, label
, 0);
5944 /* get_attr_length (insn) == 2 */
5945 /* Check if we have a pattern where reorg wants to redirect
5946 the branch to a label from an unconditional branch that
5948 /* We can't use JUMP_LABEL here because it might be undefined
5949 when not optimizing. */
5950 /* A syntax error might cause beyond to be NULL_RTX. */
5952 = next_active_insn (XEXP (XEXP (SET_SRC (PATTERN (insn
)), 1),
5957 || ((beyond
= next_active_insn (beyond
))
5958 && JUMP_P (beyond
)))
5959 && GET_CODE (PATTERN (beyond
)) == SET
5960 && recog_memoized (beyond
) == CODE_FOR_jump_compact
5962 (INSN_UID (XEXP (SET_SRC (PATTERN (beyond
)), 0)))
5963 - INSN_ADDRESSES (INSN_UID (insn
)) + (unsigned) 252)
5965 gen_block_redirect (beyond
,
5966 INSN_ADDRESSES (INSN_UID (beyond
)), 1);
5969 next
= next_active_insn (insn
);
5973 || ((next
= next_active_insn (next
))
5975 && GET_CODE (PATTERN (next
)) == SET
5976 && recog_memoized (next
) == CODE_FOR_jump_compact
5978 (INSN_UID (XEXP (SET_SRC (PATTERN (next
)), 0)))
5979 - INSN_ADDRESSES (INSN_UID (insn
)) + (unsigned) 252)
5981 gen_block_redirect (next
, INSN_ADDRESSES (INSN_UID (next
)), 1);
5983 else if (type
== TYPE_JUMP
|| type
== TYPE_RETURN
)
5985 int addr
= INSN_ADDRESSES (INSN_UID (insn
));
5988 struct far_branch
*bp
;
5990 if (type
== TYPE_JUMP
)
5992 far_label
= XEXP (SET_SRC (PATTERN (insn
)), 0);
5993 dest_uid
= get_dest_uid (far_label
, max_uid
);
5996 /* Parse errors can lead to labels outside
5998 if (! NEXT_INSN (far_label
))
6003 JUMP_LABEL (insn
) = far_label
;
6004 LABEL_NUSES (far_label
)++;
6006 redirect_jump (insn
, NULL_RTX
, 1);
6010 bp
= uid_branch
[dest_uid
];
6013 bp
= (struct far_branch
*) alloca (sizeof *bp
);
6014 uid_branch
[dest_uid
] = bp
;
6015 bp
->prev
= far_branch_list
;
6016 far_branch_list
= bp
;
6018 bp
->far_label
= far_label
;
6020 LABEL_NUSES (far_label
)++;
6022 else if (bp
->near_label
&& ! NEXT_INSN (bp
->near_label
))
6023 if (addr
- bp
->address
<= CONDJUMP_MAX
)
6024 emit_label_after (bp
->near_label
, PREV_INSN (insn
));
6027 gen_far_branch (bp
);
6033 bp
->insert_place
= insn
;
6035 emit_insn_before (gen_block_branch_redirect (const0_rtx
), insn
);
6037 gen_block_redirect (insn
, addr
, bp
->near_label
? 2 : 0);
6040 /* Generate all pending far branches,
6041 and free our references to the far labels. */
6042 while (far_branch_list
)
6044 if (far_branch_list
->near_label
6045 && ! NEXT_INSN (far_branch_list
->near_label
))
6046 gen_far_branch (far_branch_list
);
6048 && far_branch_list
->far_label
6049 && ! --LABEL_NUSES (far_branch_list
->far_label
))
6050 delete_insn (far_branch_list
->far_label
);
6051 far_branch_list
= far_branch_list
->prev
;
6054 /* Instruction length information is no longer valid due to the new
6055 instructions that have been generated. */
6056 init_insn_lengths ();
6059 /* Dump out instruction addresses, which is useful for debugging the
6060 constant pool table stuff.
6062 If relaxing, output the label and pseudo-ops used to link together
6063 calls and the instruction which set the registers. */
6065 /* ??? The addresses printed by this routine for insns are nonsense for
6066 insns which are inside of a sequence where none of the inner insns have
6067 variable length. This is because the second pass of shorten_branches
6068 does not bother to update them. */
6071 final_prescan_insn (rtx insn
, rtx
*opvec ATTRIBUTE_UNUSED
,
6072 int noperands ATTRIBUTE_UNUSED
)
6074 if (TARGET_DUMPISIZE
)
6075 fprintf (asm_out_file
, "\n! at %04x\n", INSN_ADDRESSES (INSN_UID (insn
)));
6081 note
= find_reg_note (insn
, REG_LABEL_OPERAND
, NULL_RTX
);
6086 pattern
= PATTERN (insn
);
6087 if (GET_CODE (pattern
) == PARALLEL
)
6088 pattern
= XVECEXP (pattern
, 0, 0);
6089 switch (GET_CODE (pattern
))
6092 if (GET_CODE (SET_SRC (pattern
)) != CALL
6093 && get_attr_type (insn
) != TYPE_SFUNC
)
6095 targetm
.asm_out
.internal_label
6096 (asm_out_file
, "L", CODE_LABEL_NUMBER (XEXP (note
, 0)));
6099 /* else FALLTHROUGH */
6101 asm_fprintf (asm_out_file
, "\t.uses %LL%d\n",
6102 CODE_LABEL_NUMBER (XEXP (note
, 0)));
6112 /* Dump out any constants accumulated in the final pass. These will
6116 output_jump_label_table (void)
6122 fprintf (asm_out_file
, "\t.align 2\n");
6123 for (i
= 0; i
< pool_size
; i
++)
6125 pool_node
*p
= &pool_vector
[i
];
6127 (*targetm
.asm_out
.internal_label
) (asm_out_file
, "L",
6128 CODE_LABEL_NUMBER (p
->label
));
6129 output_asm_insn (".long %O0", &p
->value
);
6137 /* A full frame looks like:
6141 [ if current_function_anonymous_args
6154 local-0 <- fp points here. */
6156 /* Number of bytes pushed for anonymous args, used to pass information
6157 between expand_prologue and expand_epilogue. */
6159 /* Adjust the stack by SIZE bytes. REG holds the rtl of the register to be
6160 adjusted. If epilogue_p is zero, this is for a prologue; otherwise, it's
6161 for an epilogue and a negative value means that it's for a sibcall
6162 epilogue. If LIVE_REGS_MASK is nonzero, it points to a HARD_REG_SET of
6163 all the registers that are about to be restored, and hence dead. */
6166 output_stack_adjust (int size
, rtx reg
, int epilogue_p
,
6167 HARD_REG_SET
*live_regs_mask
, bool frame_p
)
6169 rtx (*emit_fn
) (rtx
) = frame_p
? &frame_insn
: &emit_insn
;
6172 HOST_WIDE_INT align
= STACK_BOUNDARY
/ BITS_PER_UNIT
;
6174 /* This test is bogus, as output_stack_adjust is used to re-align the
6177 gcc_assert (!(size
% align
));
6180 if (CONST_OK_FOR_ADD (size
))
6181 emit_fn (GEN_ADD3 (reg
, reg
, GEN_INT (size
)));
6182 /* Try to do it with two partial adjustments; however, we must make
6183 sure that the stack is properly aligned at all times, in case
6184 an interrupt occurs between the two partial adjustments. */
6185 else if (CONST_OK_FOR_ADD (size
/ 2 & -align
)
6186 && CONST_OK_FOR_ADD (size
- (size
/ 2 & -align
)))
6188 emit_fn (GEN_ADD3 (reg
, reg
, GEN_INT (size
/ 2 & -align
)));
6189 emit_fn (GEN_ADD3 (reg
, reg
, GEN_INT (size
- (size
/ 2 & -align
))));
6195 int temp
= epilogue_p
? 7 : (TARGET_SH5
? 0 : 1);
6198 /* If TEMP is invalid, we could temporarily save a general
6199 register to MACL. However, there is currently no need
6200 to handle this case, so just die when we see it. */
6202 || current_function_interrupt
6203 || ! call_really_used_regs
[temp
] || fixed_regs
[temp
])
6205 if (temp
< 0 && ! current_function_interrupt
6206 && (TARGET_SHMEDIA
|| epilogue_p
>= 0))
6209 COPY_HARD_REG_SET (temps
, call_used_reg_set
);
6210 AND_COMPL_HARD_REG_SET (temps
, call_fixed_reg_set
);
6214 if (crtl
->return_rtx
)
6216 enum machine_mode mode
;
6217 mode
= GET_MODE (crtl
->return_rtx
);
6218 if (BASE_RETURN_VALUE_REG (mode
) == FIRST_RET_REG
)
6219 nreg
= HARD_REGNO_NREGS (FIRST_RET_REG
, mode
);
6221 for (i
= 0; i
< nreg
; i
++)
6222 CLEAR_HARD_REG_BIT (temps
, FIRST_RET_REG
+ i
);
6223 if (crtl
->calls_eh_return
)
6225 CLEAR_HARD_REG_BIT (temps
, EH_RETURN_STACKADJ_REGNO
);
6226 for (i
= 0; i
<= 3; i
++)
6227 CLEAR_HARD_REG_BIT (temps
, EH_RETURN_DATA_REGNO (i
));
6230 if (TARGET_SHMEDIA
&& epilogue_p
< 0)
6231 for (i
= FIRST_TARGET_REG
; i
<= LAST_TARGET_REG
; i
++)
6232 CLEAR_HARD_REG_BIT (temps
, i
);
6233 if (epilogue_p
<= 0)
6235 for (i
= FIRST_PARM_REG
;
6236 i
< FIRST_PARM_REG
+ NPARM_REGS (SImode
); i
++)
6237 CLEAR_HARD_REG_BIT (temps
, i
);
6238 if (cfun
->static_chain_decl
!= NULL
)
6239 CLEAR_HARD_REG_BIT (temps
, STATIC_CHAIN_REGNUM
);
6241 temp
= scavenge_reg (&temps
);
6243 if (temp
< 0 && live_regs_mask
)
6247 COPY_HARD_REG_SET (temps
, *live_regs_mask
);
6248 CLEAR_HARD_REG_BIT (temps
, REGNO (reg
));
6249 temp
= scavenge_reg (&temps
);
6253 rtx adj_reg
, tmp_reg
, mem
;
6255 /* If we reached here, the most likely case is the (sibcall)
6256 epilogue for non SHmedia. Put a special push/pop sequence
6257 for such case as the last resort. This looks lengthy but
6258 would not be problem because it seems to be very
6261 gcc_assert (!TARGET_SHMEDIA
&& epilogue_p
);
6264 /* ??? There is still the slight possibility that r4 or
6265 r5 have been reserved as fixed registers or assigned
6266 as global registers, and they change during an
6267 interrupt. There are possible ways to handle this:
6269 - If we are adjusting the frame pointer (r14), we can do
6270 with a single temp register and an ordinary push / pop
6272 - Grab any call-used or call-saved registers (i.e. not
6273 fixed or globals) for the temps we need. We might
6274 also grab r14 if we are adjusting the stack pointer.
6275 If we can't find enough available registers, issue
6276 a diagnostic and die - the user must have reserved
6277 way too many registers.
6278 But since all this is rather unlikely to happen and
6279 would require extra testing, we just die if r4 / r5
6280 are not available. */
6281 gcc_assert (!fixed_regs
[4] && !fixed_regs
[5]
6282 && !global_regs
[4] && !global_regs
[5]);
6284 adj_reg
= gen_rtx_REG (GET_MODE (reg
), 4);
6285 tmp_reg
= gen_rtx_REG (GET_MODE (reg
), 5);
6286 emit_move_insn (gen_tmp_stack_mem (Pmode
, reg
), adj_reg
);
6287 emit_insn (GEN_MOV (adj_reg
, GEN_INT (size
)));
6288 emit_insn (GEN_ADD3 (adj_reg
, adj_reg
, reg
));
6289 mem
= gen_tmp_stack_mem (Pmode
, gen_rtx_PRE_DEC (Pmode
, adj_reg
));
6290 emit_move_insn (mem
, tmp_reg
);
6291 emit_move_insn (tmp_reg
, gen_tmp_stack_mem (Pmode
, reg
));
6292 mem
= gen_tmp_stack_mem (Pmode
, gen_rtx_PRE_DEC (Pmode
, adj_reg
));
6293 emit_move_insn (mem
, tmp_reg
);
6294 emit_move_insn (reg
, adj_reg
);
6295 mem
= gen_tmp_stack_mem (Pmode
, gen_rtx_POST_INC (Pmode
, reg
));
6296 emit_move_insn (adj_reg
, mem
);
6297 mem
= gen_tmp_stack_mem (Pmode
, gen_rtx_POST_INC (Pmode
, reg
));
6298 emit_move_insn (tmp_reg
, mem
);
6299 /* Tell flow the insns that pop r4/r5 aren't dead. */
6304 const_reg
= gen_rtx_REG (GET_MODE (reg
), temp
);
6306 /* If SIZE is negative, subtract the positive value.
6307 This sometimes allows a constant pool entry to be shared
6308 between prologue and epilogue code. */
6311 emit_insn (GEN_MOV (const_reg
, GEN_INT (-size
)));
6312 insn
= emit_fn (GEN_SUB3 (reg
, reg
, const_reg
));
6316 emit_insn (GEN_MOV (const_reg
, GEN_INT (size
)));
6317 insn
= emit_fn (GEN_ADD3 (reg
, reg
, const_reg
));
6320 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
,
6321 gen_rtx_SET (VOIDmode
, reg
,
6322 gen_rtx_PLUS (SImode
, reg
,
6332 RTX_FRAME_RELATED_P (x
) = 1;
6336 /* Output RTL to push register RN onto the stack. */
6343 x
= gen_push_fpul ();
6344 else if (rn
== FPSCR_REG
)
6345 x
= gen_push_fpscr ();
6346 else if ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && TARGET_FMOVD
&& ! TARGET_FPU_SINGLE
6347 && FP_OR_XD_REGISTER_P (rn
))
6349 if (FP_REGISTER_P (rn
) && (rn
- FIRST_FP_REG
) & 1)
6351 x
= gen_push_4 (gen_rtx_REG (DFmode
, rn
));
6353 else if (TARGET_SH2E
&& FP_REGISTER_P (rn
))
6354 x
= gen_push_e (gen_rtx_REG (SFmode
, rn
));
6356 x
= gen_push (gen_rtx_REG (SImode
, rn
));
6359 add_reg_note (x
, REG_INC
, gen_rtx_REG (SImode
, STACK_POINTER_REGNUM
));
6363 /* Output RTL to pop register RN from the stack. */
6370 x
= gen_pop_fpul ();
6371 else if (rn
== FPSCR_REG
)
6372 x
= gen_pop_fpscr ();
6373 else if ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && TARGET_FMOVD
&& ! TARGET_FPU_SINGLE
6374 && FP_OR_XD_REGISTER_P (rn
))
6376 if (FP_REGISTER_P (rn
) && (rn
- FIRST_FP_REG
) & 1)
6378 x
= gen_pop_4 (gen_rtx_REG (DFmode
, rn
));
6380 else if (TARGET_SH2E
&& FP_REGISTER_P (rn
))
6381 x
= gen_pop_e (gen_rtx_REG (SFmode
, rn
));
6383 x
= gen_pop (gen_rtx_REG (SImode
, rn
));
6386 add_reg_note (x
, REG_INC
, gen_rtx_REG (SImode
, STACK_POINTER_REGNUM
));
6389 /* Generate code to push the regs specified in the mask. */
6392 push_regs (HARD_REG_SET
*mask
, int interrupt_handler
)
6394 int i
= interrupt_handler
? LAST_BANKED_REG
+ 1 : 0;
6397 /* Push PR last; this gives better latencies after the prologue, and
6398 candidates for the return delay slot when there are no general
6399 registers pushed. */
6400 for (; i
< FIRST_PSEUDO_REGISTER
; i
++)
6402 /* If this is an interrupt handler, and the SZ bit varies,
6403 and we have to push any floating point register, we need
6404 to switch to the correct precision first. */
6405 if (i
== FIRST_FP_REG
&& interrupt_handler
&& TARGET_FMOVD
6406 && hard_reg_set_intersect_p (*mask
, reg_class_contents
[DF_REGS
]))
6408 HARD_REG_SET unsaved
;
6411 COMPL_HARD_REG_SET (unsaved
, *mask
);
6412 fpscr_set_from_mem (NORMAL_MODE (FP_MODE
), unsaved
);
6416 && (i
!= FPSCR_REG
|| ! skip_fpscr
)
6417 && TEST_HARD_REG_BIT (*mask
, i
))
6419 /* If the ISR has RESBANK attribute assigned, don't push any of
6420 the following registers - R0-R14, MACH, MACL and GBR. */
6421 if (! (sh_cfun_resbank_handler_p ()
6422 && ((i
>= FIRST_GENERAL_REG
&& i
< LAST_GENERAL_REG
)
6430 /* Push banked registers last to improve delay slot opportunities. */
6431 if (interrupt_handler
)
6433 bool use_movml
= false;
6437 unsigned int count
= 0;
6439 for (i
= FIRST_BANKED_REG
; i
<= LAST_BANKED_REG
; i
++)
6440 if (TEST_HARD_REG_BIT (*mask
, i
))
6445 /* Use movml when all banked registers are pushed. */
6446 if (count
== LAST_BANKED_REG
- FIRST_BANKED_REG
+ 1)
6452 rtx x
, mem
, reg
, set
;
6453 rtx sp_reg
= gen_rtx_REG (SImode
, STACK_POINTER_REGNUM
);
6455 /* We must avoid scheduling multiple store insn with another
6457 emit_insn (gen_blockage ());
6458 x
= gen_movml_push_banked (sp_reg
);
6460 for (i
= FIRST_BANKED_REG
; i
<= LAST_BANKED_REG
; i
++)
6462 mem
= gen_rtx_MEM (SImode
, plus_constant (sp_reg
, i
* 4));
6463 reg
= gen_rtx_REG (SImode
, i
);
6464 add_reg_note (x
, REG_CFA_OFFSET
, gen_rtx_SET (SImode
, mem
, reg
));
6467 set
= gen_rtx_SET (SImode
, sp_reg
, plus_constant (sp_reg
, - 32));
6468 add_reg_note (x
, REG_CFA_ADJUST_CFA
, set
);
6469 emit_insn (gen_blockage ());
6472 for (i
= FIRST_BANKED_REG
; i
<= LAST_BANKED_REG
; i
++)
6473 if (TEST_HARD_REG_BIT (*mask
, i
))
6477 /* Don't push PR register for an ISR with RESBANK attribute assigned. */
6478 if (TEST_HARD_REG_BIT (*mask
, PR_REG
) && !sh_cfun_resbank_handler_p ())
6482 /* Calculate how much extra space is needed to save all callee-saved
6484 LIVE_REGS_MASK is the register mask calculated by calc_live_regs. */
6487 shmedia_target_regs_stack_space (HARD_REG_SET
*live_regs_mask
)
6490 int stack_space
= 0;
6491 int interrupt_handler
= sh_cfun_interrupt_handler_p ();
6493 for (reg
= LAST_TARGET_REG
; reg
>= FIRST_TARGET_REG
; reg
--)
6494 if ((! call_really_used_regs
[reg
] || interrupt_handler
)
6495 && ! TEST_HARD_REG_BIT (*live_regs_mask
, reg
))
6496 /* Leave space to save this target register on the stack,
6497 in case target register allocation wants to use it. */
6498 stack_space
+= GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg
));
6502 /* Decide whether we should reserve space for callee-save target registers,
6503 in case target register allocation wants to use them. REGS_SAVED is
6504 the space, in bytes, that is already required for register saves.
6505 LIVE_REGS_MASK is the register mask calculated by calc_live_regs. */
6508 shmedia_reserve_space_for_target_registers_p (int regs_saved
,
6509 HARD_REG_SET
*live_regs_mask
)
6513 return shmedia_target_regs_stack_space (live_regs_mask
) <= regs_saved
;
6516 /* Decide how much space to reserve for callee-save target registers
6517 in case target register allocation wants to use them.
6518 LIVE_REGS_MASK is the register mask calculated by calc_live_regs. */
6521 shmedia_target_regs_stack_adjust (HARD_REG_SET
*live_regs_mask
)
6523 if (shmedia_space_reserved_for_target_registers
)
6524 return shmedia_target_regs_stack_space (live_regs_mask
);
6529 /* Work out the registers which need to be saved, both as a mask and a
6530 count of saved words. Return the count.
6532 If doing a pragma interrupt function, then push all regs used by the
6533 function, and if we call another function (we can tell by looking at PR),
6534 make sure that all the regs it clobbers are safe too. */
6537 calc_live_regs (HARD_REG_SET
*live_regs_mask
)
6542 bool interrupt_or_trapa_handler
, trapa_handler
, interrupt_handler
;
6543 bool nosave_low_regs
;
6544 int pr_live
, has_call
;
6546 attrs
= DECL_ATTRIBUTES (current_function_decl
);
6547 interrupt_or_trapa_handler
= sh_cfun_interrupt_handler_p ();
6548 trapa_handler
= lookup_attribute ("trapa_handler", attrs
) != NULL_TREE
;
6549 interrupt_handler
= interrupt_or_trapa_handler
&& ! trapa_handler
;
6550 nosave_low_regs
= lookup_attribute ("nosave_low_regs", attrs
) != NULL_TREE
;
6552 CLEAR_HARD_REG_SET (*live_regs_mask
);
6553 if ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && TARGET_FMOVD
&& interrupt_handler
6554 && df_regs_ever_live_p (FPSCR_REG
))
6555 target_flags
&= ~MASK_FPU_SINGLE
;
6556 /* If we can save a lot of saves by switching to double mode, do that. */
6557 else if ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && TARGET_FMOVD
&& TARGET_FPU_SINGLE
)
6558 for (count
= 0, reg
= FIRST_FP_REG
; reg
<= LAST_FP_REG
; reg
+= 2)
6559 if (df_regs_ever_live_p (reg
) && df_regs_ever_live_p (reg
+1)
6560 && (! call_really_used_regs
[reg
]
6561 || interrupt_handler
)
6564 target_flags
&= ~MASK_FPU_SINGLE
;
6567 /* PR_MEDIA_REG is a general purpose register, thus global_alloc already
6568 knows how to use it. That means the pseudo originally allocated for
6569 the initial value can become the PR_MEDIA_REG hard register, as seen for
6570 execute/20010122-1.c:test9. */
6572 /* ??? this function is called from initial_elimination_offset, hence we
6573 can't use the result of sh_media_register_for_return here. */
6574 pr_live
= sh_pr_n_sets ();
6577 rtx pr_initial
= has_hard_reg_initial_val (Pmode
, PR_REG
);
6578 pr_live
= (pr_initial
6579 ? (!REG_P (pr_initial
)
6580 || REGNO (pr_initial
) != (PR_REG
))
6581 : df_regs_ever_live_p (PR_REG
));
6582 /* For Shcompact, if not optimizing, we end up with a memory reference
6583 using the return address pointer for __builtin_return_address even
6584 though there is no actual need to put the PR register on the stack. */
6585 pr_live
|= df_regs_ever_live_p (RETURN_ADDRESS_POINTER_REGNUM
);
6587 /* Force PR to be live if the prologue has to call the SHmedia
6588 argument decoder or register saver. */
6589 if (TARGET_SHCOMPACT
6590 && ((crtl
->args
.info
.call_cookie
6591 & ~ CALL_COOKIE_RET_TRAMP (1))
6592 || crtl
->saves_all_registers
))
6594 has_call
= TARGET_SHMEDIA
? ! leaf_function_p () : pr_live
;
6595 for (count
= 0, reg
= FIRST_PSEUDO_REGISTER
; reg
-- != 0; )
6597 if (reg
== (TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
)
6600 ? (/* Need to save all the regs ever live. */
6601 (df_regs_ever_live_p (reg
)
6602 || (call_really_used_regs
[reg
]
6603 && (! fixed_regs
[reg
] || reg
== MACH_REG
|| reg
== MACL_REG
6604 || reg
== PIC_OFFSET_TABLE_REGNUM
)
6606 || (TARGET_SHMEDIA
&& has_call
6607 && REGISTER_NATURAL_MODE (reg
) == SImode
6608 && (GENERAL_REGISTER_P (reg
) || TARGET_REGISTER_P (reg
))))
6609 && reg
!= STACK_POINTER_REGNUM
&& reg
!= ARG_POINTER_REGNUM
6610 && reg
!= RETURN_ADDRESS_POINTER_REGNUM
6611 && reg
!= T_REG
&& reg
!= GBR_REG
6612 /* Push fpscr only on targets which have FPU */
6613 && (reg
!= FPSCR_REG
|| TARGET_FPU_ANY
))
6614 : (/* Only push those regs which are used and need to be saved. */
6617 && crtl
->args
.info
.call_cookie
6618 && reg
== PIC_OFFSET_TABLE_REGNUM
)
6619 || (df_regs_ever_live_p (reg
)
6620 && ((!call_really_used_regs
[reg
]
6621 && !(reg
!= PIC_OFFSET_TABLE_REGNUM
6622 && fixed_regs
[reg
] && call_used_regs
[reg
]))
6623 || (trapa_handler
&& reg
== FPSCR_REG
&& TARGET_FPU_ANY
)))
6624 || (crtl
->calls_eh_return
6625 && (reg
== EH_RETURN_DATA_REGNO (0)
6626 || reg
== EH_RETURN_DATA_REGNO (1)
6627 || reg
== EH_RETURN_DATA_REGNO (2)
6628 || reg
== EH_RETURN_DATA_REGNO (3)))
6629 || ((reg
== MACL_REG
|| reg
== MACH_REG
)
6630 && df_regs_ever_live_p (reg
)
6631 && sh_cfun_attr_renesas_p ())
6634 SET_HARD_REG_BIT (*live_regs_mask
, reg
);
6635 count
+= GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg
));
6637 if ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
|| TARGET_SH5
) && TARGET_FMOVD
6638 && GET_MODE_CLASS (REGISTER_NATURAL_MODE (reg
)) == MODE_FLOAT
)
6640 if (FP_REGISTER_P (reg
))
6642 if (! TARGET_FPU_SINGLE
&& ! df_regs_ever_live_p (reg
^ 1))
6644 SET_HARD_REG_BIT (*live_regs_mask
, (reg
^ 1));
6645 count
+= GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg
^ 1));
6648 else if (XD_REGISTER_P (reg
))
6650 /* Must switch to double mode to access these registers. */
6651 target_flags
&= ~MASK_FPU_SINGLE
;
6655 if (nosave_low_regs
&& reg
== R8_REG
)
6658 /* If we have a target register optimization pass after prologue / epilogue
6659 threading, we need to assume all target registers will be live even if
6661 if (flag_branch_target_load_optimize2
6662 && TARGET_SAVE_ALL_TARGET_REGS
6663 && shmedia_space_reserved_for_target_registers
)
6664 for (reg
= LAST_TARGET_REG
; reg
>= FIRST_TARGET_REG
; reg
--)
6665 if ((! call_really_used_regs
[reg
] || interrupt_handler
)
6666 && ! TEST_HARD_REG_BIT (*live_regs_mask
, reg
))
6668 SET_HARD_REG_BIT (*live_regs_mask
, reg
);
6669 count
+= GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg
));
6671 /* If this is an interrupt handler, we don't have any call-clobbered
6672 registers we can conveniently use for target register save/restore.
6673 Make sure we save at least one general purpose register when we need
6674 to save target registers. */
6675 if (interrupt_handler
6676 && hard_reg_set_intersect_p (*live_regs_mask
,
6677 reg_class_contents
[TARGET_REGS
])
6678 && ! hard_reg_set_intersect_p (*live_regs_mask
,
6679 reg_class_contents
[GENERAL_REGS
]))
6681 SET_HARD_REG_BIT (*live_regs_mask
, R0_REG
);
6682 count
+= GET_MODE_SIZE (REGISTER_NATURAL_MODE (R0_REG
));
6688 /* Code to generate prologue and epilogue sequences */
6690 /* PUSHED is the number of bytes that are being pushed on the
6691 stack for register saves. Return the frame size, padded
6692 appropriately so that the stack stays properly aligned. */
6693 static HOST_WIDE_INT
6694 rounded_frame_size (int pushed
)
6696 HOST_WIDE_INT size
= get_frame_size ();
6697 HOST_WIDE_INT align
= STACK_BOUNDARY
/ BITS_PER_UNIT
;
6699 if (ACCUMULATE_OUTGOING_ARGS
)
6700 size
+= crtl
->outgoing_args_size
;
6702 return ((size
+ pushed
+ align
- 1) & -align
) - pushed
;
6705 /* Choose a call-clobbered target-branch register that remains
6706 unchanged along the whole function. We set it up as the return
6707 value in the prologue. */
6709 sh_media_register_for_return (void)
6714 if (! current_function_is_leaf
)
6716 if (lookup_attribute ("interrupt_handler",
6717 DECL_ATTRIBUTES (current_function_decl
)))
6719 if (sh_cfun_interrupt_handler_p ())
6722 tr0_used
= flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
);
6724 for (regno
= FIRST_TARGET_REG
+ tr0_used
; regno
<= LAST_TARGET_REG
; regno
++)
6725 if (call_really_used_regs
[regno
] && ! df_regs_ever_live_p (regno
))
6731 /* The maximum registers we need to save are:
6732 - 62 general purpose registers (r15 is stack pointer, r63 is zero)
6733 - 32 floating point registers (for each pair, we save none,
6734 one single precision value, or a double precision value).
6735 - 8 target registers
6736 - add 1 entry for a delimiter. */
6737 #define MAX_SAVED_REGS (62+32+8)
6739 typedef struct save_entry_s
6748 /* There will be a delimiter entry with VOIDmode both at the start and the
6749 end of a filled in schedule. The end delimiter has the offset of the
6750 save with the smallest (i.e. most negative) offset. */
6751 typedef struct save_schedule_s
6753 save_entry entries
[MAX_SAVED_REGS
+ 2];
6754 int temps
[MAX_TEMPS
+1];
6757 /* Fill in SCHEDULE according to LIVE_REGS_MASK. If RESTORE is nonzero,
6758 use reverse order. Returns the last entry written to (not counting
6759 the delimiter). OFFSET_BASE is a number to be added to all offset
6763 sh5_schedule_saves (HARD_REG_SET
*live_regs_mask
, save_schedule
*schedule
,
6767 save_entry
*entry
= schedule
->entries
;
6771 if (! current_function_interrupt
)
6772 for (i
= FIRST_GENERAL_REG
; tmpx
< MAX_TEMPS
&& i
<= LAST_GENERAL_REG
; i
++)
6773 if (call_really_used_regs
[i
] && ! fixed_regs
[i
] && i
!= PR_MEDIA_REG
6774 && ! FUNCTION_ARG_REGNO_P (i
)
6775 && i
!= FIRST_RET_REG
6776 && ! (cfun
->static_chain_decl
!= NULL
&& i
== STATIC_CHAIN_REGNUM
)
6777 && ! (crtl
->calls_eh_return
6778 && (i
== EH_RETURN_STACKADJ_REGNO
6779 || ((unsigned) i
>= EH_RETURN_DATA_REGNO (0)
6780 && (unsigned) i
<= EH_RETURN_DATA_REGNO (3)))))
6781 schedule
->temps
[tmpx
++] = i
;
6783 entry
->mode
= VOIDmode
;
6784 entry
->offset
= offset_base
;
6786 /* We loop twice: first, we save 8-byte aligned registers in the
6787 higher addresses, that are known to be aligned. Then, we
6788 proceed to saving 32-bit registers that don't need 8-byte
6790 If this is an interrupt function, all registers that need saving
6791 need to be saved in full. moreover, we need to postpone saving
6792 target registers till we have saved some general purpose registers
6793 we can then use as scratch registers. */
6794 offset
= offset_base
;
6795 for (align
= 1; align
>= 0; align
--)
6797 for (i
= FIRST_PSEUDO_REGISTER
- 1; i
>= 0; i
--)
6798 if (TEST_HARD_REG_BIT (*live_regs_mask
, i
))
6800 enum machine_mode mode
= REGISTER_NATURAL_MODE (i
);
6803 if (current_function_interrupt
)
6805 if (TARGET_REGISTER_P (i
))
6807 if (GENERAL_REGISTER_P (i
))
6810 if (mode
== SFmode
&& (i
% 2) == 1
6811 && ! TARGET_FPU_SINGLE
&& FP_REGISTER_P (i
)
6812 && (TEST_HARD_REG_BIT (*live_regs_mask
, (i
^ 1))))
6819 /* If we're doing the aligned pass and this is not aligned,
6820 or we're doing the unaligned pass and this is aligned,
6822 if ((GET_MODE_SIZE (mode
) % (STACK_BOUNDARY
/ BITS_PER_UNIT
) == 0)
6826 if (current_function_interrupt
6827 && GENERAL_REGISTER_P (i
)
6828 && tmpx
< MAX_TEMPS
)
6829 schedule
->temps
[tmpx
++] = i
;
6831 offset
-= GET_MODE_SIZE (mode
);
6834 entry
->offset
= offset
;
6837 if (align
&& current_function_interrupt
)
6838 for (i
= LAST_TARGET_REG
; i
>= FIRST_TARGET_REG
; i
--)
6839 if (TEST_HARD_REG_BIT (*live_regs_mask
, i
))
6841 offset
-= GET_MODE_SIZE (DImode
);
6843 entry
->mode
= DImode
;
6844 entry
->offset
= offset
;
6849 entry
->mode
= VOIDmode
;
6850 entry
->offset
= offset
;
6851 schedule
->temps
[tmpx
] = -1;
6856 sh_expand_prologue (void)
6858 HARD_REG_SET live_regs_mask
;
6861 int save_flags
= target_flags
;
6865 = lookup_attribute ("sp_switch", DECL_ATTRIBUTES (current_function_decl
));
6867 current_function_interrupt
= sh_cfun_interrupt_handler_p ();
6869 /* We have pretend args if we had an object sent partially in registers
6870 and partially on the stack, e.g. a large structure. */
6871 pretend_args
= crtl
->args
.pretend_args_size
;
6872 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl
)
6873 && (NPARM_REGS(SImode
)
6874 > crtl
->args
.info
.arg_count
[(int) SH_ARG_INT
]))
6876 /* Dwarf2 module doesn't expect frame related insns here. */
6877 output_stack_adjust (-pretend_args
6878 - crtl
->args
.info
.stack_regs
* 8,
6879 stack_pointer_rtx
, 0, NULL
, false);
6880 stack_usage
= pretend_args
+ crtl
->args
.info
.stack_regs
* 8;
6882 if (TARGET_SHCOMPACT
&& flag_pic
&& crtl
->args
.info
.call_cookie
)
6883 /* We're going to use the PIC register to load the address of the
6884 incoming-argument decoder and/or of the return trampoline from
6885 the GOT, so make sure the PIC register is preserved and
6887 df_set_regs_ever_live (PIC_OFFSET_TABLE_REGNUM
, true);
6889 if (TARGET_SHCOMPACT
6890 && (crtl
->args
.info
.call_cookie
& ~ CALL_COOKIE_RET_TRAMP(1)))
6894 /* First, make all registers with incoming arguments that will
6895 be pushed onto the stack live, so that register renaming
6896 doesn't overwrite them. */
6897 for (reg
= 0; reg
< NPARM_REGS (SImode
); reg
++)
6898 if (CALL_COOKIE_STACKSEQ_GET (crtl
->args
.info
.call_cookie
)
6899 >= NPARM_REGS (SImode
) - reg
)
6900 for (; reg
< NPARM_REGS (SImode
); reg
++)
6901 emit_insn (gen_shcompact_preserve_incoming_args
6902 (gen_rtx_REG (SImode
, FIRST_PARM_REG
+ reg
)));
6903 else if (CALL_COOKIE_INT_REG_GET
6904 (crtl
->args
.info
.call_cookie
, reg
) == 1)
6905 emit_insn (gen_shcompact_preserve_incoming_args
6906 (gen_rtx_REG (SImode
, FIRST_PARM_REG
+ reg
)));
6908 emit_move_insn (gen_rtx_REG (Pmode
, MACL_REG
),
6910 emit_move_insn (gen_rtx_REG (SImode
, R0_REG
),
6911 GEN_INT (crtl
->args
.info
.call_cookie
));
6912 emit_move_insn (gen_rtx_REG (SImode
, MACH_REG
),
6913 gen_rtx_REG (SImode
, R0_REG
));
6915 else if (TARGET_SHMEDIA
)
6917 int tr
= sh_media_register_for_return ();
6920 emit_move_insn (gen_rtx_REG (DImode
, tr
),
6921 gen_rtx_REG (DImode
, PR_MEDIA_REG
));
6924 /* Emit the code for SETUP_VARARGS. */
6927 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl
))
6929 /* Push arg regs as if they'd been provided by caller in stack. */
6930 for (i
= 0; i
< NPARM_REGS(SImode
); i
++)
6932 int rn
= NPARM_REGS(SImode
) + FIRST_PARM_REG
- i
- 1;
6934 if (i
>= (NPARM_REGS(SImode
)
6935 - crtl
->args
.info
.arg_count
[(int) SH_ARG_INT
]
6939 stack_usage
+= GET_MODE_SIZE (SImode
);
6944 /* If we're supposed to switch stacks at function entry, do so now. */
6948 /* The argument specifies a variable holding the address of the
6949 stack the interrupt function should switch to/from at entry/exit. */
6950 tree arg
= TREE_VALUE ( TREE_VALUE (sp_switch_attr
));
6952 = ggc_strdup (TREE_STRING_POINTER (arg
));
6953 rtx sp_switch
= gen_rtx_SYMBOL_REF (Pmode
, s
);
6955 lab
= add_constant (sp_switch
, SImode
, 0);
6956 newsrc
= gen_rtx_LABEL_REF (VOIDmode
, lab
);
6957 newsrc
= gen_const_mem (SImode
, newsrc
);
6959 emit_insn (gen_sp_switch_1 (newsrc
));
6962 d
= calc_live_regs (&live_regs_mask
);
6963 /* ??? Maybe we could save some switching if we can move a mode switch
6964 that already happens to be at the function start into the prologue. */
6965 if (target_flags
!= save_flags
&& ! current_function_interrupt
)
6966 emit_insn (gen_toggle_sz ());
6970 int offset_base
, offset
;
6972 int offset_in_r0
= -1;
6974 int tregs_space
= shmedia_target_regs_stack_adjust (&live_regs_mask
);
6975 int total_size
, save_size
;
6976 save_schedule schedule
;
6980 if (call_really_used_regs
[R0_REG
] && ! fixed_regs
[R0_REG
]
6981 && ! current_function_interrupt
)
6982 r0
= gen_rtx_REG (Pmode
, R0_REG
);
6984 /* D is the actual number of bytes that we need for saving registers,
6985 however, in initial_elimination_offset we have committed to using
6986 an additional TREGS_SPACE amount of bytes - in order to keep both
6987 addresses to arguments supplied by the caller and local variables
6988 valid, we must keep this gap. Place it between the incoming
6989 arguments and the actually saved registers in a bid to optimize
6990 locality of reference. */
6991 total_size
= d
+ tregs_space
;
6992 total_size
+= rounded_frame_size (total_size
);
6993 save_size
= total_size
- rounded_frame_size (d
);
6994 if (save_size
% (STACK_BOUNDARY
/ BITS_PER_UNIT
))
6995 d_rounding
= ((STACK_BOUNDARY
/ BITS_PER_UNIT
)
6996 - save_size
% (STACK_BOUNDARY
/ BITS_PER_UNIT
));
6998 /* If adjusting the stack in a single step costs nothing extra, do so.
6999 I.e. either if a single addi is enough, or we need a movi anyway,
7000 and we don't exceed the maximum offset range (the test for the
7001 latter is conservative for simplicity). */
7003 && (CONST_OK_FOR_I10 (-total_size
)
7004 || (! CONST_OK_FOR_I10 (-(save_size
+ d_rounding
))
7005 && total_size
<= 2044)))
7006 d_rounding
= total_size
- save_size
;
7008 offset_base
= d
+ d_rounding
;
7010 output_stack_adjust (-(save_size
+ d_rounding
), stack_pointer_rtx
,
7012 stack_usage
+= save_size
+ d_rounding
;
7014 sh5_schedule_saves (&live_regs_mask
, &schedule
, offset_base
);
7015 tmp_pnt
= schedule
.temps
;
7016 for (entry
= &schedule
.entries
[1]; entry
->mode
!= VOIDmode
; entry
++)
7018 enum machine_mode mode
= (enum machine_mode
) entry
->mode
;
7019 unsigned int reg
= entry
->reg
;
7020 rtx reg_rtx
, mem_rtx
, pre_dec
= NULL_RTX
;
7023 offset
= entry
->offset
;
7025 reg_rtx
= gen_rtx_REG (mode
, reg
);
7027 mem_rtx
= gen_frame_mem (mode
,
7028 gen_rtx_PLUS (Pmode
,
7032 if (!memory_address_p (mode
, XEXP (mem_rtx
, 0)))
7038 if (HAVE_PRE_DECREMENT
7039 && (offset_in_r0
- offset
== GET_MODE_SIZE (mode
)
7040 || mem_rtx
== NULL_RTX
7041 || reg
== PR_REG
|| SPECIAL_REGISTER_P (reg
)))
7043 pre_dec
= gen_frame_mem (mode
, gen_rtx_PRE_DEC (Pmode
, r0
));
7045 if (!memory_address_p (mode
, XEXP (pre_dec
, 0)))
7050 offset
+= GET_MODE_SIZE (mode
);
7054 if (mem_rtx
!= NULL_RTX
)
7057 if (offset_in_r0
== -1)
7059 emit_move_insn (r0
, GEN_INT (offset
));
7060 offset_in_r0
= offset
;
7062 else if (offset
!= offset_in_r0
)
7067 GEN_INT (offset
- offset_in_r0
)));
7068 offset_in_r0
+= offset
- offset_in_r0
;
7071 if (pre_dec
!= NULL_RTX
)
7077 (Pmode
, r0
, stack_pointer_rtx
));
7081 offset
-= GET_MODE_SIZE (mode
);
7082 offset_in_r0
-= GET_MODE_SIZE (mode
);
7087 mem_rtx
= gen_frame_mem (mode
, r0
);
7089 mem_rtx
= gen_frame_mem (mode
,
7090 gen_rtx_PLUS (Pmode
,
7094 /* We must not use an r0-based address for target-branch
7095 registers or for special registers without pre-dec
7096 memory addresses, since we store their values in r0
7098 gcc_assert (!TARGET_REGISTER_P (reg
)
7099 && ((reg
!= PR_REG
&& !SPECIAL_REGISTER_P (reg
))
7100 || mem_rtx
== pre_dec
));
7103 orig_reg_rtx
= reg_rtx
;
7104 if (TARGET_REGISTER_P (reg
)
7105 || ((reg
== PR_REG
|| SPECIAL_REGISTER_P (reg
))
7106 && mem_rtx
!= pre_dec
))
7108 rtx tmp_reg
= gen_rtx_REG (GET_MODE (reg_rtx
), *tmp_pnt
);
7110 emit_move_insn (tmp_reg
, reg_rtx
);
7112 if (REGNO (tmp_reg
) == R0_REG
)
7116 gcc_assert (!refers_to_regno_p
7117 (R0_REG
, R0_REG
+1, mem_rtx
, (rtx
*) 0));
7120 if (*++tmp_pnt
<= 0)
7121 tmp_pnt
= schedule
.temps
;
7128 /* Mark as interesting for dwarf cfi generator */
7129 insn
= emit_move_insn (mem_rtx
, reg_rtx
);
7130 RTX_FRAME_RELATED_P (insn
) = 1;
7131 /* If we use an intermediate register for the save, we can't
7132 describe this exactly in cfi as a copy of the to-be-saved
7133 register into the temporary register and then the temporary
7134 register on the stack, because the temporary register can
7135 have a different natural size than the to-be-saved register.
7136 Thus, we gloss over the intermediate copy and pretend we do
7137 a direct save from the to-be-saved register. */
7138 if (REGNO (reg_rtx
) != reg
)
7142 set
= gen_rtx_SET (VOIDmode
, mem_rtx
, orig_reg_rtx
);
7143 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, set
);
7146 if (TARGET_SHCOMPACT
&& (offset_in_r0
!= -1))
7148 rtx reg_rtx
= gen_rtx_REG (mode
, reg
);
7150 rtx mem_rtx
= gen_frame_mem (mode
,
7151 gen_rtx_PLUS (Pmode
,
7155 set
= gen_rtx_SET (VOIDmode
, mem_rtx
, reg_rtx
);
7156 add_reg_note (insn
, REG_FRAME_RELATED_EXPR
, set
);
7161 gcc_assert (entry
->offset
== d_rounding
);
7165 push_regs (&live_regs_mask
, current_function_interrupt
);
7169 if (flag_pic
&& df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM
))
7170 emit_insn (gen_GOTaddr2picreg ());
7172 if (SHMEDIA_REGS_STACK_ADJUST ())
7174 /* This must NOT go through the PLT, otherwise mach and macl
7175 may be clobbered. */
7176 function_symbol (gen_rtx_REG (Pmode
, R0_REG
),
7178 ? "__GCC_push_shmedia_regs"
7179 : "__GCC_push_shmedia_regs_nofpu"), SFUNC_GOT
);
7180 emit_insn (gen_shmedia_save_restore_regs_compact
7181 (GEN_INT (-SHMEDIA_REGS_STACK_ADJUST ())));
7184 if (target_flags
!= save_flags
&& ! current_function_interrupt
)
7185 emit_insn (gen_toggle_sz ());
7187 target_flags
= save_flags
;
7189 output_stack_adjust (-rounded_frame_size (d
) + d_rounding
,
7190 stack_pointer_rtx
, 0, NULL
, true);
7191 stack_usage
+= rounded_frame_size (d
) - d_rounding
;
7193 if (frame_pointer_needed
)
7194 frame_insn (GEN_MOV (hard_frame_pointer_rtx
, stack_pointer_rtx
));
7196 if (TARGET_SHCOMPACT
7197 && (crtl
->args
.info
.call_cookie
& ~ CALL_COOKIE_RET_TRAMP(1)))
7199 /* This must NOT go through the PLT, otherwise mach and macl
7200 may be clobbered. */
7201 function_symbol (gen_rtx_REG (Pmode
, R0_REG
),
7202 "__GCC_shcompact_incoming_args", SFUNC_GOT
);
7203 emit_insn (gen_shcompact_incoming_args ());
7206 if (flag_stack_usage
)
7207 current_function_static_stack_size
= stack_usage
;
7211 sh_expand_epilogue (bool sibcall_p
)
7213 HARD_REG_SET live_regs_mask
;
7217 int save_flags
= target_flags
;
7218 int frame_size
, save_size
;
7219 int fpscr_deferred
= 0;
7220 int e
= sibcall_p
? -1 : 1;
7222 d
= calc_live_regs (&live_regs_mask
);
7225 frame_size
= rounded_frame_size (d
);
7229 int tregs_space
= shmedia_target_regs_stack_adjust (&live_regs_mask
);
7231 if (d
% (STACK_BOUNDARY
/ BITS_PER_UNIT
))
7232 d_rounding
= ((STACK_BOUNDARY
/ BITS_PER_UNIT
)
7233 - d
% (STACK_BOUNDARY
/ BITS_PER_UNIT
));
7235 total_size
= d
+ tregs_space
;
7236 total_size
+= rounded_frame_size (total_size
);
7237 save_size
= total_size
- frame_size
;
7239 /* If adjusting the stack in a single step costs nothing extra, do so.
7240 I.e. either if a single addi is enough, or we need a movi anyway,
7241 and we don't exceed the maximum offset range (the test for the
7242 latter is conservative for simplicity). */
7244 && ! frame_pointer_needed
7245 && (CONST_OK_FOR_I10 (total_size
)
7246 || (! CONST_OK_FOR_I10 (save_size
+ d_rounding
)
7247 && total_size
<= 2044)))
7248 d_rounding
= frame_size
;
7250 frame_size
-= d_rounding
;
7253 if (frame_pointer_needed
)
7255 /* We must avoid scheduling the epilogue with previous basic blocks.
7256 See PR/18032 and PR/40313. */
7257 emit_insn (gen_blockage ());
7258 output_stack_adjust (frame_size
, hard_frame_pointer_rtx
, e
,
7259 &live_regs_mask
, false);
7261 /* We must avoid moving the stack pointer adjustment past code
7262 which reads from the local frame, else an interrupt could
7263 occur after the SP adjustment and clobber data in the local
7265 emit_insn (gen_blockage ());
7266 emit_insn (GEN_MOV (stack_pointer_rtx
, hard_frame_pointer_rtx
));
7268 else if (frame_size
)
7270 /* We must avoid moving the stack pointer adjustment past code
7271 which reads from the local frame, else an interrupt could
7272 occur after the SP adjustment and clobber data in the local
7274 emit_insn (gen_blockage ());
7275 output_stack_adjust (frame_size
, stack_pointer_rtx
, e
,
7276 &live_regs_mask
, false);
7279 if (SHMEDIA_REGS_STACK_ADJUST ())
7281 function_symbol (gen_rtx_REG (Pmode
, R0_REG
),
7283 ? "__GCC_pop_shmedia_regs"
7284 : "__GCC_pop_shmedia_regs_nofpu"), SFUNC_GOT
);
7285 /* This must NOT go through the PLT, otherwise mach and macl
7286 may be clobbered. */
7287 emit_insn (gen_shmedia_save_restore_regs_compact
7288 (GEN_INT (SHMEDIA_REGS_STACK_ADJUST ())));
7291 /* Pop all the registers. */
7293 if (target_flags
!= save_flags
&& ! current_function_interrupt
)
7294 emit_insn (gen_toggle_sz ());
7297 int offset_base
, offset
;
7298 int offset_in_r0
= -1;
7300 rtx r0
= gen_rtx_REG (Pmode
, R0_REG
);
7301 save_schedule schedule
;
7305 entry
= sh5_schedule_saves (&live_regs_mask
, &schedule
, d_rounding
);
7306 offset_base
= -entry
[1].offset
+ d_rounding
;
7307 tmp_pnt
= schedule
.temps
;
7308 for (; entry
->mode
!= VOIDmode
; entry
--)
7310 enum machine_mode mode
= (enum machine_mode
) entry
->mode
;
7311 int reg
= entry
->reg
;
7312 rtx reg_rtx
, mem_rtx
, post_inc
= NULL_RTX
;
7314 offset
= offset_base
+ entry
->offset
;
7315 reg_rtx
= gen_rtx_REG (mode
, reg
);
7317 mem_rtx
= gen_frame_mem (mode
,
7318 gen_rtx_PLUS (Pmode
,
7322 if (!memory_address_p (mode
, XEXP (mem_rtx
, 0)))
7325 if (HAVE_POST_INCREMENT
7326 && (offset
== offset_in_r0
7327 || (offset
+ GET_MODE_SIZE (mode
) != d
+ d_rounding
7328 && mem_rtx
== NULL_RTX
)
7329 || reg
== PR_REG
|| SPECIAL_REGISTER_P (reg
)))
7331 post_inc
= gen_frame_mem (mode
, gen_rtx_POST_INC (Pmode
, r0
));
7333 if (!memory_address_p (mode
, XEXP (post_inc
, 0)))
7334 post_inc
= NULL_RTX
;
7339 if (mem_rtx
!= NULL_RTX
)
7342 if (offset_in_r0
== -1)
7344 emit_move_insn (r0
, GEN_INT (offset
));
7345 offset_in_r0
= offset
;
7347 else if (offset
!= offset_in_r0
)
7352 GEN_INT (offset
- offset_in_r0
)));
7353 offset_in_r0
+= offset
- offset_in_r0
;
7356 if (post_inc
!= NULL_RTX
)
7362 (Pmode
, r0
, stack_pointer_rtx
));
7368 offset_in_r0
+= GET_MODE_SIZE (mode
);
7371 mem_rtx
= gen_frame_mem (mode
, r0
);
7373 mem_rtx
= gen_frame_mem (mode
,
7374 gen_rtx_PLUS (Pmode
,
7378 gcc_assert ((reg
!= PR_REG
&& !SPECIAL_REGISTER_P (reg
))
7379 || mem_rtx
== post_inc
);
7382 if ((reg
== PR_REG
|| SPECIAL_REGISTER_P (reg
))
7383 && mem_rtx
!= post_inc
)
7385 emit_move_insn (r0
, mem_rtx
);
7388 else if (TARGET_REGISTER_P (reg
))
7390 rtx tmp_reg
= gen_rtx_REG (mode
, *tmp_pnt
);
7392 /* Give the scheduler a bit of freedom by using up to
7393 MAX_TEMPS registers in a round-robin fashion. */
7394 emit_move_insn (tmp_reg
, mem_rtx
);
7397 tmp_pnt
= schedule
.temps
;
7400 emit_move_insn (reg_rtx
, mem_rtx
);
7403 gcc_assert (entry
->offset
+ offset_base
== d
+ d_rounding
);
7405 else /* ! TARGET_SH5 */
7410 /* For an ISR with RESBANK attribute assigned, don't pop PR
7412 if (TEST_HARD_REG_BIT (live_regs_mask
, PR_REG
)
7413 && !sh_cfun_resbank_handler_p ())
7415 if (!frame_pointer_needed
)
7416 emit_insn (gen_blockage ());
7420 /* Banked registers are popped first to avoid being scheduled in the
7421 delay slot. RTE switches banks before the ds instruction. */
7422 if (current_function_interrupt
)
7424 bool use_movml
= false;
7428 unsigned int count
= 0;
7430 for (i
= FIRST_BANKED_REG
; i
<= LAST_BANKED_REG
; i
++)
7431 if (TEST_HARD_REG_BIT (live_regs_mask
, i
))
7436 /* Use movml when all banked register are poped. */
7437 if (count
== LAST_BANKED_REG
- FIRST_BANKED_REG
+ 1)
7443 rtx sp_reg
= gen_rtx_REG (SImode
, STACK_POINTER_REGNUM
);
7445 /* We must avoid scheduling multiple load insn with another
7447 emit_insn (gen_blockage ());
7448 emit_insn (gen_movml_pop_banked (sp_reg
));
7449 emit_insn (gen_blockage ());
7452 for (i
= LAST_BANKED_REG
; i
>= FIRST_BANKED_REG
; i
--)
7453 if (TEST_HARD_REG_BIT (live_regs_mask
, i
))
7456 last_reg
= FIRST_PSEUDO_REGISTER
- LAST_BANKED_REG
- 1;
7459 last_reg
= FIRST_PSEUDO_REGISTER
;
7461 for (i
= 0; i
< last_reg
; i
++)
7463 int j
= (FIRST_PSEUDO_REGISTER
- 1) - i
;
7465 if (j
== FPSCR_REG
&& current_function_interrupt
&& TARGET_FMOVD
7466 && hard_reg_set_intersect_p (live_regs_mask
,
7467 reg_class_contents
[DF_REGS
]))
7469 /* For an ISR with RESBANK attribute assigned, don't pop
7470 following registers, R0-R14, MACH, MACL and GBR. */
7471 else if (j
!= PR_REG
&& TEST_HARD_REG_BIT (live_regs_mask
, j
)
7472 && ! (sh_cfun_resbank_handler_p ()
7473 && ((j
>= FIRST_GENERAL_REG
7474 && j
< LAST_GENERAL_REG
)
7480 if (j
== FIRST_FP_REG
&& fpscr_deferred
)
7484 if (target_flags
!= save_flags
&& ! current_function_interrupt
)
7485 emit_insn (gen_toggle_sz ());
7486 target_flags
= save_flags
;
7488 output_stack_adjust (crtl
->args
.pretend_args_size
7489 + save_size
+ d_rounding
7490 + crtl
->args
.info
.stack_regs
* 8,
7491 stack_pointer_rtx
, e
, NULL
, false);
7493 if (crtl
->calls_eh_return
)
7494 emit_insn (GEN_ADD3 (stack_pointer_rtx
, stack_pointer_rtx
,
7495 EH_RETURN_STACKADJ_RTX
));
7497 /* Switch back to the normal stack if necessary. */
7498 if (lookup_attribute ("sp_switch", DECL_ATTRIBUTES (current_function_decl
)))
7499 emit_insn (gen_sp_switch_2 ());
7501 /* Tell flow the insn that pops PR isn't dead. */
7502 /* PR_REG will never be live in SHmedia mode, and we don't need to
7503 USE PR_MEDIA_REG, since it will be explicitly copied to TR0_REG
7504 by the return pattern. */
7505 if (TEST_HARD_REG_BIT (live_regs_mask
, PR_REG
))
7506 emit_use (gen_rtx_REG (SImode
, PR_REG
));
7509 static int sh_need_epilogue_known
= 0;
7512 sh_need_epilogue (void)
7514 if (! sh_need_epilogue_known
)
7519 sh_expand_epilogue (0);
7520 epilogue
= get_insns ();
7522 sh_need_epilogue_known
= (epilogue
== NULL
? -1 : 1);
7524 return sh_need_epilogue_known
> 0;
7527 /* Emit code to change the current function's return address to RA.
7528 TEMP is available as a scratch register, if needed. */
7531 sh_set_return_address (rtx ra
, rtx tmp
)
7533 HARD_REG_SET live_regs_mask
;
7535 int pr_reg
= TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
;
7538 d
= calc_live_regs (&live_regs_mask
);
7540 /* If pr_reg isn't life, we can set it (or the register given in
7541 sh_media_register_for_return) directly. */
7542 if (! TEST_HARD_REG_BIT (live_regs_mask
, pr_reg
))
7548 int rr_regno
= sh_media_register_for_return ();
7553 rr
= gen_rtx_REG (DImode
, rr_regno
);
7556 rr
= gen_rtx_REG (SImode
, pr_reg
);
7558 emit_insn (GEN_MOV (rr
, ra
));
7559 /* Tell flow the register for return isn't dead. */
7567 save_schedule schedule
;
7570 entry
= sh5_schedule_saves (&live_regs_mask
, &schedule
, 0);
7571 offset
= entry
[1].offset
;
7572 for (; entry
->mode
!= VOIDmode
; entry
--)
7573 if (entry
->reg
== pr_reg
)
7576 /* We can't find pr register. */
7580 offset
= entry
->offset
- offset
;
7581 pr_offset
= (rounded_frame_size (d
) + offset
7582 + SHMEDIA_REGS_STACK_ADJUST ());
7585 pr_offset
= rounded_frame_size (d
);
7587 emit_insn (GEN_MOV (tmp
, GEN_INT (pr_offset
)));
7589 if (frame_pointer_needed
)
7590 emit_insn (GEN_ADD3 (tmp
, tmp
, hard_frame_pointer_rtx
));
7592 emit_insn (GEN_ADD3 (tmp
, tmp
, stack_pointer_rtx
));
7594 tmp
= gen_frame_mem (Pmode
, tmp
);
7595 emit_insn (GEN_MOV (tmp
, ra
));
7596 /* Tell this store isn't dead. */
7600 /* Clear variables at function end. */
7603 sh_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED
,
7604 HOST_WIDE_INT size ATTRIBUTE_UNUSED
)
7606 sh_need_epilogue_known
= 0;
7610 sh_builtin_saveregs (void)
7612 /* First unnamed integer register. */
7613 int first_intreg
= crtl
->args
.info
.arg_count
[(int) SH_ARG_INT
];
7614 /* Number of integer registers we need to save. */
7615 int n_intregs
= MAX (0, NPARM_REGS (SImode
) - first_intreg
);
7616 /* First unnamed SFmode float reg */
7617 int first_floatreg
= crtl
->args
.info
.arg_count
[(int) SH_ARG_FLOAT
];
7618 /* Number of SFmode float regs to save. */
7619 int n_floatregs
= MAX (0, NPARM_REGS (SFmode
) - first_floatreg
);
7622 alias_set_type alias_set
;
7628 int pushregs
= n_intregs
;
7630 while (pushregs
< NPARM_REGS (SImode
) - 1
7631 && (CALL_COOKIE_INT_REG_GET
7632 (crtl
->args
.info
.call_cookie
,
7633 NPARM_REGS (SImode
) - pushregs
)
7636 crtl
->args
.info
.call_cookie
7637 &= ~ CALL_COOKIE_INT_REG (NPARM_REGS (SImode
)
7642 if (pushregs
== NPARM_REGS (SImode
))
7643 crtl
->args
.info
.call_cookie
7644 |= (CALL_COOKIE_INT_REG (0, 1)
7645 | CALL_COOKIE_STACKSEQ (pushregs
- 1));
7647 crtl
->args
.info
.call_cookie
7648 |= CALL_COOKIE_STACKSEQ (pushregs
);
7650 crtl
->args
.pretend_args_size
+= 8 * n_intregs
;
7652 if (TARGET_SHCOMPACT
)
7656 if (! TARGET_SH2E
&& ! TARGET_SH4
&& ! TARGET_SH5
)
7658 error ("__builtin_saveregs not supported by this subtarget");
7665 /* Allocate block of memory for the regs. */
7666 /* ??? If n_intregs + n_floatregs == 0, should we allocate at least 1 byte?
7667 Or can assign_stack_local accept a 0 SIZE argument? */
7668 bufsize
= (n_intregs
* UNITS_PER_WORD
) + (n_floatregs
* UNITS_PER_WORD
);
7671 regbuf
= gen_frame_mem (BLKmode
, gen_rtx_REG (Pmode
, ARG_POINTER_REGNUM
));
7672 else if (n_floatregs
& 1)
7676 regbuf
= assign_stack_local (BLKmode
, bufsize
+ UNITS_PER_WORD
, 0);
7677 addr
= copy_to_mode_reg (Pmode
, XEXP (regbuf
, 0));
7678 emit_insn (gen_iorsi3 (addr
, addr
, GEN_INT (UNITS_PER_WORD
)));
7679 regbuf
= change_address (regbuf
, BLKmode
, addr
);
7681 else if (STACK_BOUNDARY
< 64 && TARGET_FPU_DOUBLE
&& n_floatregs
)
7685 regbuf
= assign_stack_local (BLKmode
, bufsize
+ UNITS_PER_WORD
, 0);
7686 addr
= copy_to_mode_reg (Pmode
, plus_constant (XEXP (regbuf
, 0), 4));
7687 mask
= copy_to_mode_reg (Pmode
, GEN_INT (-8));
7688 emit_insn (gen_andsi3 (addr
, addr
, mask
));
7689 regbuf
= change_address (regbuf
, BLKmode
, addr
);
7692 regbuf
= assign_stack_local (BLKmode
, bufsize
, TARGET_FPU_DOUBLE
? 64 : 0);
7693 alias_set
= get_varargs_alias_set ();
7694 set_mem_alias_set (regbuf
, alias_set
);
7697 This is optimized to only save the regs that are necessary. Explicitly
7698 named args need not be saved. */
7700 move_block_from_reg (BASE_ARG_REG (SImode
) + first_intreg
,
7701 adjust_address (regbuf
, BLKmode
,
7702 n_floatregs
* UNITS_PER_WORD
),
7706 /* Return the address of the regbuf. */
7707 return XEXP (regbuf
, 0);
7710 This is optimized to only save the regs that are necessary. Explicitly
7711 named args need not be saved.
7712 We explicitly build a pointer to the buffer because it halves the insn
7713 count when not optimizing (otherwise the pointer is built for each reg
7715 We emit the moves in reverse order so that we can use predecrement. */
7717 fpregs
= copy_to_mode_reg (Pmode
,
7718 plus_constant (XEXP (regbuf
, 0),
7719 n_floatregs
* UNITS_PER_WORD
));
7720 if (TARGET_SH4
|| TARGET_SH2A_DOUBLE
)
7723 for (regno
= NPARM_REGS (DFmode
) - 2; regno
>= first_floatreg
; regno
-= 2)
7725 emit_insn (gen_addsi3 (fpregs
, fpregs
,
7726 GEN_INT (-2 * UNITS_PER_WORD
)));
7727 mem
= change_address (regbuf
, DFmode
, fpregs
);
7728 emit_move_insn (mem
,
7729 gen_rtx_REG (DFmode
, BASE_ARG_REG (DFmode
) + regno
));
7731 regno
= first_floatreg
;
7734 emit_insn (gen_addsi3 (fpregs
, fpregs
, GEN_INT (-UNITS_PER_WORD
)));
7735 mem
= change_address (regbuf
, SFmode
, fpregs
);
7736 emit_move_insn (mem
,
7737 gen_rtx_REG (SFmode
, BASE_ARG_REG (SFmode
) + regno
7738 - (TARGET_LITTLE_ENDIAN
!= 0)));
7742 for (regno
= NPARM_REGS (SFmode
) - 1; regno
>= first_floatreg
; regno
--)
7746 emit_insn (gen_addsi3 (fpregs
, fpregs
, GEN_INT (-UNITS_PER_WORD
)));
7747 mem
= change_address (regbuf
, SFmode
, fpregs
);
7748 emit_move_insn (mem
,
7749 gen_rtx_REG (SFmode
, BASE_ARG_REG (SFmode
) + regno
));
7752 /* Return the address of the regbuf. */
7753 return XEXP (regbuf
, 0);
7756 /* Define the `__builtin_va_list' type for the ABI. */
7759 sh_build_builtin_va_list (void)
7761 tree f_next_o
, f_next_o_limit
, f_next_fp
, f_next_fp_limit
, f_next_stack
;
7762 tree record
, type_decl
;
7764 if (TARGET_SH5
|| (! TARGET_SH2E
&& ! TARGET_SH4
)
7765 || TARGET_HITACHI
|| sh_cfun_attr_renesas_p ())
7766 return ptr_type_node
;
7768 record
= (*lang_hooks
.types
.make_type
) (RECORD_TYPE
);
7769 type_decl
= build_decl (BUILTINS_LOCATION
,
7770 TYPE_DECL
, get_identifier ("__va_list_tag"), record
);
7772 f_next_o
= build_decl (BUILTINS_LOCATION
,
7773 FIELD_DECL
, get_identifier ("__va_next_o"),
7775 f_next_o_limit
= build_decl (BUILTINS_LOCATION
,
7777 get_identifier ("__va_next_o_limit"),
7779 f_next_fp
= build_decl (BUILTINS_LOCATION
,
7780 FIELD_DECL
, get_identifier ("__va_next_fp"),
7782 f_next_fp_limit
= build_decl (BUILTINS_LOCATION
,
7784 get_identifier ("__va_next_fp_limit"),
7786 f_next_stack
= build_decl (BUILTINS_LOCATION
,
7787 FIELD_DECL
, get_identifier ("__va_next_stack"),
7790 DECL_FIELD_CONTEXT (f_next_o
) = record
;
7791 DECL_FIELD_CONTEXT (f_next_o_limit
) = record
;
7792 DECL_FIELD_CONTEXT (f_next_fp
) = record
;
7793 DECL_FIELD_CONTEXT (f_next_fp_limit
) = record
;
7794 DECL_FIELD_CONTEXT (f_next_stack
) = record
;
7796 TREE_CHAIN (record
) = type_decl
;
7797 TYPE_NAME (record
) = type_decl
;
7798 TYPE_FIELDS (record
) = f_next_o
;
7799 DECL_CHAIN (f_next_o
) = f_next_o_limit
;
7800 DECL_CHAIN (f_next_o_limit
) = f_next_fp
;
7801 DECL_CHAIN (f_next_fp
) = f_next_fp_limit
;
7802 DECL_CHAIN (f_next_fp_limit
) = f_next_stack
;
7804 layout_type (record
);
7809 /* Implement `va_start' for varargs and stdarg. */
7812 sh_va_start (tree valist
, rtx nextarg
)
7814 tree f_next_o
, f_next_o_limit
, f_next_fp
, f_next_fp_limit
, f_next_stack
;
7815 tree next_o
, next_o_limit
, next_fp
, next_fp_limit
, next_stack
;
7821 expand_builtin_saveregs ();
7822 std_expand_builtin_va_start (valist
, nextarg
);
7826 if ((! TARGET_SH2E
&& ! TARGET_SH4
)
7827 || TARGET_HITACHI
|| sh_cfun_attr_renesas_p ())
7829 std_expand_builtin_va_start (valist
, nextarg
);
7833 f_next_o
= TYPE_FIELDS (va_list_type_node
);
7834 f_next_o_limit
= DECL_CHAIN (f_next_o
);
7835 f_next_fp
= DECL_CHAIN (f_next_o_limit
);
7836 f_next_fp_limit
= DECL_CHAIN (f_next_fp
);
7837 f_next_stack
= DECL_CHAIN (f_next_fp_limit
);
7839 next_o
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_o
), valist
, f_next_o
,
7841 next_o_limit
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_o_limit
),
7842 valist
, f_next_o_limit
, NULL_TREE
);
7843 next_fp
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_fp
), valist
, f_next_fp
,
7845 next_fp_limit
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_fp_limit
),
7846 valist
, f_next_fp_limit
, NULL_TREE
);
7847 next_stack
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_stack
),
7848 valist
, f_next_stack
, NULL_TREE
);
7850 /* Call __builtin_saveregs. */
7851 u
= make_tree (sizetype
, expand_builtin_saveregs ());
7852 u
= fold_convert (ptr_type_node
, u
);
7853 t
= build2 (MODIFY_EXPR
, ptr_type_node
, next_fp
, u
);
7854 TREE_SIDE_EFFECTS (t
) = 1;
7855 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
7857 nfp
= crtl
->args
.info
.arg_count
[SH_ARG_FLOAT
];
7862 u
= fold_build2 (POINTER_PLUS_EXPR
, ptr_type_node
, u
,
7863 size_int (UNITS_PER_WORD
* nfp
));
7864 t
= build2 (MODIFY_EXPR
, ptr_type_node
, next_fp_limit
, u
);
7865 TREE_SIDE_EFFECTS (t
) = 1;
7866 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
7868 t
= build2 (MODIFY_EXPR
, ptr_type_node
, next_o
, u
);
7869 TREE_SIDE_EFFECTS (t
) = 1;
7870 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
7872 nint
= crtl
->args
.info
.arg_count
[SH_ARG_INT
];
7877 u
= fold_build2 (POINTER_PLUS_EXPR
, ptr_type_node
, u
,
7878 size_int (UNITS_PER_WORD
* nint
));
7879 t
= build2 (MODIFY_EXPR
, ptr_type_node
, next_o_limit
, u
);
7880 TREE_SIDE_EFFECTS (t
) = 1;
7881 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
7883 u
= make_tree (ptr_type_node
, nextarg
);
7884 t
= build2 (MODIFY_EXPR
, ptr_type_node
, next_stack
, u
);
7885 TREE_SIDE_EFFECTS (t
) = 1;
7886 expand_expr (t
, const0_rtx
, VOIDmode
, EXPAND_NORMAL
);
7889 /* TYPE is a RECORD_TYPE. If there is only a single nonzero-sized
7890 member, return it. */
7892 find_sole_member (tree type
)
7894 tree field
, member
= NULL_TREE
;
7896 for (field
= TYPE_FIELDS (type
); field
; field
= DECL_CHAIN (field
))
7898 if (TREE_CODE (field
) != FIELD_DECL
)
7900 if (!DECL_SIZE (field
))
7902 if (integer_zerop (DECL_SIZE (field
)))
7910 /* Implement `va_arg'. */
7913 sh_gimplify_va_arg_expr (tree valist
, tree type
, gimple_seq
*pre_p
,
7914 gimple_seq
*post_p ATTRIBUTE_UNUSED
)
7916 HOST_WIDE_INT size
, rsize
;
7917 tree tmp
, pptr_type_node
;
7918 tree addr
, lab_over
= NULL
, result
= NULL
;
7919 int pass_by_ref
= targetm
.calls
.must_pass_in_stack (TYPE_MODE (type
), type
);
7923 type
= build_pointer_type (type
);
7925 size
= int_size_in_bytes (type
);
7926 rsize
= (size
+ UNITS_PER_WORD
- 1) & -UNITS_PER_WORD
;
7927 pptr_type_node
= build_pointer_type (ptr_type_node
);
7929 if (! TARGET_SH5
&& (TARGET_SH2E
|| TARGET_SH4
)
7930 && ! (TARGET_HITACHI
|| sh_cfun_attr_renesas_p ()))
7932 tree f_next_o
, f_next_o_limit
, f_next_fp
, f_next_fp_limit
, f_next_stack
;
7933 tree next_o
, next_o_limit
, next_fp
, next_fp_limit
, next_stack
;
7938 f_next_o
= TYPE_FIELDS (va_list_type_node
);
7939 f_next_o_limit
= DECL_CHAIN (f_next_o
);
7940 f_next_fp
= DECL_CHAIN (f_next_o_limit
);
7941 f_next_fp_limit
= DECL_CHAIN (f_next_fp
);
7942 f_next_stack
= DECL_CHAIN (f_next_fp_limit
);
7944 next_o
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_o
), valist
, f_next_o
,
7946 next_o_limit
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_o_limit
),
7947 valist
, f_next_o_limit
, NULL_TREE
);
7948 next_fp
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_fp
),
7949 valist
, f_next_fp
, NULL_TREE
);
7950 next_fp_limit
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_fp_limit
),
7951 valist
, f_next_fp_limit
, NULL_TREE
);
7952 next_stack
= build3 (COMPONENT_REF
, TREE_TYPE (f_next_stack
),
7953 valist
, f_next_stack
, NULL_TREE
);
7955 /* Structures with a single member with a distinct mode are passed
7956 like their member. This is relevant if the latter has a REAL_TYPE
7957 or COMPLEX_TYPE type. */
7959 while (TREE_CODE (eff_type
) == RECORD_TYPE
7960 && (member
= find_sole_member (eff_type
))
7961 && (TREE_CODE (TREE_TYPE (member
)) == REAL_TYPE
7962 || TREE_CODE (TREE_TYPE (member
)) == COMPLEX_TYPE
7963 || TREE_CODE (TREE_TYPE (member
)) == RECORD_TYPE
))
7965 tree field_type
= TREE_TYPE (member
);
7967 if (TYPE_MODE (eff_type
) == TYPE_MODE (field_type
))
7968 eff_type
= field_type
;
7971 gcc_assert ((TYPE_ALIGN (eff_type
)
7972 < GET_MODE_ALIGNMENT (TYPE_MODE (field_type
)))
7973 || (TYPE_ALIGN (eff_type
)
7974 > GET_MODE_BITSIZE (TYPE_MODE (field_type
))));
7979 if (TARGET_SH4
|| TARGET_SH2A_DOUBLE
)
7981 pass_as_float
= ((TREE_CODE (eff_type
) == REAL_TYPE
&& size
<= 8)
7982 || (TREE_CODE (eff_type
) == COMPLEX_TYPE
7983 && TREE_CODE (TREE_TYPE (eff_type
)) == REAL_TYPE
7988 pass_as_float
= (TREE_CODE (eff_type
) == REAL_TYPE
&& size
== 4);
7991 addr
= create_tmp_var (pptr_type_node
, NULL
);
7992 lab_false
= create_artificial_label (UNKNOWN_LOCATION
);
7993 lab_over
= create_artificial_label (UNKNOWN_LOCATION
);
7995 valist
= build_simple_mem_ref (addr
);
7999 tree next_fp_tmp
= create_tmp_var (TREE_TYPE (f_next_fp
), NULL
);
8001 bool is_double
= size
== 8 && TREE_CODE (eff_type
) == REAL_TYPE
;
8003 tmp
= build1 (ADDR_EXPR
, pptr_type_node
, unshare_expr (next_fp
));
8004 gimplify_assign (unshare_expr (addr
), tmp
, pre_p
);
8006 gimplify_assign (unshare_expr (next_fp_tmp
), valist
, pre_p
);
8007 tmp
= next_fp_limit
;
8008 if (size
> 4 && !is_double
)
8009 tmp
= build2 (POINTER_PLUS_EXPR
, TREE_TYPE (tmp
),
8010 unshare_expr (tmp
), size_int (4 - size
));
8011 tmp
= build2 (GE_EXPR
, boolean_type_node
,
8012 unshare_expr (next_fp_tmp
), unshare_expr (tmp
));
8013 cmp
= build3 (COND_EXPR
, void_type_node
, tmp
,
8014 build1 (GOTO_EXPR
, void_type_node
,
8015 unshare_expr (lab_false
)), NULL_TREE
);
8017 gimplify_and_add (cmp
, pre_p
);
8019 if (TYPE_ALIGN (eff_type
) > BITS_PER_WORD
8020 || (is_double
|| size
== 16))
8022 tmp
= fold_convert (sizetype
, next_fp_tmp
);
8023 tmp
= build2 (BIT_AND_EXPR
, sizetype
, tmp
,
8024 size_int (UNITS_PER_WORD
));
8025 tmp
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
,
8026 unshare_expr (next_fp_tmp
), tmp
);
8027 gimplify_assign (unshare_expr (next_fp_tmp
), tmp
, pre_p
);
8030 gimplify_and_add (cmp
, pre_p
);
8032 #ifdef FUNCTION_ARG_SCmode_WART
8033 if (TYPE_MODE (eff_type
) == SCmode
8034 && TARGET_SH4
&& TARGET_LITTLE_ENDIAN
)
8036 tree subtype
= TREE_TYPE (eff_type
);
8040 = std_gimplify_va_arg_expr (next_fp_tmp
, subtype
, pre_p
, NULL
);
8041 imag
= get_initialized_tmp_var (imag
, pre_p
, NULL
);
8044 = std_gimplify_va_arg_expr (next_fp_tmp
, subtype
, pre_p
, NULL
);
8045 real
= get_initialized_tmp_var (real
, pre_p
, NULL
);
8047 result
= build2 (COMPLEX_EXPR
, eff_type
, real
, imag
);
8048 if (type
!= eff_type
)
8049 result
= build1 (VIEW_CONVERT_EXPR
, type
, result
);
8050 result
= get_initialized_tmp_var (result
, pre_p
, NULL
);
8052 #endif /* FUNCTION_ARG_SCmode_WART */
8054 tmp
= build1 (GOTO_EXPR
, void_type_node
, unshare_expr (lab_over
));
8055 gimplify_and_add (tmp
, pre_p
);
8057 tmp
= build1 (LABEL_EXPR
, void_type_node
, unshare_expr (lab_false
));
8058 gimplify_and_add (tmp
, pre_p
);
8060 tmp
= build1 (ADDR_EXPR
, pptr_type_node
, unshare_expr (next_stack
));
8061 gimplify_assign (unshare_expr (addr
), tmp
, pre_p
);
8062 gimplify_assign (unshare_expr (next_fp_tmp
),
8063 unshare_expr (valist
), pre_p
);
8065 gimplify_assign (unshare_expr (valist
),
8066 unshare_expr (next_fp_tmp
), post_p
);
8067 valist
= next_fp_tmp
;
8071 tmp
= build2 (POINTER_PLUS_EXPR
, ptr_type_node
,
8072 unshare_expr (next_o
), size_int (rsize
));
8073 tmp
= build2 (GT_EXPR
, boolean_type_node
, tmp
,
8074 unshare_expr (next_o_limit
));
8075 tmp
= build3 (COND_EXPR
, void_type_node
, tmp
,
8076 build1 (GOTO_EXPR
, void_type_node
,
8077 unshare_expr (lab_false
)),
8079 gimplify_and_add (tmp
, pre_p
);
8081 tmp
= build1 (ADDR_EXPR
, pptr_type_node
, unshare_expr (next_o
));
8082 gimplify_assign (unshare_expr (addr
), tmp
, pre_p
);
8084 tmp
= build1 (GOTO_EXPR
, void_type_node
, unshare_expr (lab_over
));
8085 gimplify_and_add (tmp
, pre_p
);
8087 tmp
= build1 (LABEL_EXPR
, void_type_node
, unshare_expr (lab_false
));
8088 gimplify_and_add (tmp
, pre_p
);
8090 if (size
> 4 && ! (TARGET_SH4
|| TARGET_SH2A
))
8091 gimplify_assign (unshare_expr (next_o
),
8092 unshare_expr (next_o_limit
), pre_p
);
8094 tmp
= build1 (ADDR_EXPR
, pptr_type_node
, unshare_expr (next_stack
));
8095 gimplify_assign (unshare_expr (addr
), tmp
, pre_p
);
8100 tmp
= build1 (LABEL_EXPR
, void_type_node
, unshare_expr (lab_over
));
8101 gimplify_and_add (tmp
, pre_p
);
8105 /* ??? In va-sh.h, there had been code to make values larger than
8106 size 8 indirect. This does not match the FUNCTION_ARG macros. */
8108 tmp
= std_gimplify_va_arg_expr (valist
, type
, pre_p
, NULL
);
8111 gimplify_assign (result
, tmp
, pre_p
);
8112 result
= build1 (NOP_EXPR
, TREE_TYPE (result
), result
);
8113 tmp
= build1 (LABEL_EXPR
, void_type_node
, unshare_expr (lab_over
));
8114 gimplify_and_add (tmp
, pre_p
);
8120 result
= build_va_arg_indirect_ref (result
);
8125 /* 64 bit floating points memory transfers are paired single precision loads
8126 or store. So DWARF information needs fixing in little endian (unless
8127 PR=SZ=1 in FPSCR). */
8129 sh_dwarf_register_span (rtx reg
)
8131 unsigned regno
= REGNO (reg
);
8133 if (WORDS_BIG_ENDIAN
|| GET_MODE (reg
) != DFmode
)
8137 gen_rtx_PARALLEL (VOIDmode
,
8139 gen_rtx_REG (SFmode
,
8140 DBX_REGISTER_NUMBER (regno
+1)),
8141 gen_rtx_REG (SFmode
,
8142 DBX_REGISTER_NUMBER (regno
))));
8145 static enum machine_mode
8146 sh_promote_function_mode (const_tree type
, enum machine_mode mode
,
8147 int *punsignedp
, const_tree funtype
,
8148 int for_return ATTRIBUTE_UNUSED
)
8150 if (sh_promote_prototypes (funtype
))
8151 return promote_mode (type
, mode
, punsignedp
);
8157 sh_promote_prototypes (const_tree type
)
8163 return ! sh_attr_renesas_p (type
);
8166 /* Whether an argument must be passed by reference. On SHcompact, we
8167 pretend arguments wider than 32-bits that would have been passed in
8168 registers are passed by reference, so that an SHmedia trampoline
8169 loads them into the full 64-bits registers. */
8172 shcompact_byref (const CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8173 const_tree type
, bool named
)
8175 unsigned HOST_WIDE_INT size
;
8178 size
= int_size_in_bytes (type
);
8180 size
= GET_MODE_SIZE (mode
);
8182 if (cum
->arg_count
[SH_ARG_INT
] < NPARM_REGS (SImode
)
8184 || GET_SH_ARG_CLASS (mode
) == SH_ARG_INT
8185 || (GET_SH_ARG_CLASS (mode
) == SH_ARG_FLOAT
8186 && cum
->arg_count
[SH_ARG_FLOAT
] >= NPARM_REGS (SFmode
)))
8188 && !SHCOMPACT_FORCE_ON_STACK (mode
, type
)
8189 && !SH5_WOULD_BE_PARTIAL_NREGS (*cum
, mode
, type
, named
))
8196 sh_pass_by_reference (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8197 const_tree type
, bool named
)
8199 if (targetm
.calls
.must_pass_in_stack (mode
, type
))
8202 /* ??? std_gimplify_va_arg_expr passes NULL for cum. That function
8203 wants to know about pass-by-reference semantics for incoming
8208 if (TARGET_SHCOMPACT
)
8210 cum
->byref
= shcompact_byref (cum
, mode
, type
, named
);
8211 return cum
->byref
!= 0;
8218 sh_callee_copies (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8219 const_tree type
, bool named ATTRIBUTE_UNUSED
)
8221 /* ??? How can it possibly be correct to return true only on the
8222 caller side of the equation? Is there someplace else in the
8223 sh backend that's magically producing the copies? */
8224 return (cum
->outgoing
8225 && ((mode
== BLKmode
? TYPE_ALIGN (type
) : GET_MODE_ALIGNMENT (mode
))
8226 % SH_MIN_ALIGN_FOR_CALLEE_COPY
== 0));
8230 sh_arg_partial_bytes (CUMULATIVE_ARGS
*cum
, enum machine_mode mode
,
8231 tree type
, bool named ATTRIBUTE_UNUSED
)
8236 && PASS_IN_REG_P (*cum
, mode
, type
)
8237 && !(TARGET_SH4
|| TARGET_SH2A_DOUBLE
)
8238 && (ROUND_REG (*cum
, mode
)
8240 ? ROUND_ADVANCE (GET_MODE_SIZE (mode
))
8241 : ROUND_ADVANCE (int_size_in_bytes (type
)))
8242 > NPARM_REGS (mode
)))
8243 words
= NPARM_REGS (mode
) - ROUND_REG (*cum
, mode
);
8245 else if (!TARGET_SHCOMPACT
8246 && SH5_WOULD_BE_PARTIAL_NREGS (*cum
, mode
, type
, named
))
8247 words
= NPARM_REGS (SImode
) - cum
->arg_count
[SH_ARG_INT
];
8249 return words
* UNITS_PER_WORD
;
8253 /* Define where to put the arguments to a function.
8254 Value is zero to push the argument on the stack,
8255 or a hard register in which to store the argument.
8257 MODE is the argument's machine mode.
8258 TYPE is the data type of the argument (as a tree).
8259 This is null for libcalls where that information may
8261 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8262 the preceding args and about the function being called.
8263 NAMED is nonzero if this argument is a named parameter
8264 (otherwise it is an extra parameter matching an ellipsis).
8266 On SH the first args are normally in registers
8267 and the rest are pushed. Any arg that starts within the first
8268 NPARM_REGS words is at least partially passed in a register unless
8269 its data type forbids. */
8272 sh_function_arg (CUMULATIVE_ARGS
*ca
, enum machine_mode mode
,
8273 const_tree type
, bool named
)
8275 if (! TARGET_SH5
&& mode
== VOIDmode
)
8276 return GEN_INT (ca
->renesas_abi
? 1 : 0);
8279 && PASS_IN_REG_P (*ca
, mode
, type
)
8280 && (named
|| ! (TARGET_HITACHI
|| ca
->renesas_abi
)))
8284 if (mode
== SCmode
&& TARGET_SH4
&& TARGET_LITTLE_ENDIAN
8285 && (! FUNCTION_ARG_SCmode_WART
|| (ROUND_REG (*ca
, mode
) & 1)))
8287 rtx r1
= gen_rtx_EXPR_LIST (VOIDmode
,
8288 gen_rtx_REG (SFmode
,
8290 + (ROUND_REG (*ca
, mode
) ^ 1)),
8292 rtx r2
= gen_rtx_EXPR_LIST (VOIDmode
,
8293 gen_rtx_REG (SFmode
,
8295 + ((ROUND_REG (*ca
, mode
) + 1) ^ 1)),
8297 return gen_rtx_PARALLEL(SCmode
, gen_rtvec(2, r1
, r2
));
8300 /* If the alignment of a DF value causes an SF register to be
8301 skipped, we will use that skipped register for the next SF
8303 if ((TARGET_HITACHI
|| ca
->renesas_abi
)
8304 && ca
->free_single_fp_reg
8306 return gen_rtx_REG (mode
, ca
->free_single_fp_reg
);
8308 regno
= (BASE_ARG_REG (mode
) + ROUND_REG (*ca
, mode
))
8309 ^ (mode
== SFmode
&& TARGET_SH4
8310 && TARGET_LITTLE_ENDIAN
!= 0
8311 && ! TARGET_HITACHI
&& ! ca
->renesas_abi
);
8312 return gen_rtx_REG (mode
, regno
);
8318 if (mode
== VOIDmode
&& TARGET_SHCOMPACT
)
8319 return GEN_INT (ca
->call_cookie
);
8321 /* The following test assumes unnamed arguments are promoted to
8323 if (mode
== SFmode
&& ca
->free_single_fp_reg
)
8324 return SH5_PROTOTYPED_FLOAT_ARG (*ca
, mode
, ca
->free_single_fp_reg
);
8326 if ((GET_SH_ARG_CLASS (mode
) == SH_ARG_FLOAT
)
8327 && (named
|| ! ca
->prototype_p
)
8328 && ca
->arg_count
[(int) SH_ARG_FLOAT
] < NPARM_REGS (SFmode
))
8330 if (! ca
->prototype_p
&& TARGET_SHMEDIA
)
8331 return SH5_PROTOTYPELESS_FLOAT_ARG (*ca
, mode
);
8333 return SH5_PROTOTYPED_FLOAT_ARG (*ca
, mode
,
8335 + ca
->arg_count
[(int) SH_ARG_FLOAT
]);
8338 if (ca
->arg_count
[(int) SH_ARG_INT
] < NPARM_REGS (SImode
)
8339 && (! TARGET_SHCOMPACT
8340 || (! SHCOMPACT_FORCE_ON_STACK (mode
, type
)
8341 && ! SH5_WOULD_BE_PARTIAL_NREGS (*ca
, mode
,
8344 return gen_rtx_REG (mode
, (FIRST_PARM_REG
8345 + ca
->arg_count
[(int) SH_ARG_INT
]));
8354 /* Update the data in CUM to advance over an argument
8355 of mode MODE and data type TYPE.
8356 (TYPE is null for libcalls where that information may not be
8360 sh_function_arg_advance (CUMULATIVE_ARGS
*ca
, enum machine_mode mode
,
8361 const_tree type
, bool named
)
8365 else if (TARGET_SH5
)
8367 const_tree type2
= (ca
->byref
&& type
8370 enum machine_mode mode2
= (ca
->byref
&& type
8373 int dwords
= ((ca
->byref
8376 ? int_size_in_bytes (type2
)
8377 : GET_MODE_SIZE (mode2
)) + 7) / 8;
8378 int numregs
= MIN (dwords
, NPARM_REGS (SImode
)
8379 - ca
->arg_count
[(int) SH_ARG_INT
]);
8383 ca
->arg_count
[(int) SH_ARG_INT
] += numregs
;
8384 if (TARGET_SHCOMPACT
8385 && SHCOMPACT_FORCE_ON_STACK (mode2
, type2
))
8388 |= CALL_COOKIE_INT_REG (ca
->arg_count
[(int) SH_ARG_INT
]
8390 /* N.B. We want this also for outgoing. */
8391 ca
->stack_regs
+= numregs
;
8396 ca
->stack_regs
+= numregs
;
8397 ca
->byref_regs
+= numregs
;
8401 |= CALL_COOKIE_INT_REG (ca
->arg_count
[(int) SH_ARG_INT
]
8405 |= CALL_COOKIE_INT_REG (ca
->arg_count
[(int) SH_ARG_INT
]
8408 else if (dwords
> numregs
)
8410 int pushregs
= numregs
;
8412 if (TARGET_SHCOMPACT
)
8413 ca
->stack_regs
+= numregs
;
8414 while (pushregs
< NPARM_REGS (SImode
) - 1
8415 && (CALL_COOKIE_INT_REG_GET
8417 NPARM_REGS (SImode
) - pushregs
)
8421 &= ~ CALL_COOKIE_INT_REG (NPARM_REGS (SImode
)
8425 if (numregs
== NPARM_REGS (SImode
))
8427 |= CALL_COOKIE_INT_REG (0, 1)
8428 | CALL_COOKIE_STACKSEQ (numregs
- 1);
8431 |= CALL_COOKIE_STACKSEQ (numregs
);
8434 if (GET_SH_ARG_CLASS (mode2
) == SH_ARG_FLOAT
8435 && (named
|| ! ca
->prototype_p
))
8437 if (mode2
== SFmode
&& ca
->free_single_fp_reg
)
8438 ca
->free_single_fp_reg
= 0;
8439 else if (ca
->arg_count
[(int) SH_ARG_FLOAT
]
8440 < NPARM_REGS (SFmode
))
8443 = MIN ((GET_MODE_SIZE (mode2
) + 7) / 8 * 2,
8445 - ca
->arg_count
[(int) SH_ARG_FLOAT
]);
8447 ca
->arg_count
[(int) SH_ARG_FLOAT
] += numfpregs
;
8449 if (TARGET_SHCOMPACT
&& ! ca
->prototype_p
)
8451 if (ca
->outgoing
&& numregs
> 0)
8455 |= (CALL_COOKIE_INT_REG
8456 (ca
->arg_count
[(int) SH_ARG_INT
]
8457 - numregs
+ ((numfpregs
- 2) / 2),
8458 4 + (ca
->arg_count
[(int) SH_ARG_FLOAT
]
8461 while (numfpregs
-= 2);
8463 else if (mode2
== SFmode
&& (named
)
8464 && (ca
->arg_count
[(int) SH_ARG_FLOAT
]
8465 < NPARM_REGS (SFmode
)))
8466 ca
->free_single_fp_reg
8467 = FIRST_FP_PARM_REG
- numfpregs
8468 + ca
->arg_count
[(int) SH_ARG_FLOAT
] + 1;
8474 if ((TARGET_HITACHI
|| ca
->renesas_abi
) && TARGET_FPU_DOUBLE
)
8476 /* Note that we've used the skipped register. */
8477 if (mode
== SFmode
&& ca
->free_single_fp_reg
)
8479 ca
->free_single_fp_reg
= 0;
8482 /* When we have a DF after an SF, there's an SF register that get
8483 skipped in order to align the DF value. We note this skipped
8484 register, because the next SF value will use it, and not the
8485 SF that follows the DF. */
8487 && ROUND_REG (*ca
, DFmode
) != ROUND_REG (*ca
, SFmode
))
8489 ca
->free_single_fp_reg
= (ROUND_REG (*ca
, SFmode
)
8490 + BASE_ARG_REG (mode
));
8494 if (! ((TARGET_SH4
|| TARGET_SH2A
) || ca
->renesas_abi
)
8495 || PASS_IN_REG_P (*ca
, mode
, type
))
8496 (ca
->arg_count
[(int) GET_SH_ARG_CLASS (mode
)]
8497 = (ROUND_REG (*ca
, mode
)
8499 ? ROUND_ADVANCE (int_size_in_bytes (type
))
8500 : ROUND_ADVANCE (GET_MODE_SIZE (mode
)))));
8503 /* The Renesas calling convention doesn't quite fit into this scheme since
8504 the address is passed like an invisible argument, but one that is always
8505 passed in memory. */
8507 sh_struct_value_rtx (tree fndecl
, int incoming ATTRIBUTE_UNUSED
)
8509 if (TARGET_HITACHI
|| sh_attr_renesas_p (fndecl
))
8511 return gen_rtx_REG (Pmode
, 2);
8514 /* Worker function for TARGET_FUNCTION_VALUE.
8516 For the SH, this is like LIBCALL_VALUE, except that we must change the
8517 mode like PROMOTE_MODE does.
8518 ??? PROMOTE_MODE is ignored for non-scalar types. The set of types
8519 tested here has to be kept in sync with the one in explow.c:promote_mode.
8523 sh_function_value (const_tree valtype
,
8524 const_tree fn_decl_or_type
,
8525 bool outgoing ATTRIBUTE_UNUSED
)
8528 && !DECL_P (fn_decl_or_type
))
8529 fn_decl_or_type
= NULL
;
8531 return gen_rtx_REG (
8532 ((GET_MODE_CLASS (TYPE_MODE (valtype
)) == MODE_INT
8533 && GET_MODE_SIZE (TYPE_MODE (valtype
)) < 4
8534 && (TREE_CODE (valtype
) == INTEGER_TYPE
8535 || TREE_CODE (valtype
) == ENUMERAL_TYPE
8536 || TREE_CODE (valtype
) == BOOLEAN_TYPE
8537 || TREE_CODE (valtype
) == REAL_TYPE
8538 || TREE_CODE (valtype
) == OFFSET_TYPE
))
8539 && sh_promote_prototypes (fn_decl_or_type
)
8540 ? (TARGET_SHMEDIA64
? DImode
: SImode
) : TYPE_MODE (valtype
)),
8541 BASE_RETURN_VALUE_REG (TYPE_MODE (valtype
)));
8544 /* Worker function for TARGET_LIBCALL_VALUE. */
8547 sh_libcall_value (enum machine_mode mode
, const_rtx fun ATTRIBUTE_UNUSED
)
8549 return gen_rtx_REG (mode
, BASE_RETURN_VALUE_REG (mode
));
8552 /* Return true if N is a possible register number of function value. */
8555 sh_function_value_regno_p (const unsigned int regno
)
8557 return ((regno
) == FIRST_RET_REG
8558 || (TARGET_SH2E
&& (regno
) == FIRST_FP_RET_REG
)
8559 || (TARGET_SHMEDIA_FPU
&& (regno
) == FIRST_FP_RET_REG
));
8562 /* Worker function for TARGET_RETURN_IN_MEMORY. */
8565 sh_return_in_memory (const_tree type
, const_tree fndecl
)
8569 if (TYPE_MODE (type
) == BLKmode
)
8570 return ((unsigned HOST_WIDE_INT
) int_size_in_bytes (type
)) > 8;
8572 return GET_MODE_SIZE (TYPE_MODE (type
)) > 8;
8576 return (TYPE_MODE (type
) == BLKmode
8577 || ((TARGET_HITACHI
|| sh_attr_renesas_p (fndecl
))
8578 && TREE_CODE (type
) == RECORD_TYPE
));
8582 /* We actually emit the code in sh_expand_prologue. We used to use
8583 a static variable to flag that we need to emit this code, but that
8584 doesn't when inlining, when functions are deferred and then emitted
8585 later. Fortunately, we already have two flags that are part of struct
8586 function that tell if a function uses varargs or stdarg. */
8588 sh_setup_incoming_varargs (CUMULATIVE_ARGS
*ca
,
8589 enum machine_mode mode
,
8591 int *pretend_arg_size
,
8592 int second_time ATTRIBUTE_UNUSED
)
8594 gcc_assert (cfun
->stdarg
);
8595 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl
))
8597 int named_parm_regs
, anon_parm_regs
;
8599 named_parm_regs
= (ROUND_REG (*ca
, mode
)
8601 ? ROUND_ADVANCE (int_size_in_bytes (type
))
8602 : ROUND_ADVANCE (GET_MODE_SIZE (mode
))));
8603 anon_parm_regs
= NPARM_REGS (SImode
) - named_parm_regs
;
8604 if (anon_parm_regs
> 0)
8605 *pretend_arg_size
= anon_parm_regs
* 4;
8610 sh_strict_argument_naming (CUMULATIVE_ARGS
*ca ATTRIBUTE_UNUSED
)
8616 sh_pretend_outgoing_varargs_named (CUMULATIVE_ARGS
*ca
)
8618 return ! (TARGET_HITACHI
|| ca
->renesas_abi
) && ! TARGET_SH5
;
8622 /* Define the offset between two registers, one to be eliminated, and
8623 the other its replacement, at the start of a routine. */
8626 initial_elimination_offset (int from
, int to
)
8629 int regs_saved_rounding
= 0;
8630 int total_saved_regs_space
;
8631 int total_auto_space
;
8632 int save_flags
= target_flags
;
8634 HARD_REG_SET live_regs_mask
;
8636 shmedia_space_reserved_for_target_registers
= false;
8637 regs_saved
= calc_live_regs (&live_regs_mask
);
8638 regs_saved
+= SHMEDIA_REGS_STACK_ADJUST ();
8640 if (shmedia_reserve_space_for_target_registers_p (regs_saved
, &live_regs_mask
))
8642 shmedia_space_reserved_for_target_registers
= true;
8643 regs_saved
+= shmedia_target_regs_stack_adjust (&live_regs_mask
);
8646 if (TARGET_SH5
&& regs_saved
% (STACK_BOUNDARY
/ BITS_PER_UNIT
))
8647 regs_saved_rounding
= ((STACK_BOUNDARY
/ BITS_PER_UNIT
)
8648 - regs_saved
% (STACK_BOUNDARY
/ BITS_PER_UNIT
));
8650 total_auto_space
= rounded_frame_size (regs_saved
) - regs_saved_rounding
;
8651 copy_flags
= target_flags
;
8652 target_flags
= save_flags
;
8654 total_saved_regs_space
= regs_saved
+ regs_saved_rounding
;
8656 if (from
== ARG_POINTER_REGNUM
&& to
== HARD_FRAME_POINTER_REGNUM
)
8657 return total_saved_regs_space
+ total_auto_space
8658 + crtl
->args
.info
.byref_regs
* 8;
8660 if (from
== ARG_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
8661 return total_saved_regs_space
+ total_auto_space
8662 + crtl
->args
.info
.byref_regs
* 8;
8664 /* Initial gap between fp and sp is 0. */
8665 if (from
== HARD_FRAME_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
8668 if (from
== FRAME_POINTER_REGNUM
&& to
== STACK_POINTER_REGNUM
)
8669 return rounded_frame_size (0);
8671 if (from
== FRAME_POINTER_REGNUM
&& to
== HARD_FRAME_POINTER_REGNUM
)
8672 return rounded_frame_size (0);
8674 gcc_assert (from
== RETURN_ADDRESS_POINTER_REGNUM
8675 && (to
== HARD_FRAME_POINTER_REGNUM
8676 || to
== STACK_POINTER_REGNUM
));
8679 int n
= total_saved_regs_space
;
8680 int pr_reg
= TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
;
8681 save_schedule schedule
;
8684 n
+= total_auto_space
;
8686 /* If it wasn't saved, there's not much we can do. */
8687 if (! TEST_HARD_REG_BIT (live_regs_mask
, pr_reg
))
8690 target_flags
= copy_flags
;
8692 sh5_schedule_saves (&live_regs_mask
, &schedule
, n
);
8693 for (entry
= &schedule
.entries
[1]; entry
->mode
!= VOIDmode
; entry
++)
8694 if (entry
->reg
== pr_reg
)
8696 target_flags
= save_flags
;
8697 return entry
->offset
;
8702 return total_auto_space
;
8705 /* Parse the -mfixed-range= option string. */
8707 sh_fix_range (const char *const_str
)
8710 char *str
, *dash
, *comma
;
8712 /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
8713 REG2 are either register names or register numbers. The effect
8714 of this option is to mark the registers in the range from REG1 to
8715 REG2 as ``fixed'' so they won't be used by the compiler. */
8717 i
= strlen (const_str
);
8718 str
= (char *) alloca (i
+ 1);
8719 memcpy (str
, const_str
, i
+ 1);
8723 dash
= strchr (str
, '-');
8726 warning (0, "value of -mfixed-range must have form REG1-REG2");
8730 comma
= strchr (dash
+ 1, ',');
8734 first
= decode_reg_name (str
);
8737 warning (0, "unknown register name: %s", str
);
8741 last
= decode_reg_name (dash
+ 1);
8744 warning (0, "unknown register name: %s", dash
+ 1);
8752 warning (0, "%s-%s is an empty range", str
, dash
+ 1);
8756 for (i
= first
; i
<= last
; ++i
)
8757 fixed_regs
[i
] = call_used_regs
[i
] = 1;
8767 /* Insert any deferred function attributes from earlier pragmas. */
8769 sh_insert_attributes (tree node
, tree
*attributes
)
8773 if (TREE_CODE (node
) != FUNCTION_DECL
)
8776 /* We are only interested in fields. */
8780 /* Append the attributes to the deferred attributes. */
8781 *sh_deferred_function_attributes_tail
= *attributes
;
8782 attrs
= sh_deferred_function_attributes
;
8786 /* Some attributes imply or require the interrupt attribute. */
8787 if (!lookup_attribute ("interrupt_handler", attrs
)
8788 && !lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (node
)))
8790 /* If we have a trapa_handler, but no interrupt_handler attribute,
8791 insert an interrupt_handler attribute. */
8792 if (lookup_attribute ("trapa_handler", attrs
) != NULL_TREE
)
8793 /* We can't use sh_pr_interrupt here because that's not in the
8796 = tree_cons (get_identifier("interrupt_handler"), NULL_TREE
, attrs
);
8797 /* However, for sp_switch, trap_exit, nosave_low_regs and resbank,
8798 if the interrupt attribute is missing, we ignore the attribute
8800 else if (lookup_attribute ("sp_switch", attrs
)
8801 || lookup_attribute ("trap_exit", attrs
)
8802 || lookup_attribute ("nosave_low_regs", attrs
)
8803 || lookup_attribute ("resbank", attrs
))
8807 for (tail
= attributes
; attrs
; attrs
= TREE_CHAIN (attrs
))
8809 if (is_attribute_p ("sp_switch", TREE_PURPOSE (attrs
))
8810 || is_attribute_p ("trap_exit", TREE_PURPOSE (attrs
))
8811 || is_attribute_p ("nosave_low_regs", TREE_PURPOSE (attrs
))
8812 || is_attribute_p ("resbank", TREE_PURPOSE (attrs
)))
8813 warning (OPT_Wattributes
,
8814 "%qE attribute only applies to interrupt functions",
8815 TREE_PURPOSE (attrs
));
8818 *tail
= tree_cons (TREE_PURPOSE (attrs
), NULL_TREE
,
8820 tail
= &TREE_CHAIN (*tail
);
8823 attrs
= *attributes
;
8827 /* Install the processed list. */
8828 *attributes
= attrs
;
8830 /* Clear deferred attributes. */
8831 sh_deferred_function_attributes
= NULL_TREE
;
8832 sh_deferred_function_attributes_tail
= &sh_deferred_function_attributes
;
8837 /* Supported attributes:
8839 interrupt_handler -- specifies this function is an interrupt handler.
8841 trapa_handler - like above, but don't save all registers.
8843 sp_switch -- specifies an alternate stack for an interrupt handler
8846 trap_exit -- use a trapa to exit an interrupt function instead of
8849 nosave_low_regs - don't save r0..r7 in an interrupt handler.
8850 This is useful on the SH3 and upwards,
8851 which has a separate set of low regs for User and Supervisor modes.
8852 This should only be used for the lowest level of interrupts. Higher levels
8853 of interrupts must save the registers in case they themselves are
8856 renesas -- use Renesas calling/layout conventions (functions and
8859 resbank -- In case of an ISR, use a register bank to save registers
8860 R0-R14, MACH, MACL, GBR and PR. This is useful only on SH2A targets.
8863 /* Handle a 'resbank' attribute. */
8865 sh_handle_resbank_handler_attribute (tree
* node
, tree name
,
8866 tree args ATTRIBUTE_UNUSED
,
8867 int flags ATTRIBUTE_UNUSED
,
8868 bool * no_add_attrs
)
8872 warning (OPT_Wattributes
, "%qE attribute is supported only for SH2A",
8874 *no_add_attrs
= true;
8876 if (TREE_CODE (*node
) != FUNCTION_DECL
)
8878 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
8880 *no_add_attrs
= true;
8886 /* Handle an "interrupt_handler" attribute; arguments as in
8887 struct attribute_spec.handler. */
8889 sh_handle_interrupt_handler_attribute (tree
*node
, tree name
,
8890 tree args ATTRIBUTE_UNUSED
,
8891 int flags ATTRIBUTE_UNUSED
,
8894 if (TREE_CODE (*node
) != FUNCTION_DECL
)
8896 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
8898 *no_add_attrs
= true;
8900 else if (TARGET_SHCOMPACT
)
8902 error ("attribute interrupt_handler is not compatible with -m5-compact");
8903 *no_add_attrs
= true;
8909 /* Handle an 'function_vector' attribute; arguments as in
8910 struct attribute_spec.handler. */
8912 sh2a_handle_function_vector_handler_attribute (tree
* node
, tree name
,
8913 tree args ATTRIBUTE_UNUSED
,
8914 int flags ATTRIBUTE_UNUSED
,
8915 bool * no_add_attrs
)
8919 warning (OPT_Wattributes
, "%qE attribute only applies to SH2A",
8921 *no_add_attrs
= true;
8923 else if (TREE_CODE (*node
) != FUNCTION_DECL
)
8925 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
8927 *no_add_attrs
= true;
8929 else if (TREE_CODE (TREE_VALUE (args
)) != INTEGER_CST
)
8931 /* The argument must be a constant integer. */
8932 warning (OPT_Wattributes
,
8933 "%qE attribute argument not an integer constant",
8935 *no_add_attrs
= true;
8937 else if (TREE_INT_CST_LOW (TREE_VALUE (args
)) > 255)
8939 /* The argument value must be between 0 to 255. */
8940 warning (OPT_Wattributes
,
8941 "%qE attribute argument should be between 0 to 255",
8943 *no_add_attrs
= true;
8948 /* Returns 1 if current function has been assigned the attribute
8949 'function_vector'. */
8951 sh2a_is_function_vector_call (rtx x
)
8953 if (GET_CODE (x
) == SYMBOL_REF
8954 && (SYMBOL_REF_FLAGS (x
) & SYMBOL_FLAG_FUNCVEC_FUNCTION
))
8956 tree tr
= SYMBOL_REF_DECL (x
);
8958 if (sh2a_function_vector_p (tr
))
8965 /* Returns the function vector number, if the the attribute
8966 'function_vector' is assigned, otherwise returns zero. */
8968 sh2a_get_function_vector_number (rtx x
)
8973 if ((GET_CODE (x
) == SYMBOL_REF
)
8974 && (SYMBOL_REF_FLAGS (x
) & SYMBOL_FLAG_FUNCVEC_FUNCTION
))
8976 t
= SYMBOL_REF_DECL (x
);
8978 if (TREE_CODE (t
) != FUNCTION_DECL
)
8981 list
= SH_ATTRIBUTES (t
);
8984 if (is_attribute_p ("function_vector", TREE_PURPOSE (list
)))
8986 num
= TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (list
)));
8990 list
= TREE_CHAIN (list
);
8999 /* Handle an "sp_switch" attribute; arguments as in
9000 struct attribute_spec.handler. */
9002 sh_handle_sp_switch_attribute (tree
*node
, tree name
, tree args
,
9003 int flags ATTRIBUTE_UNUSED
, bool *no_add_attrs
)
9005 if (TREE_CODE (*node
) != FUNCTION_DECL
)
9007 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
9009 *no_add_attrs
= true;
9011 else if (TREE_CODE (TREE_VALUE (args
)) != STRING_CST
)
9013 /* The argument must be a constant string. */
9014 warning (OPT_Wattributes
, "%qE attribute argument not a string constant",
9016 *no_add_attrs
= true;
9022 /* Handle an "trap_exit" attribute; arguments as in
9023 struct attribute_spec.handler. */
9025 sh_handle_trap_exit_attribute (tree
*node
, tree name
, tree args
,
9026 int flags ATTRIBUTE_UNUSED
, bool *no_add_attrs
)
9028 if (TREE_CODE (*node
) != FUNCTION_DECL
)
9030 warning (OPT_Wattributes
, "%qE attribute only applies to functions",
9032 *no_add_attrs
= true;
9034 /* The argument specifies a trap number to be used in a trapa instruction
9035 at function exit (instead of an rte instruction). */
9036 else if (TREE_CODE (TREE_VALUE (args
)) != INTEGER_CST
)
9038 /* The argument must be a constant integer. */
9039 warning (OPT_Wattributes
, "%qE attribute argument not an "
9040 "integer constant", name
);
9041 *no_add_attrs
= true;
9048 sh_handle_renesas_attribute (tree
*node ATTRIBUTE_UNUSED
,
9049 tree name ATTRIBUTE_UNUSED
,
9050 tree args ATTRIBUTE_UNUSED
,
9051 int flags ATTRIBUTE_UNUSED
,
9052 bool *no_add_attrs ATTRIBUTE_UNUSED
)
9057 /* True if __attribute__((renesas)) or -mrenesas. */
9059 sh_attr_renesas_p (const_tree td
)
9066 td
= TREE_TYPE (td
);
9067 if (td
== error_mark_node
)
9069 return (lookup_attribute ("renesas", TYPE_ATTRIBUTES (td
))
9073 /* True if __attribute__((renesas)) or -mrenesas, for the current
9076 sh_cfun_attr_renesas_p (void)
9078 return sh_attr_renesas_p (current_function_decl
);
9082 sh_cfun_interrupt_handler_p (void)
9084 return (lookup_attribute ("interrupt_handler",
9085 DECL_ATTRIBUTES (current_function_decl
))
9089 /* Returns 1 if FUNC has been assigned the attribute
9090 "function_vector". */
9092 sh2a_function_vector_p (tree func
)
9095 if (TREE_CODE (func
) != FUNCTION_DECL
)
9098 list
= SH_ATTRIBUTES (func
);
9101 if (is_attribute_p ("function_vector", TREE_PURPOSE (list
)))
9104 list
= TREE_CHAIN (list
);
9109 /* Returns TRUE if given tree has the "resbank" attribute. */
9112 sh_cfun_resbank_handler_p (void)
9114 return ((lookup_attribute ("resbank",
9115 DECL_ATTRIBUTES (current_function_decl
))
9117 && (lookup_attribute ("interrupt_handler",
9118 DECL_ATTRIBUTES (current_function_decl
))
9119 != NULL_TREE
) && TARGET_SH2A
);
9122 /* Implement TARGET_CHECK_PCH_TARGET_FLAGS. */
9125 sh_check_pch_target_flags (int old_flags
)
9127 if ((old_flags
^ target_flags
) & (MASK_SH1
| MASK_SH2
| MASK_SH3
9128 | MASK_SH_E
| MASK_HARD_SH4
9129 | MASK_FPU_SINGLE
| MASK_SH4
))
9130 return _("created and used with different architectures / ABIs");
9131 if ((old_flags
^ target_flags
) & MASK_HITACHI
)
9132 return _("created and used with different ABIs");
9133 if ((old_flags
^ target_flags
) & MASK_LITTLE_ENDIAN
)
9134 return _("created and used with different endianness");
9138 /* Predicates used by the templates. */
9140 /* Returns 1 if OP is MACL, MACH or PR. The input must be a REG rtx.
9141 Used only in general_movsrc_operand. */
9144 system_reg_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
9156 /* Nonzero if OP is a floating point value with value 0.0. */
9159 fp_zero_operand (rtx op
)
9163 if (GET_MODE (op
) != SFmode
)
9166 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
9167 return REAL_VALUES_EQUAL (r
, dconst0
) && ! REAL_VALUE_MINUS_ZERO (r
);
9170 /* Nonzero if OP is a floating point value with value 1.0. */
9173 fp_one_operand (rtx op
)
9177 if (GET_MODE (op
) != SFmode
)
9180 REAL_VALUE_FROM_CONST_DOUBLE (r
, op
);
9181 return REAL_VALUES_EQUAL (r
, dconst1
);
9184 /* In general mode switching is used. If we are
9185 compiling without -mfmovd, movsf_ie isn't taken into account for
9186 mode switching. We could check in machine_dependent_reorg for
9187 cases where we know we are in single precision mode, but there is
9188 interface to find that out during reload, so we must avoid
9189 choosing an fldi alternative during reload and thus failing to
9190 allocate a scratch register for the constant loading. */
9198 tertiary_reload_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
9200 enum rtx_code code
= GET_CODE (op
);
9201 return code
== MEM
|| (TARGET_SH4
&& code
== CONST_DOUBLE
);
9204 /* Return the TLS type for TLS symbols, 0 for otherwise. */
9206 tls_symbolic_operand (rtx op
, enum machine_mode mode ATTRIBUTE_UNUSED
)
9208 if (GET_CODE (op
) != SYMBOL_REF
)
9209 return TLS_MODEL_NONE
;
9210 return SYMBOL_REF_TLS_MODEL (op
);
9213 /* Return the destination address of a branch. */
9216 branch_dest (rtx branch
)
9218 rtx dest
= SET_SRC (PATTERN (branch
));
9221 if (GET_CODE (dest
) == IF_THEN_ELSE
)
9222 dest
= XEXP (dest
, 1);
9223 dest
= XEXP (dest
, 0);
9224 dest_uid
= INSN_UID (dest
);
9225 return INSN_ADDRESSES (dest_uid
);
9228 /* Return nonzero if REG is not used after INSN.
9229 We assume REG is a reload reg, and therefore does
9230 not live past labels. It may live past calls or jumps though. */
9232 reg_unused_after (rtx reg
, rtx insn
)
9237 /* If the reg is set by this instruction, then it is safe for our
9238 case. Disregard the case where this is a store to memory, since
9239 we are checking a register used in the store address. */
9240 set
= single_set (insn
);
9241 if (set
&& !MEM_P (SET_DEST (set
))
9242 && reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
9245 while ((insn
= NEXT_INSN (insn
)))
9251 code
= GET_CODE (insn
);
9254 /* If this is a label that existed before reload, then the register
9255 if dead here. However, if this is a label added by reorg, then
9256 the register may still be live here. We can't tell the difference,
9257 so we just ignore labels completely. */
9258 if (code
== CODE_LABEL
)
9263 if (code
== JUMP_INSN
)
9266 /* If this is a sequence, we must handle them all at once.
9267 We could have for instance a call that sets the target register,
9268 and an insn in a delay slot that uses the register. In this case,
9269 we must return 0. */
9270 else if (code
== INSN
&& GET_CODE (PATTERN (insn
)) == SEQUENCE
)
9275 for (i
= 0; i
< XVECLEN (PATTERN (insn
), 0); i
++)
9277 rtx this_insn
= XVECEXP (PATTERN (insn
), 0, i
);
9278 rtx set
= single_set (this_insn
);
9280 if (CALL_P (this_insn
))
9282 else if (JUMP_P (this_insn
))
9284 if (INSN_ANNULLED_BRANCH_P (this_insn
))
9289 if (set
&& reg_overlap_mentioned_p (reg
, SET_SRC (set
)))
9291 if (set
&& reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
9293 if (!MEM_P (SET_DEST (set
)))
9299 && reg_overlap_mentioned_p (reg
, PATTERN (this_insn
)))
9304 else if (code
== JUMP_INSN
)
9308 set
= single_set (insn
);
9309 if (set
&& reg_overlap_mentioned_p (reg
, SET_SRC (set
)))
9311 if (set
&& reg_overlap_mentioned_p (reg
, SET_DEST (set
)))
9312 return !MEM_P (SET_DEST (set
));
9313 if (set
== 0 && reg_overlap_mentioned_p (reg
, PATTERN (insn
)))
9316 if (code
== CALL_INSN
&& call_really_used_regs
[REGNO (reg
)])
9324 static GTY(()) rtx fpscr_rtx
;
9326 get_fpscr_rtx (void)
9330 fpscr_rtx
= gen_rtx_REG (PSImode
, FPSCR_REG
);
9331 REG_USERVAR_P (fpscr_rtx
) = 1;
9332 mark_user_reg (fpscr_rtx
);
9334 if (! reload_completed
|| mdep_reorg_phase
!= SH_AFTER_MDEP_REORG
)
9335 mark_user_reg (fpscr_rtx
);
9339 static GTY(()) tree fpscr_values
;
9342 emit_fpu_switch (rtx scratch
, int index
)
9346 if (fpscr_values
== NULL
)
9350 t
= build_index_type (integer_one_node
);
9351 t
= build_array_type (integer_type_node
, t
);
9352 t
= build_decl (BUILTINS_LOCATION
,
9353 VAR_DECL
, get_identifier ("__fpscr_values"), t
);
9354 DECL_ARTIFICIAL (t
) = 1;
9355 DECL_IGNORED_P (t
) = 1;
9356 DECL_EXTERNAL (t
) = 1;
9357 TREE_STATIC (t
) = 1;
9358 TREE_PUBLIC (t
) = 1;
9364 src
= DECL_RTL (fpscr_values
);
9365 if (!can_create_pseudo_p ())
9367 emit_move_insn (scratch
, XEXP (src
, 0));
9369 emit_insn (gen_addsi3 (scratch
, scratch
, GEN_INT (index
* 4)));
9370 src
= adjust_automodify_address (src
, PSImode
, scratch
, index
* 4);
9373 src
= adjust_address (src
, PSImode
, index
* 4);
9375 dst
= get_fpscr_rtx ();
9376 emit_move_insn (dst
, src
);
9380 emit_sf_insn (rtx pat
)
9386 emit_df_insn (rtx pat
)
9392 expand_sf_unop (rtx (*fun
) (rtx
, rtx
, rtx
), rtx
*operands
)
9394 emit_sf_insn ((*fun
) (operands
[0], operands
[1], get_fpscr_rtx ()));
9398 expand_sf_binop (rtx (*fun
) (rtx
, rtx
, rtx
, rtx
), rtx
*operands
)
9400 emit_sf_insn ((*fun
) (operands
[0], operands
[1], operands
[2],
9405 expand_df_unop (rtx (*fun
) (rtx
, rtx
, rtx
), rtx
*operands
)
9407 emit_df_insn ((*fun
) (operands
[0], operands
[1], get_fpscr_rtx ()));
9411 expand_df_binop (rtx (*fun
) (rtx
, rtx
, rtx
, rtx
), rtx
*operands
)
9413 emit_df_insn ((*fun
) (operands
[0], operands
[1], operands
[2],
9417 static rtx
get_free_reg (HARD_REG_SET
);
9419 /* This function returns a register to use to load the address to load
9420 the fpscr from. Currently it always returns r1 or r7, but when we are
9421 able to use pseudo registers after combine, or have a better mechanism
9422 for choosing a register, it should be done here. */
9423 /* REGS_LIVE is the liveness information for the point for which we
9424 need this allocation. In some bare-bones exit blocks, r1 is live at the
9425 start. We can even have all of r0..r3 being live:
9426 __complex__ long long f (double d) { if (d == 0) return 2; else return 3; }
9427 INSN before which new insns are placed with will clobber the register
9428 we return. If a basic block consists only of setting the return value
9429 register to a pseudo and using that register, the return value is not
9430 live before or after this block, yet we we'll insert our insns right in
9434 get_free_reg (HARD_REG_SET regs_live
)
9436 if (! TEST_HARD_REG_BIT (regs_live
, 1))
9437 return gen_rtx_REG (Pmode
, 1);
9439 /* Hard reg 1 is live; since this is a small register classes target,
9440 there shouldn't be anything but a jump before the function end. */
9441 gcc_assert (!TEST_HARD_REG_BIT (regs_live
, 7));
9442 return gen_rtx_REG (Pmode
, 7);
9445 /* This function will set the fpscr from memory.
9446 MODE is the mode we are setting it to. */
9448 fpscr_set_from_mem (int mode
, HARD_REG_SET regs_live
)
9450 enum attr_fp_mode fp_mode
= (enum attr_fp_mode
) mode
;
9451 enum attr_fp_mode norm_mode
= ACTUAL_NORMAL_MODE (FP_MODE
);
9454 addr_reg
= !can_create_pseudo_p () ? get_free_reg (regs_live
) : NULL_RTX
;
9455 emit_fpu_switch (addr_reg
, fp_mode
== norm_mode
);
9458 /* Is the given character a logical line separator for the assembler? */
9459 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
9460 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == ';')
9464 sh_insn_length_adjustment (rtx insn
)
9466 /* Instructions with unfilled delay slots take up an extra two bytes for
9467 the nop in the delay slot. */
9468 if (((NONJUMP_INSN_P (insn
)
9469 && GET_CODE (PATTERN (insn
)) != USE
9470 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
9472 || (JUMP_P (insn
) && !JUMP_TABLE_DATA_P (insn
)))
9473 && GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (insn
)))) != SEQUENCE
9474 && get_attr_needs_delay_slot (insn
) == NEEDS_DELAY_SLOT_YES
)
9477 /* SH2e has a bug that prevents the use of annulled branches, so if
9478 the delay slot is not filled, we'll have to put a NOP in it. */
9479 if (sh_cpu_attr
== CPU_SH2E
9480 && JUMP_P (insn
) && !JUMP_TABLE_DATA_P (insn
)
9481 && get_attr_type (insn
) == TYPE_CBRANCH
9482 && GET_CODE (PATTERN (NEXT_INSN (PREV_INSN (insn
)))) != SEQUENCE
)
9485 /* sh-dsp parallel processing insn take four bytes instead of two. */
9487 if (NONJUMP_INSN_P (insn
))
9490 rtx body
= PATTERN (insn
);
9493 int maybe_label
= 1;
9495 if (GET_CODE (body
) == ASM_INPUT
)
9496 templ
= XSTR (body
, 0);
9497 else if (asm_noperands (body
) >= 0)
9499 = decode_asm_operands (body
, NULL
, NULL
, NULL
, NULL
, NULL
);
9508 while (c
== ' ' || c
== '\t');
9509 /* all sh-dsp parallel-processing insns start with p.
9510 The only non-ppi sh insn starting with p is pref.
9511 The only ppi starting with pr is prnd. */
9512 if ((c
== 'p' || c
== 'P') && strncasecmp ("re", templ
, 2))
9514 /* The repeat pseudo-insn expands two three insns, a total of
9515 six bytes in size. */
9516 else if ((c
== 'r' || c
== 'R')
9517 && ! strncasecmp ("epeat", templ
, 5))
9519 while (c
&& c
!= '\n'
9520 && ! IS_ASM_LOGICAL_LINE_SEPARATOR (c
, templ
))
9522 /* If this is a label, it is obviously not a ppi insn. */
9523 if (c
== ':' && maybe_label
)
9528 else if (c
== '\'' || c
== '"')
9533 maybe_label
= c
!= ':';
9541 /* Return TRUE for a valid displacement for the REG+disp addressing
9544 /* ??? The SH2e does not have the REG+disp addressing mode when loading values
9545 into the FRx registers. We implement this by setting the maximum offset
9546 to zero when the value is SFmode. This also restricts loading of SFmode
9547 values into the integer registers, but that can't be helped. */
9549 /* The SH allows a displacement in a QI or HI amode, but only when the
9550 other operand is R0. GCC doesn't handle this very well, so we forgot
9553 A legitimate index for a QI or HI is 0, SI can be any number 0..63,
9554 DI can be any number 0..60. */
9557 sh_legitimate_index_p (enum machine_mode mode
, rtx op
)
9559 if (CONST_INT_P (op
))
9565 /* Check if this the address of an unaligned load / store. */
9566 if (mode
== VOIDmode
)
9567 return CONST_OK_FOR_I06 (INTVAL (op
));
9569 size
= GET_MODE_SIZE (mode
);
9570 return (!(INTVAL (op
) & (size
- 1))
9571 && INTVAL (op
) >= -512 * size
9572 && INTVAL (op
) < 512 * size
);
9577 if (GET_MODE_SIZE (mode
) == 1
9578 && (unsigned) INTVAL (op
) < 4096)
9582 if ((GET_MODE_SIZE (mode
) == 4
9583 && (unsigned) INTVAL (op
) < 64
9584 && !(INTVAL (op
) & 3)
9585 && !(TARGET_SH2E
&& mode
== SFmode
))
9586 || (GET_MODE_SIZE (mode
) == 4
9587 && (unsigned) INTVAL (op
) < 16383
9588 && !(INTVAL (op
) & 3) && TARGET_SH2A
))
9591 if ((GET_MODE_SIZE (mode
) == 8
9592 && (unsigned) INTVAL (op
) < 60
9593 && !(INTVAL (op
) & 3)
9594 && !((TARGET_SH4
|| TARGET_SH2A
) && mode
== DFmode
))
9595 || ((GET_MODE_SIZE (mode
)==8)
9596 && (unsigned) INTVAL (op
) < 8192
9597 && !(INTVAL (op
) & (TARGET_SH2A_DOUBLE
? 7 : 3))
9598 && (TARGET_SH2A
&& mode
== DFmode
)))
9605 /* Recognize an RTL expression that is a valid memory address for
9607 The MODE argument is the machine mode for the MEM expression
9608 that wants to use this address.
9616 sh_legitimate_address_p (enum machine_mode mode
, rtx x
, bool strict
)
9618 if (MAYBE_BASE_REGISTER_RTX_P (x
, strict
))
9620 else if ((GET_CODE (x
) == POST_INC
|| GET_CODE (x
) == PRE_DEC
)
9622 && MAYBE_BASE_REGISTER_RTX_P (XEXP (x
, 0), strict
))
9624 else if (GET_CODE (x
) == PLUS
9625 && (mode
!= PSImode
|| reload_completed
))
9627 rtx xop0
= XEXP (x
, 0);
9628 rtx xop1
= XEXP (x
, 1);
9630 if (GET_MODE_SIZE (mode
) <= 8
9631 && MAYBE_BASE_REGISTER_RTX_P (xop0
, strict
)
9632 && sh_legitimate_index_p (mode
, xop1
))
9635 if ((ALLOW_INDEXED_ADDRESS
|| GET_MODE (x
) == DImode
9636 || ((xop0
== stack_pointer_rtx
9637 || xop0
== hard_frame_pointer_rtx
)
9638 && REG_P (xop1
) && REGNO (xop1
) == R0_REG
)
9639 || ((xop1
== stack_pointer_rtx
9640 || xop1
== hard_frame_pointer_rtx
)
9641 && REG_P (xop0
) && REGNO (xop0
) == R0_REG
))
9642 && ((!TARGET_SHMEDIA
&& GET_MODE_SIZE (mode
) <= 4)
9643 || (TARGET_SHMEDIA
&& GET_MODE_SIZE (mode
) <= 8)
9644 || ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
)
9645 && TARGET_FMOVD
&& mode
== DFmode
)))
9647 if (MAYBE_BASE_REGISTER_RTX_P (xop1
, strict
)
9648 && MAYBE_INDEX_REGISTER_RTX_P (xop0
, strict
))
9650 if (MAYBE_INDEX_REGISTER_RTX_P (xop1
, strict
)
9651 && MAYBE_BASE_REGISTER_RTX_P (xop0
, strict
))
9659 /* Return TRUE if X references a SYMBOL_REF or LABEL_REF whose symbol
9660 isn't protected by a PIC unspec. */
9662 nonpic_symbol_mentioned_p (rtx x
)
9664 register const char *fmt
;
9667 if (GET_CODE (x
) == SYMBOL_REF
|| GET_CODE (x
) == LABEL_REF
9668 || GET_CODE (x
) == PC
)
9671 /* We don't want to look into the possible MEM location of a
9672 CONST_DOUBLE, since we're not going to use it, in general. */
9673 if (GET_CODE (x
) == CONST_DOUBLE
)
9676 if (GET_CODE (x
) == UNSPEC
9677 && (XINT (x
, 1) == UNSPEC_PIC
9678 || XINT (x
, 1) == UNSPEC_GOT
9679 || XINT (x
, 1) == UNSPEC_GOTOFF
9680 || XINT (x
, 1) == UNSPEC_GOTPLT
9681 || XINT (x
, 1) == UNSPEC_GOTTPOFF
9682 || XINT (x
, 1) == UNSPEC_DTPOFF
9683 || XINT (x
, 1) == UNSPEC_TPOFF
9684 || XINT (x
, 1) == UNSPEC_PLT
9685 || XINT (x
, 1) == UNSPEC_SYMOFF
9686 || XINT (x
, 1) == UNSPEC_PCREL_SYMOFF
))
9689 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
9690 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
9696 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
9697 if (nonpic_symbol_mentioned_p (XVECEXP (x
, i
, j
)))
9700 else if (fmt
[i
] == 'e' && nonpic_symbol_mentioned_p (XEXP (x
, i
)))
9707 /* Convert a non-PIC address in `orig' to a PIC address using @GOT or
9708 @GOTOFF in `reg'. */
9710 legitimize_pic_address (rtx orig
, enum machine_mode mode ATTRIBUTE_UNUSED
,
9713 if (tls_symbolic_operand (orig
, Pmode
) != TLS_MODEL_NONE
)
9716 if (GET_CODE (orig
) == LABEL_REF
9717 || (GET_CODE (orig
) == SYMBOL_REF
&& SYMBOL_REF_LOCAL_P (orig
)))
9720 reg
= gen_reg_rtx (Pmode
);
9722 emit_insn (gen_symGOTOFF2reg (reg
, orig
));
9725 else if (GET_CODE (orig
) == SYMBOL_REF
)
9728 reg
= gen_reg_rtx (Pmode
);
9730 emit_insn (gen_symGOT2reg (reg
, orig
));
9736 /* Try machine-dependent ways of modifying an illegitimate address
9737 to be legitimate. If we find one, return the new, valid address.
9738 Otherwise, return X.
9740 For the SH, if X is almost suitable for indexing, but the offset is
9741 out of range, convert it into a normal form so that CSE has a chance
9742 of reducing the number of address registers used. */
9745 sh_legitimize_address (rtx x
, rtx oldx
, enum machine_mode mode
)
9748 x
= legitimize_pic_address (oldx
, mode
, NULL_RTX
);
9750 if (GET_CODE (x
) == PLUS
9751 && (GET_MODE_SIZE (mode
) == 4
9752 || GET_MODE_SIZE (mode
) == 8)
9753 && CONST_INT_P (XEXP (x
, 1))
9754 && BASE_REGISTER_RTX_P (XEXP (x
, 0))
9756 && ! ((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && mode
== DFmode
)
9757 && ! (TARGET_SH2E
&& mode
== SFmode
))
9759 rtx index_rtx
= XEXP (x
, 1);
9760 HOST_WIDE_INT offset
= INTVAL (index_rtx
), offset_base
;
9763 /* On rare occasions, we might get an unaligned pointer
9764 that is indexed in a way to give an aligned address.
9765 Therefore, keep the lower two bits in offset_base. */
9766 /* Instead of offset_base 128..131 use 124..127, so that
9767 simple add suffices. */
9769 offset_base
= ((offset
+ 4) & ~60) - 4;
9771 offset_base
= offset
& ~60;
9773 /* Sometimes the normal form does not suit DImode. We
9774 could avoid that by using smaller ranges, but that
9775 would give less optimized code when SImode is
9777 if (GET_MODE_SIZE (mode
) + offset
- offset_base
<= 64)
9779 sum
= expand_binop (Pmode
, add_optab
, XEXP (x
, 0),
9780 GEN_INT (offset_base
), NULL_RTX
, 0,
9783 return gen_rtx_PLUS (Pmode
, sum
, GEN_INT (offset
- offset_base
));
9790 /* Attempt to replace *P, which is an address that needs reloading, with
9791 a valid memory address for an operand of mode MODE.
9792 Like for sh_legitimize_address, for the SH we try to get a normal form
9793 of the address. That will allow inheritance of the address reloads. */
9796 sh_legitimize_reload_address (rtx
*p
, enum machine_mode mode
, int opnum
,
9799 enum reload_type type
= (enum reload_type
) itype
;
9801 if (GET_CODE (*p
) == PLUS
9802 && (GET_MODE_SIZE (mode
) == 4 || GET_MODE_SIZE (mode
) == 8)
9803 && CONST_INT_P (XEXP (*p
, 1))
9804 && MAYBE_BASE_REGISTER_RTX_P (XEXP (*p
, 0), true)
9806 && ! (TARGET_SH4
&& mode
== DFmode
)
9807 && ! (mode
== PSImode
&& type
== RELOAD_FOR_INPUT_ADDRESS
)
9808 && (ALLOW_INDEXED_ADDRESS
9809 || XEXP (*p
, 0) == stack_pointer_rtx
9810 || XEXP (*p
, 0) == hard_frame_pointer_rtx
))
9812 rtx index_rtx
= XEXP (*p
, 1);
9813 HOST_WIDE_INT offset
= INTVAL (index_rtx
), offset_base
;
9816 if (TARGET_SH2A
&& mode
== DFmode
&& (offset
& 0x7))
9818 push_reload (*p
, NULL_RTX
, p
, NULL
,
9819 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0, opnum
, type
);
9822 if (TARGET_SH2E
&& mode
== SFmode
)
9825 push_reload (*p
, NULL_RTX
, p
, NULL
,
9826 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0, opnum
, type
);
9829 /* Instead of offset_base 128..131 use 124..127, so that
9830 simple add suffices. */
9832 offset_base
= ((offset
+ 4) & ~60) - 4;
9834 offset_base
= offset
& ~60;
9835 /* Sometimes the normal form does not suit DImode. We could avoid
9836 that by using smaller ranges, but that would give less optimized
9837 code when SImode is prevalent. */
9838 if (GET_MODE_SIZE (mode
) + offset
- offset_base
<= 64)
9840 sum
= gen_rtx_PLUS (Pmode
, XEXP (*p
, 0), GEN_INT (offset_base
));
9841 *p
= gen_rtx_PLUS (Pmode
, sum
, GEN_INT (offset
- offset_base
));
9842 push_reload (sum
, NULL_RTX
, &XEXP (*p
, 0), NULL
,
9843 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0, opnum
, type
);
9847 /* We must re-recognize what we created before. */
9848 else if (GET_CODE (*p
) == PLUS
9849 && (GET_MODE_SIZE (mode
) == 4 || GET_MODE_SIZE (mode
) == 8)
9850 && GET_CODE (XEXP (*p
, 0)) == PLUS
9851 && CONST_INT_P (XEXP (XEXP (*p
, 0), 1))
9852 && MAYBE_BASE_REGISTER_RTX_P (XEXP (XEXP (*p
, 0), 0), true)
9853 && CONST_INT_P (XEXP (*p
, 1))
9855 && ! (TARGET_SH2E
&& mode
== SFmode
))
9857 /* Because this address is so complex, we know it must have
9858 been created by LEGITIMIZE_RELOAD_ADDRESS before; thus,
9859 it is already unshared, and needs no further unsharing. */
9860 push_reload (XEXP (*p
, 0), NULL_RTX
, &XEXP (*p
, 0), NULL
,
9861 BASE_REG_CLASS
, Pmode
, VOIDmode
, 0, 0, opnum
, type
);
9871 /* Mark the use of a constant in the literal table. If the constant
9872 has multiple labels, make it unique. */
9874 mark_constant_pool_use (rtx x
)
9876 rtx insn
, lab
, pattern
;
9881 switch (GET_CODE (x
))
9891 /* Get the first label in the list of labels for the same constant
9892 and delete another labels in the list. */
9894 for (insn
= PREV_INSN (x
); insn
; insn
= PREV_INSN (insn
))
9897 || LABEL_REFS (insn
) != NEXT_INSN (insn
))
9902 for (insn
= LABEL_REFS (lab
); insn
; insn
= LABEL_REFS (insn
))
9903 INSN_DELETED_P (insn
) = 1;
9905 /* Mark constants in a window. */
9906 for (insn
= NEXT_INSN (x
); insn
; insn
= NEXT_INSN (insn
))
9908 if (!NONJUMP_INSN_P (insn
))
9911 pattern
= PATTERN (insn
);
9912 if (GET_CODE (pattern
) != UNSPEC_VOLATILE
)
9915 switch (XINT (pattern
, 1))
9917 case UNSPECV_CONST2
:
9918 case UNSPECV_CONST4
:
9919 case UNSPECV_CONST8
:
9920 XVECEXP (pattern
, 0, 1) = const1_rtx
;
9922 case UNSPECV_WINDOW_END
:
9923 if (XVECEXP (pattern
, 0, 0) == x
)
9926 case UNSPECV_CONST_END
:
9936 /* Return true if it's possible to redirect BRANCH1 to the destination
9937 of an unconditional jump BRANCH2. We only want to do this if the
9938 resulting branch will have a short displacement. */
9940 sh_can_redirect_branch (rtx branch1
, rtx branch2
)
9942 if (flag_expensive_optimizations
&& simplejump_p (branch2
))
9944 rtx dest
= XEXP (SET_SRC (single_set (branch2
)), 0);
9948 for (distance
= 0, insn
= NEXT_INSN (branch1
);
9949 insn
&& distance
< 256;
9950 insn
= PREV_INSN (insn
))
9955 distance
+= get_attr_length (insn
);
9957 for (distance
= 0, insn
= NEXT_INSN (branch1
);
9958 insn
&& distance
< 256;
9959 insn
= NEXT_INSN (insn
))
9964 distance
+= get_attr_length (insn
);
9970 /* Return nonzero if register old_reg can be renamed to register new_reg. */
9972 sh_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED
,
9973 unsigned int new_reg
)
9975 /* Interrupt functions can only use registers that have already been
9976 saved by the prologue, even if they would normally be
9979 if (sh_cfun_interrupt_handler_p () && !df_regs_ever_live_p (new_reg
))
9985 /* Function to update the integer COST
9986 based on the relationship between INSN that is dependent on
9987 DEP_INSN through the dependence LINK. The default is to make no
9988 adjustment to COST. This can be used for example to specify to
9989 the scheduler that an output- or anti-dependence does not incur
9990 the same cost as a data-dependence. The return value should be
9991 the new value for COST. */
9993 sh_adjust_cost (rtx insn
, rtx link ATTRIBUTE_UNUSED
, rtx dep_insn
, int cost
)
9999 /* On SHmedia, if the dependence is an anti-dependence or
10000 output-dependence, there is no cost. */
10001 if (REG_NOTE_KIND (link
) != 0)
10003 /* However, dependencies between target register loads and
10004 uses of the register in a subsequent block that are separated
10005 by a conditional branch are not modelled - we have to do with
10006 the anti-dependency between the target register load and the
10007 conditional branch that ends the current block. */
10008 if (REG_NOTE_KIND (link
) == REG_DEP_ANTI
10009 && GET_CODE (PATTERN (dep_insn
)) == SET
10010 && (get_attr_type (dep_insn
) == TYPE_PT_MEDIA
10011 || get_attr_type (dep_insn
) == TYPE_PTABS_MEDIA
)
10012 && get_attr_type (insn
) == TYPE_CBRANCH_MEDIA
)
10014 int orig_cost
= cost
;
10015 rtx note
= find_reg_note (insn
, REG_BR_PROB
, 0);
10016 rtx target
= ((! note
10017 || INTVAL (XEXP (note
, 0)) * 2 < REG_BR_PROB_BASE
)
10018 ? insn
: JUMP_LABEL (insn
));
10019 /* On the likely path, the branch costs 1, on the unlikely path,
10023 target
= next_active_insn (target
);
10024 while (target
&& ! flow_dependent_p (target
, dep_insn
)
10026 /* If two branches are executed in immediate succession, with the
10027 first branch properly predicted, this causes a stall at the
10028 second branch, hence we won't need the target for the
10029 second branch for two cycles after the launch of the first
10031 if (cost
> orig_cost
- 2)
10032 cost
= orig_cost
- 2;
10038 else if (get_attr_is_mac_media (insn
)
10039 && get_attr_is_mac_media (dep_insn
))
10042 else if (! reload_completed
10043 && GET_CODE (PATTERN (insn
)) == SET
10044 && GET_CODE (SET_SRC (PATTERN (insn
))) == FLOAT
10045 && GET_CODE (PATTERN (dep_insn
)) == SET
10046 && fp_arith_reg_operand (SET_SRC (PATTERN (dep_insn
)), VOIDmode
)
10049 /* Schedule the ptabs for a casesi_jump_media in preference to stuff
10050 that is needed at the target. */
10051 else if (get_attr_type (insn
) == TYPE_JUMP_MEDIA
10052 && ! flow_dependent_p (insn
, dep_insn
))
10055 else if (REG_NOTE_KIND (link
) == 0)
10057 enum attr_type type
;
10060 if (recog_memoized (insn
) < 0
10061 || recog_memoized (dep_insn
) < 0)
10064 dep_set
= single_set (dep_insn
);
10066 /* The latency that we specify in the scheduling description refers
10067 to the actual output, not to an auto-increment register; for that,
10068 the latency is one. */
10069 if (dep_set
&& MEM_P (SET_SRC (dep_set
)) && cost
> 1)
10071 rtx set
= single_set (insn
);
10074 && !reg_mentioned_p (SET_DEST (dep_set
), SET_SRC (set
))
10075 && (!MEM_P (SET_DEST (set
))
10076 || !reg_mentioned_p (SET_DEST (dep_set
),
10077 XEXP (SET_DEST (set
), 0))))
10080 /* The only input for a call that is timing-critical is the
10081 function's address. */
10084 rtx call
= PATTERN (insn
);
10086 if (GET_CODE (call
) == PARALLEL
)
10087 call
= XVECEXP (call
, 0 ,0);
10088 if (GET_CODE (call
) == SET
)
10089 call
= SET_SRC (call
);
10090 if (GET_CODE (call
) == CALL
&& MEM_P (XEXP (call
, 0))
10091 /* sibcalli_thunk uses a symbol_ref in an unspec. */
10092 && (GET_CODE (XEXP (XEXP (call
, 0), 0)) == UNSPEC
10093 || ! reg_set_p (XEXP (XEXP (call
, 0), 0), dep_insn
)))
10094 cost
-= TARGET_SH4_300
? 3 : 6;
10096 /* Likewise, the most timing critical input for an sfuncs call
10097 is the function address. However, sfuncs typically start
10098 using their arguments pretty quickly.
10099 Assume a four cycle delay for SH4 before they are needed.
10100 Cached ST40-300 calls are quicker, so assume only a one
10102 ??? Maybe we should encode the delays till input registers
10103 are needed by sfuncs into the sfunc call insn. */
10104 /* All sfunc calls are parallels with at least four components.
10105 Exploit this to avoid unnecessary calls to sfunc_uses_reg. */
10106 else if (GET_CODE (PATTERN (insn
)) == PARALLEL
10107 && XVECLEN (PATTERN (insn
), 0) >= 4
10108 && (reg
= sfunc_uses_reg (insn
)))
10110 if (! reg_set_p (reg
, dep_insn
))
10111 cost
-= TARGET_SH4_300
? 1 : 4;
10113 if (TARGET_HARD_SH4
&& !TARGET_SH4_300
)
10115 enum attr_type dep_type
= get_attr_type (dep_insn
);
10117 if (dep_type
== TYPE_FLOAD
|| dep_type
== TYPE_PCFLOAD
)
10119 else if ((dep_type
== TYPE_LOAD_SI
|| dep_type
== TYPE_PCLOAD_SI
)
10120 && (type
= get_attr_type (insn
)) != TYPE_CALL
10121 && type
!= TYPE_SFUNC
)
10123 /* When the preceding instruction loads the shift amount of
10124 the following SHAD/SHLD, the latency of the load is increased
10126 if (get_attr_type (insn
) == TYPE_DYN_SHIFT
10127 && get_attr_any_int_load (dep_insn
) == ANY_INT_LOAD_YES
10128 && reg_overlap_mentioned_p (SET_DEST (dep_set
),
10129 XEXP (SET_SRC (single_set (insn
)),
10132 /* When an LS group instruction with a latency of less than
10133 3 cycles is followed by a double-precision floating-point
10134 instruction, FIPR, or FTRV, the latency of the first
10135 instruction is increased to 3 cycles. */
10137 && get_attr_insn_class (dep_insn
) == INSN_CLASS_LS_GROUP
10138 && get_attr_dfp_comp (insn
) == DFP_COMP_YES
)
10140 /* The lsw register of a double-precision computation is ready one
10142 else if (reload_completed
10143 && get_attr_dfp_comp (dep_insn
) == DFP_COMP_YES
10144 && (use_pat
= single_set (insn
))
10145 && ! regno_use_in (REGNO (SET_DEST (single_set (dep_insn
))),
10146 SET_SRC (use_pat
)))
10149 if (get_attr_any_fp_comp (dep_insn
) == ANY_FP_COMP_YES
10150 && get_attr_late_fp_use (insn
) == LATE_FP_USE_YES
)
10153 else if (TARGET_SH4_300
)
10155 /* Stores need their input register two cycles later. */
10156 if (dep_set
&& cost
>= 1
10157 && ((type
= get_attr_type (insn
)) == TYPE_STORE
10158 || type
== TYPE_PSTORE
10159 || type
== TYPE_FSTORE
|| type
== TYPE_MAC_MEM
))
10161 rtx set
= single_set (insn
);
10163 if (!reg_mentioned_p (SET_SRC (set
), XEXP (SET_DEST (set
), 0))
10164 && rtx_equal_p (SET_SRC (set
), SET_DEST (dep_set
)))
10167 /* But don't reduce the cost below 1 if the address depends
10168 on a side effect of dep_insn. */
10170 && modified_in_p (XEXP (SET_DEST (set
), 0), dep_insn
))
10176 /* An anti-dependence penalty of two applies if the first insn is a double
10177 precision fadd / fsub / fmul. */
10178 else if (!TARGET_SH4_300
10179 && REG_NOTE_KIND (link
) == REG_DEP_ANTI
10180 && recog_memoized (dep_insn
) >= 0
10181 && (get_attr_type (dep_insn
) == TYPE_DFP_ARITH
10182 || get_attr_type (dep_insn
) == TYPE_DFP_MUL
)
10183 /* A lot of alleged anti-flow dependences are fake,
10184 so check this one is real. */
10185 && flow_dependent_p (dep_insn
, insn
))
10191 /* Check if INSN is flow-dependent on DEP_INSN. Can also be used to check
10192 if DEP_INSN is anti-flow dependent on INSN. */
10194 flow_dependent_p (rtx insn
, rtx dep_insn
)
10196 rtx tmp
= PATTERN (insn
);
10198 note_stores (PATTERN (dep_insn
), flow_dependent_p_1
, &tmp
);
10199 return tmp
== NULL_RTX
;
10202 /* A helper function for flow_dependent_p called through note_stores. */
10204 flow_dependent_p_1 (rtx x
, const_rtx pat ATTRIBUTE_UNUSED
, void *data
)
10206 rtx
* pinsn
= (rtx
*) data
;
10208 if (*pinsn
&& reg_referenced_p (x
, *pinsn
))
10212 /* For use by sh_allocate_initial_value. Note that sh.md contains some
10213 'special function' patterns (type sfunc) that clobber pr, but that
10214 do not look like function calls to leaf_function_p. Hence we must
10215 do this extra check. */
10217 sh_pr_n_sets (void)
10219 return DF_REG_DEF_COUNT (TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
);
10222 /* Return where to allocate pseudo for a given hard register initial
10225 sh_allocate_initial_value (rtx hard_reg
)
10229 if (REGNO (hard_reg
) == (TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
))
10231 if (current_function_is_leaf
10232 && ! sh_pr_n_sets ()
10233 && ! (TARGET_SHCOMPACT
10234 && ((crtl
->args
.info
.call_cookie
10235 & ~ CALL_COOKIE_RET_TRAMP (1))
10236 || crtl
->saves_all_registers
)))
10239 x
= gen_frame_mem (Pmode
, return_address_pointer_rtx
);
10247 /* This function returns "2" to indicate dual issue for the SH4
10248 processor. To be used by the DFA pipeline description. */
10250 sh_issue_rate (void)
10252 if (TARGET_SUPERSCALAR
)
10258 /* Functions for ready queue reordering for sched1. */
10260 /* Get weight for mode for a set x. */
10262 find_set_regmode_weight (rtx x
, enum machine_mode mode
)
10264 if (GET_CODE (x
) == CLOBBER
&& register_operand (SET_DEST (x
), mode
))
10266 if (GET_CODE (x
) == SET
&& register_operand (SET_DEST (x
), mode
))
10268 if (REG_P (SET_DEST (x
)))
10270 if (!reg_mentioned_p (SET_DEST (x
), SET_SRC (x
)))
10280 /* Get regmode weight for insn. */
10282 find_insn_regmode_weight (rtx insn
, enum machine_mode mode
)
10284 short reg_weight
= 0;
10287 /* Increment weight for each register born here. */
10288 x
= PATTERN (insn
);
10289 reg_weight
+= find_set_regmode_weight (x
, mode
);
10290 if (GET_CODE (x
) == PARALLEL
)
10293 for (j
= XVECLEN (x
, 0) - 1; j
>= 0; j
--)
10295 x
= XVECEXP (PATTERN (insn
), 0, j
);
10296 reg_weight
+= find_set_regmode_weight (x
, mode
);
10299 /* Decrement weight for each register that dies here. */
10300 for (x
= REG_NOTES (insn
); x
; x
= XEXP (x
, 1))
10302 if (REG_NOTE_KIND (x
) == REG_DEAD
|| REG_NOTE_KIND (x
) == REG_UNUSED
)
10304 rtx note
= XEXP (x
, 0);
10305 if (REG_P (note
) && GET_MODE (note
) == mode
)
10312 /* Calculate regmode weights for all insns of a basic block. */
10314 find_regmode_weight (basic_block b
, enum machine_mode mode
)
10316 rtx insn
, next_tail
, head
, tail
;
10318 get_ebb_head_tail (b
, b
, &head
, &tail
);
10319 next_tail
= NEXT_INSN (tail
);
10321 for (insn
= head
; insn
!= next_tail
; insn
= NEXT_INSN (insn
))
10323 /* Handle register life information. */
10324 if (!INSN_P (insn
))
10327 if (mode
== SFmode
)
10328 INSN_REGMODE_WEIGHT (insn
, mode
) =
10329 find_insn_regmode_weight (insn
, mode
) + 2 * find_insn_regmode_weight (insn
, DFmode
);
10330 else if (mode
== SImode
)
10331 INSN_REGMODE_WEIGHT (insn
, mode
) =
10332 find_insn_regmode_weight (insn
, mode
) + 2 * find_insn_regmode_weight (insn
, DImode
);
10336 /* Comparison function for ready queue sorting. */
10338 rank_for_reorder (const void *x
, const void *y
)
10340 rtx tmp
= *(const rtx
*) y
;
10341 rtx tmp2
= *(const rtx
*) x
;
10343 /* The insn in a schedule group should be issued the first. */
10344 if (SCHED_GROUP_P (tmp
) != SCHED_GROUP_P (tmp2
))
10345 return SCHED_GROUP_P (tmp2
) ? 1 : -1;
10347 /* If insns are equally good, sort by INSN_LUID (original insn order), This
10348 minimizes instruction movement, thus minimizing sched's effect on
10349 register pressure. */
10350 return INSN_LUID (tmp
) - INSN_LUID (tmp2
);
10353 /* Resort the array A in which only element at index N may be out of order. */
10355 swap_reorder (rtx
*a
, int n
)
10357 rtx insn
= a
[n
- 1];
10360 while (i
>= 0 && rank_for_reorder (a
+ i
, &insn
) >= 0)
10368 #define SCHED_REORDER(READY, N_READY) \
10371 if ((N_READY) == 2) \
10372 swap_reorder (READY, N_READY); \
10373 else if ((N_READY) > 2) \
10374 qsort (READY, N_READY, sizeof (rtx), rank_for_reorder); \
10378 /* Sort the ready list READY by ascending priority, using the SCHED_REORDER
10381 ready_reorder (rtx
*ready
, int nready
)
10383 SCHED_REORDER (ready
, nready
);
10386 /* Count life regions of r0 for a block. */
10388 find_r0_life_regions (basic_block b
)
10397 if (REGNO_REG_SET_P (df_get_live_in (b
), R0_REG
))
10408 insn
= BB_HEAD (b
);
10410 r0_reg
= gen_rtx_REG (SImode
, R0_REG
);
10415 if (find_regno_note (insn
, REG_DEAD
, R0_REG
))
10421 && (pset
= single_set (insn
))
10422 && reg_overlap_mentioned_p (r0_reg
, SET_DEST (pset
))
10423 && !find_regno_note (insn
, REG_UNUSED
, R0_REG
))
10431 insn
= NEXT_INSN (insn
);
10433 return set
- death
;
10436 /* Calculate regmode weights for all insns of all basic block. */
10438 sh_md_init_global (FILE *dump ATTRIBUTE_UNUSED
,
10439 int verbose ATTRIBUTE_UNUSED
,
10444 regmode_weight
[0] = (short *) xcalloc (old_max_uid
, sizeof (short));
10445 regmode_weight
[1] = (short *) xcalloc (old_max_uid
, sizeof (short));
10446 r0_life_regions
= 0;
10448 FOR_EACH_BB_REVERSE (b
)
10450 find_regmode_weight (b
, SImode
);
10451 find_regmode_weight (b
, SFmode
);
10452 if (!reload_completed
)
10453 r0_life_regions
+= find_r0_life_regions (b
);
10456 CURR_REGMODE_PRESSURE (SImode
) = 0;
10457 CURR_REGMODE_PRESSURE (SFmode
) = 0;
10463 sh_md_finish_global (FILE *dump ATTRIBUTE_UNUSED
,
10464 int verbose ATTRIBUTE_UNUSED
)
10466 if (regmode_weight
[0])
10468 free (regmode_weight
[0]);
10469 regmode_weight
[0] = NULL
;
10471 if (regmode_weight
[1])
10473 free (regmode_weight
[1]);
10474 regmode_weight
[1] = NULL
;
10478 /* The scalar modes supported differs from the default version in TImode
10479 for 32-bit SHMEDIA. */
10481 sh_scalar_mode_supported_p (enum machine_mode mode
)
10483 if (TARGET_SHMEDIA32
&& mode
== TImode
)
10486 return default_scalar_mode_supported_p (mode
);
10489 /* Cache the can_issue_more so that we can return it from reorder2. Also,
10490 keep count of register pressures on SImode and SFmode. */
10492 sh_variable_issue (FILE *dump ATTRIBUTE_UNUSED
,
10493 int sched_verbose ATTRIBUTE_UNUSED
,
10495 int can_issue_more
)
10497 if (GET_CODE (PATTERN (insn
)) != USE
10498 && GET_CODE (PATTERN (insn
)) != CLOBBER
)
10499 cached_can_issue_more
= can_issue_more
- 1;
10501 cached_can_issue_more
= can_issue_more
;
10503 if (reload_completed
)
10504 return cached_can_issue_more
;
10506 CURR_REGMODE_PRESSURE (SImode
) += INSN_REGMODE_WEIGHT (insn
, SImode
);
10507 CURR_REGMODE_PRESSURE (SFmode
) += INSN_REGMODE_WEIGHT (insn
, SFmode
);
10509 return cached_can_issue_more
;
10513 sh_md_init (FILE *dump ATTRIBUTE_UNUSED
,
10514 int verbose ATTRIBUTE_UNUSED
,
10515 int veclen ATTRIBUTE_UNUSED
)
10517 CURR_REGMODE_PRESSURE (SImode
) = 0;
10518 CURR_REGMODE_PRESSURE (SFmode
) = 0;
10521 /* Some magic numbers. */
10522 /* Pressure on register r0 can lead to spill failures. so avoid sched1 for
10523 functions that already have high pressure on r0. */
10524 #define R0_MAX_LIFE_REGIONS 2
10525 /* Register Pressure thresholds for SImode and SFmode registers. */
10526 #define SIMODE_MAX_WEIGHT 5
10527 #define SFMODE_MAX_WEIGHT 10
10529 /* Return true if the pressure is high for MODE. */
10531 high_pressure (enum machine_mode mode
)
10533 /* Pressure on register r0 can lead to spill failures. so avoid sched1 for
10534 functions that already have high pressure on r0. */
10535 if (r0_life_regions
>= R0_MAX_LIFE_REGIONS
)
10538 if (mode
== SFmode
)
10539 return (CURR_REGMODE_PRESSURE (SFmode
) > SFMODE_MAX_WEIGHT
);
10541 return (CURR_REGMODE_PRESSURE (SImode
) > SIMODE_MAX_WEIGHT
);
10544 /* Reorder ready queue if register pressure is high. */
10546 sh_reorder (FILE *dump ATTRIBUTE_UNUSED
,
10547 int sched_verbose ATTRIBUTE_UNUSED
,
10550 int clock_var ATTRIBUTE_UNUSED
)
10552 if (reload_completed
)
10553 return sh_issue_rate ();
10555 if (high_pressure (SFmode
) || high_pressure (SImode
))
10557 ready_reorder (ready
, *n_readyp
);
10560 return sh_issue_rate ();
10563 /* Skip cycles if the current register pressure is high. */
10565 sh_reorder2 (FILE *dump ATTRIBUTE_UNUSED
,
10566 int sched_verbose ATTRIBUTE_UNUSED
,
10567 rtx
*ready ATTRIBUTE_UNUSED
,
10568 int *n_readyp ATTRIBUTE_UNUSED
,
10569 int clock_var ATTRIBUTE_UNUSED
)
10571 if (reload_completed
)
10572 return cached_can_issue_more
;
10574 if (high_pressure(SFmode
) || high_pressure (SImode
))
10577 return cached_can_issue_more
;
10580 /* Skip cycles without sorting the ready queue. This will move insn from
10581 Q->R. If this is the last cycle we are skipping; allow sorting of ready
10582 queue by sh_reorder. */
10584 /* Generally, skipping these many cycles are sufficient for all insns to move
10586 #define MAX_SKIPS 8
10589 sh_dfa_new_cycle (FILE *sched_dump ATTRIBUTE_UNUSED
,
10590 int sched_verbose ATTRIBUTE_UNUSED
,
10591 rtx insn ATTRIBUTE_UNUSED
,
10592 int last_clock_var
,
10596 if (reload_completed
)
10601 if ((clock_var
- last_clock_var
) < MAX_SKIPS
)
10606 /* If this is the last cycle we are skipping, allow reordering of R. */
10607 if ((clock_var
- last_clock_var
) == MAX_SKIPS
)
10619 /* SHmedia requires registers for branches, so we can't generate new
10620 branches past reload. */
10622 sh_cannot_modify_jumps_p (void)
10624 return (TARGET_SHMEDIA
&& (reload_in_progress
|| reload_completed
));
10628 sh_target_reg_class (void)
10630 return TARGET_SHMEDIA
? TARGET_REGS
: NO_REGS
;
10634 sh_optimize_target_register_callee_saved (bool after_prologue_epilogue_gen
)
10636 HARD_REG_SET dummy
;
10641 if (! shmedia_space_reserved_for_target_registers
)
10643 if (after_prologue_epilogue_gen
&& ! TARGET_SAVE_ALL_TARGET_REGS
)
10645 if (calc_live_regs (&dummy
) >= 6 * 8)
10651 sh_ms_bitfield_layout_p (const_tree record_type ATTRIBUTE_UNUSED
)
10653 return (TARGET_SH5
|| TARGET_HITACHI
|| sh_attr_renesas_p (record_type
));
10657 On the SH1..SH4, the trampoline looks like
10658 2 0002 D202 mov.l l2,r2
10659 1 0000 D301 mov.l l1,r3
10660 3 0004 422B jmp @r2
10662 5 0008 00000000 l1: .long area
10663 6 000c 00000000 l2: .long function
10665 SH5 (compact) uses r1 instead of r3 for the static chain. */
10668 /* Emit RTL insns to initialize the variable parts of a trampoline.
10669 FNADDR is an RTX for the address of the function's pure code.
10670 CXT is an RTX for the static chain value for the function. */
10673 sh_trampoline_init (rtx tramp_mem
, tree fndecl
, rtx cxt
)
10675 rtx fnaddr
= XEXP (DECL_RTL (fndecl
), 0);
10676 rtx tramp
= force_reg (Pmode
, XEXP (tramp_mem
, 0));
10678 if (TARGET_SHMEDIA64
)
10683 rtx movi1
= GEN_INT (0xcc000010);
10684 rtx shori1
= GEN_INT (0xc8000010);
10687 /* The following trampoline works within a +- 128 KB range for cxt:
10688 ptb/u cxt,tr1; movi fnaddr >> 48,r0; shori fnaddr >> 32,r0;
10689 shori fnaddr >> 16,r0; shori fnaddr,r0; ptabs/l r0,tr0
10690 gettr tr1,r1; blink tr0,r63 */
10691 /* Address rounding makes it hard to compute the exact bounds of the
10692 offset for this trampoline, but we have a rather generous offset
10693 range, so frame_offset should do fine as an upper bound. */
10694 if (cxt
== virtual_stack_vars_rtx
&& frame_offset
< 0x20000)
10696 /* ??? could optimize this trampoline initialization
10697 by writing DImode words with two insns each. */
10698 rtx mask
= force_reg (DImode
, GEN_INT (0x3fffc00));
10699 rtx insn
= gen_rtx_MINUS (DImode
, cxt
, tramp
);
10700 insn
= gen_rtx_ASHIFT (DImode
, insn
, GEN_INT (10-2));
10701 insn
= gen_rtx_AND (DImode
, insn
, mask
);
10702 /* Or in ptb/u .,tr1 pattern */
10703 insn
= gen_rtx_IOR (DImode
, insn
, gen_int_mode (0xec000010, SImode
));
10704 insn
= force_operand (insn
, NULL_RTX
);
10705 insn
= gen_lowpart (SImode
, insn
);
10706 emit_move_insn (change_address (tramp_mem
, SImode
, NULL_RTX
), insn
);
10707 insn
= gen_rtx_LSHIFTRT (DImode
, fnaddr
, GEN_INT (38));
10708 insn
= gen_rtx_AND (DImode
, insn
, mask
);
10709 insn
= force_operand (gen_rtx_IOR (DImode
, movi1
, insn
), NULL_RTX
);
10710 insn
= gen_lowpart (SImode
, insn
);
10711 emit_move_insn (adjust_address (tramp_mem
, SImode
, 4), insn
);
10712 insn
= gen_rtx_LSHIFTRT (DImode
, fnaddr
, GEN_INT (22));
10713 insn
= gen_rtx_AND (DImode
, insn
, mask
);
10714 insn
= force_operand (gen_rtx_IOR (DImode
, shori1
, insn
), NULL_RTX
);
10715 insn
= gen_lowpart (SImode
, insn
);
10716 emit_move_insn (adjust_address (tramp_mem
, SImode
, 8), insn
);
10717 insn
= gen_rtx_LSHIFTRT (DImode
, fnaddr
, GEN_INT (6));
10718 insn
= gen_rtx_AND (DImode
, insn
, mask
);
10719 insn
= force_operand (gen_rtx_IOR (DImode
, shori1
, insn
), NULL_RTX
);
10720 insn
= gen_lowpart (SImode
, insn
);
10721 emit_move_insn (adjust_address (tramp_mem
, SImode
, 12), insn
);
10722 insn
= gen_rtx_ASHIFT (DImode
, fnaddr
, GEN_INT (10));
10723 insn
= gen_rtx_AND (DImode
, insn
, mask
);
10724 insn
= force_operand (gen_rtx_IOR (DImode
, shori1
, insn
), NULL_RTX
);
10725 insn
= gen_lowpart (SImode
, insn
);
10726 emit_move_insn (adjust_address (tramp_mem
, SImode
, 16), insn
);
10727 emit_move_insn (adjust_address (tramp_mem
, SImode
, 20),
10728 GEN_INT (0x6bf10600));
10729 emit_move_insn (adjust_address (tramp_mem
, SImode
, 24),
10730 GEN_INT (0x4415fc10));
10731 emit_move_insn (adjust_address (tramp_mem
, SImode
, 28),
10732 GEN_INT (0x4401fff0));
10733 emit_insn (gen_ic_invalidate_line (tramp
));
10736 tramp_templ
= gen_rtx_SYMBOL_REF (Pmode
,"__GCC_nested_trampoline");
10737 fixed_len
= TRAMPOLINE_SIZE
- 2 * GET_MODE_SIZE (Pmode
);
10739 tramp_templ
= gen_datalabel_ref (tramp_templ
);
10741 src
= gen_const_mem (BLKmode
, tramp_templ
);
10742 set_mem_align (dst
, 256);
10743 set_mem_align (src
, 64);
10744 emit_block_move (dst
, src
, GEN_INT (fixed_len
), BLOCK_OP_NORMAL
);
10746 emit_move_insn (adjust_address (tramp_mem
, Pmode
, fixed_len
), fnaddr
);
10747 emit_move_insn (adjust_address (tramp_mem
, Pmode
,
10748 fixed_len
+ GET_MODE_SIZE (Pmode
)),
10750 emit_insn (gen_ic_invalidate_line (tramp
));
10753 else if (TARGET_SHMEDIA
)
10755 /* movi fnaddr >> 16,r1; shori fnaddr,r1; ptabs/l r1,tr0
10756 movi cxt >> 16,r1; shori cxt,r1; blink tr0,r63 */
10757 rtx quad0
= gen_reg_rtx (DImode
), cxtload
= gen_reg_rtx (DImode
);
10758 rtx quad1
= gen_reg_rtx (DImode
), quad2
= gen_reg_rtx (DImode
);
10759 /* movi 0,r1: 0xcc000010 shori 0,r1: c8000010 concatenated,
10760 rotated 10 right, and higher 16 bit of every 32 selected. */
10762 = force_reg (V2HImode
, (simplify_gen_subreg
10763 (V2HImode
, GEN_INT (0x4330432), SImode
, 0)));
10764 rtx ptabs
= force_reg (DImode
, GEN_INT (0x6bf10600));
10765 rtx blink
= force_reg (DImode
, GEN_INT (0x4401fff0));
10767 fnaddr
= force_reg (SImode
, fnaddr
);
10768 cxt
= force_reg (SImode
, cxt
);
10769 emit_insn (gen_mshflo_w_x (gen_rtx_SUBREG (V4HImode
, quad0
, 0),
10770 gen_rtx_SUBREG (V2HImode
, fnaddr
, 0),
10772 emit_insn (gen_rotrdi3_mextr (quad0
, quad0
,
10773 GEN_INT (TARGET_LITTLE_ENDIAN
? 24 : 56)));
10774 emit_insn (gen_ashldi3_media (quad0
, quad0
, const2_rtx
));
10775 emit_move_insn (change_address (tramp_mem
, DImode
, NULL_RTX
), quad0
);
10776 emit_insn (gen_mshflo_w_x (gen_rtx_SUBREG (V4HImode
, cxtload
, 0),
10777 gen_rtx_SUBREG (V2HImode
, cxt
, 0),
10779 emit_insn (gen_rotrdi3_mextr (cxtload
, cxtload
,
10780 GEN_INT (TARGET_LITTLE_ENDIAN
? 24 : 56)));
10781 emit_insn (gen_ashldi3_media (cxtload
, cxtload
, const2_rtx
));
10782 if (TARGET_LITTLE_ENDIAN
)
10784 emit_insn (gen_mshflo_l_di (quad1
, ptabs
, cxtload
));
10785 emit_insn (gen_mextr4 (quad2
, cxtload
, blink
));
10789 emit_insn (gen_mextr4 (quad1
, cxtload
, ptabs
));
10790 emit_insn (gen_mshflo_l_di (quad2
, blink
, cxtload
));
10792 emit_move_insn (adjust_address (tramp_mem
, DImode
, 8), quad1
);
10793 emit_move_insn (adjust_address (tramp_mem
, DImode
, 16), quad2
);
10794 emit_insn (gen_ic_invalidate_line (tramp
));
10797 else if (TARGET_SHCOMPACT
)
10799 emit_insn (gen_initialize_trampoline (tramp
, cxt
, fnaddr
));
10802 emit_move_insn (change_address (tramp_mem
, SImode
, NULL_RTX
),
10803 gen_int_mode (TARGET_LITTLE_ENDIAN
? 0xd301d202 : 0xd202d301,
10805 emit_move_insn (adjust_address (tramp_mem
, SImode
, 4),
10806 gen_int_mode (TARGET_LITTLE_ENDIAN
? 0x0009422b : 0x422b0009,
10808 emit_move_insn (adjust_address (tramp_mem
, SImode
, 8), cxt
);
10809 emit_move_insn (adjust_address (tramp_mem
, SImode
, 12), fnaddr
);
10810 if (TARGET_HARVARD
)
10812 if (!TARGET_INLINE_IC_INVALIDATE
10813 || (!(TARGET_SH4A_ARCH
|| TARGET_SH4_300
) && TARGET_USERMODE
))
10814 emit_library_call (function_symbol (NULL
, "__ic_invalidate",
10815 FUNCTION_ORDINARY
),
10816 LCT_NORMAL
, VOIDmode
, 1, tramp
, SImode
);
10818 emit_insn (gen_ic_invalidate_line (tramp
));
10822 /* On SH5, trampolines are SHmedia code, so add 1 to the address. */
10825 sh_trampoline_adjust_address (rtx tramp
)
10827 if (TARGET_SHMEDIA
)
10828 tramp
= expand_simple_binop (Pmode
, PLUS
, tramp
, const1_rtx
,
10829 gen_reg_rtx (Pmode
), 0, OPTAB_LIB_WIDEN
);
10833 /* FIXME: This is overly conservative. A SHcompact function that
10834 receives arguments ``by reference'' will have them stored in its
10835 own stack frame, so it must not pass pointers or references to
10836 these arguments to other functions by means of sibling calls. */
10837 /* If PIC, we cannot make sibling calls to global functions
10838 because the PLT requires r12 to be live. */
10840 sh_function_ok_for_sibcall (tree decl
, tree exp ATTRIBUTE_UNUSED
)
10843 && (! TARGET_SHCOMPACT
10844 || crtl
->args
.info
.stack_regs
== 0)
10845 && ! sh_cfun_interrupt_handler_p ()
10847 || (decl
&& ! TREE_PUBLIC (decl
))
10848 || (decl
&& DECL_VISIBILITY (decl
) != VISIBILITY_DEFAULT
)));
10851 /* Machine specific built-in functions. */
10853 struct builtin_description
10855 const enum insn_code icode
;
10856 const char *const name
;
10861 /* describe number and signedness of arguments; arg[0] == result
10862 (1: unsigned, 2: signed, 4: don't care, 8: pointer 0: no argument */
10863 /* 9: 64-bit pointer, 10: 32-bit pointer */
10864 static const char signature_args
[][4] =
10866 #define SH_BLTIN_V2SI2 0
10868 #define SH_BLTIN_V4HI2 1
10870 #define SH_BLTIN_V2SI3 2
10872 #define SH_BLTIN_V4HI3 3
10874 #define SH_BLTIN_V8QI3 4
10876 #define SH_BLTIN_MAC_HISI 5
10878 #define SH_BLTIN_SH_HI 6
10880 #define SH_BLTIN_SH_SI 7
10882 #define SH_BLTIN_V4HI2V2SI 8
10884 #define SH_BLTIN_V4HI2V8QI 9
10886 #define SH_BLTIN_SISF 10
10888 #define SH_BLTIN_LDUA_L 11
10890 #define SH_BLTIN_LDUA_Q 12
10892 #define SH_BLTIN_STUA_L 13
10894 #define SH_BLTIN_STUA_Q 14
10896 #define SH_BLTIN_LDUA_L64 15
10898 #define SH_BLTIN_LDUA_Q64 16
10900 #define SH_BLTIN_STUA_L64 17
10902 #define SH_BLTIN_STUA_Q64 18
10904 #define SH_BLTIN_NUM_SHARED_SIGNATURES 19
10905 #define SH_BLTIN_2 19
10906 #define SH_BLTIN_SU 19
10908 #define SH_BLTIN_3 20
10909 #define SH_BLTIN_SUS 20
10911 #define SH_BLTIN_PSSV 21
10913 #define SH_BLTIN_XXUU 22
10914 #define SH_BLTIN_UUUU 22
10916 #define SH_BLTIN_PV 23
10919 /* mcmv: operands considered unsigned. */
10920 /* mmulsum_wq, msad_ubq: result considered unsigned long long. */
10921 /* mperm: control value considered unsigned int. */
10922 /* mshalds, mshard, mshards, mshlld, mshlrd: shift count is unsigned int. */
10923 /* mshards_q: returns signed short. */
10924 /* nsb: takes long long arg, returns unsigned char. */
10925 static struct builtin_description bdesc
[] =
10927 { CODE_FOR_absv2si2
, "__builtin_absv2si2", SH_BLTIN_V2SI2
, 0 },
10928 { CODE_FOR_absv4hi2
, "__builtin_absv4hi2", SH_BLTIN_V4HI2
, 0 },
10929 { CODE_FOR_addv2si3
, "__builtin_addv2si3", SH_BLTIN_V2SI3
, 0 },
10930 { CODE_FOR_addv4hi3
, "__builtin_addv4hi3", SH_BLTIN_V4HI3
, 0 },
10931 { CODE_FOR_ssaddv2si3
,"__builtin_ssaddv2si3", SH_BLTIN_V2SI3
, 0 },
10932 { CODE_FOR_usaddv8qi3
,"__builtin_usaddv8qi3", SH_BLTIN_V8QI3
, 0 },
10933 { CODE_FOR_ssaddv4hi3
,"__builtin_ssaddv4hi3", SH_BLTIN_V4HI3
, 0 },
10934 { CODE_FOR_alloco_i
, "__builtin_sh_media_ALLOCO", SH_BLTIN_PV
, 0 },
10935 { CODE_FOR_negcmpeqv8qi
,"__builtin_sh_media_MCMPEQ_B", SH_BLTIN_V8QI3
, 0 },
10936 { CODE_FOR_negcmpeqv2si
,"__builtin_sh_media_MCMPEQ_L", SH_BLTIN_V2SI3
, 0 },
10937 { CODE_FOR_negcmpeqv4hi
,"__builtin_sh_media_MCMPEQ_W", SH_BLTIN_V4HI3
, 0 },
10938 { CODE_FOR_negcmpgtuv8qi
,"__builtin_sh_media_MCMPGT_UB", SH_BLTIN_V8QI3
, 0 },
10939 { CODE_FOR_negcmpgtv2si
,"__builtin_sh_media_MCMPGT_L", SH_BLTIN_V2SI3
, 0 },
10940 { CODE_FOR_negcmpgtv4hi
,"__builtin_sh_media_MCMPGT_W", SH_BLTIN_V4HI3
, 0 },
10941 { CODE_FOR_mcmv
, "__builtin_sh_media_MCMV", SH_BLTIN_UUUU
, 0 },
10942 { CODE_FOR_mcnvs_lw
, "__builtin_sh_media_MCNVS_LW", SH_BLTIN_3
, 0 },
10943 { CODE_FOR_mcnvs_wb
, "__builtin_sh_media_MCNVS_WB", SH_BLTIN_V4HI2V8QI
, 0 },
10944 { CODE_FOR_mcnvs_wub
, "__builtin_sh_media_MCNVS_WUB", SH_BLTIN_V4HI2V8QI
, 0 },
10945 { CODE_FOR_mextr1
, "__builtin_sh_media_MEXTR1", SH_BLTIN_V8QI3
, 0 },
10946 { CODE_FOR_mextr2
, "__builtin_sh_media_MEXTR2", SH_BLTIN_V8QI3
, 0 },
10947 { CODE_FOR_mextr3
, "__builtin_sh_media_MEXTR3", SH_BLTIN_V8QI3
, 0 },
10948 { CODE_FOR_mextr4
, "__builtin_sh_media_MEXTR4", SH_BLTIN_V8QI3
, 0 },
10949 { CODE_FOR_mextr5
, "__builtin_sh_media_MEXTR5", SH_BLTIN_V8QI3
, 0 },
10950 { CODE_FOR_mextr6
, "__builtin_sh_media_MEXTR6", SH_BLTIN_V8QI3
, 0 },
10951 { CODE_FOR_mextr7
, "__builtin_sh_media_MEXTR7", SH_BLTIN_V8QI3
, 0 },
10952 { CODE_FOR_mmacfx_wl
, "__builtin_sh_media_MMACFX_WL", SH_BLTIN_MAC_HISI
, 0 },
10953 { CODE_FOR_mmacnfx_wl
,"__builtin_sh_media_MMACNFX_WL", SH_BLTIN_MAC_HISI
, 0 },
10954 { CODE_FOR_mulv2si3
, "__builtin_mulv2si3", SH_BLTIN_V2SI3
, 0 },
10955 { CODE_FOR_mulv4hi3
, "__builtin_mulv4hi3", SH_BLTIN_V4HI3
, 0 },
10956 { CODE_FOR_mmulfx_l
, "__builtin_sh_media_MMULFX_L", SH_BLTIN_V2SI3
, 0 },
10957 { CODE_FOR_mmulfx_w
, "__builtin_sh_media_MMULFX_W", SH_BLTIN_V4HI3
, 0 },
10958 { CODE_FOR_mmulfxrp_w
,"__builtin_sh_media_MMULFXRP_W", SH_BLTIN_V4HI3
, 0 },
10959 { CODE_FOR_mmulhi_wl
, "__builtin_sh_media_MMULHI_WL", SH_BLTIN_V4HI2V2SI
, 0 },
10960 { CODE_FOR_mmullo_wl
, "__builtin_sh_media_MMULLO_WL", SH_BLTIN_V4HI2V2SI
, 0 },
10961 { CODE_FOR_mmulsum_wq
,"__builtin_sh_media_MMULSUM_WQ", SH_BLTIN_XXUU
, 0 },
10962 { CODE_FOR_mperm_w
, "__builtin_sh_media_MPERM_W", SH_BLTIN_SH_HI
, 0 },
10963 { CODE_FOR_msad_ubq
, "__builtin_sh_media_MSAD_UBQ", SH_BLTIN_XXUU
, 0 },
10964 { CODE_FOR_mshalds_l
, "__builtin_sh_media_MSHALDS_L", SH_BLTIN_SH_SI
, 0 },
10965 { CODE_FOR_mshalds_w
, "__builtin_sh_media_MSHALDS_W", SH_BLTIN_SH_HI
, 0 },
10966 { CODE_FOR_ashrv2si3
, "__builtin_ashrv2si3", SH_BLTIN_SH_SI
, 0 },
10967 { CODE_FOR_ashrv4hi3
, "__builtin_ashrv4hi3", SH_BLTIN_SH_HI
, 0 },
10968 { CODE_FOR_mshards_q
, "__builtin_sh_media_MSHARDS_Q", SH_BLTIN_SUS
, 0 },
10969 { CODE_FOR_mshfhi_b
, "__builtin_sh_media_MSHFHI_B", SH_BLTIN_V8QI3
, 0 },
10970 { CODE_FOR_mshfhi_l
, "__builtin_sh_media_MSHFHI_L", SH_BLTIN_V2SI3
, 0 },
10971 { CODE_FOR_mshfhi_w
, "__builtin_sh_media_MSHFHI_W", SH_BLTIN_V4HI3
, 0 },
10972 { CODE_FOR_mshflo_b
, "__builtin_sh_media_MSHFLO_B", SH_BLTIN_V8QI3
, 0 },
10973 { CODE_FOR_mshflo_l
, "__builtin_sh_media_MSHFLO_L", SH_BLTIN_V2SI3
, 0 },
10974 { CODE_FOR_mshflo_w
, "__builtin_sh_media_MSHFLO_W", SH_BLTIN_V4HI3
, 0 },
10975 { CODE_FOR_ashlv2si3
, "__builtin_ashlv2si3", SH_BLTIN_SH_SI
, 0 },
10976 { CODE_FOR_ashlv4hi3
, "__builtin_ashlv4hi3", SH_BLTIN_SH_HI
, 0 },
10977 { CODE_FOR_lshrv2si3
, "__builtin_lshrv2si3", SH_BLTIN_SH_SI
, 0 },
10978 { CODE_FOR_lshrv4hi3
, "__builtin_lshrv4hi3", SH_BLTIN_SH_HI
, 0 },
10979 { CODE_FOR_subv2si3
, "__builtin_subv2si3", SH_BLTIN_V2SI3
, 0 },
10980 { CODE_FOR_subv4hi3
, "__builtin_subv4hi3", SH_BLTIN_V4HI3
, 0 },
10981 { CODE_FOR_sssubv2si3
,"__builtin_sssubv2si3", SH_BLTIN_V2SI3
, 0 },
10982 { CODE_FOR_ussubv8qi3
,"__builtin_ussubv8qi3", SH_BLTIN_V8QI3
, 0 },
10983 { CODE_FOR_sssubv4hi3
,"__builtin_sssubv4hi3", SH_BLTIN_V4HI3
, 0 },
10984 { CODE_FOR_fcosa_s
, "__builtin_sh_media_FCOSA_S", SH_BLTIN_SISF
, 0 },
10985 { CODE_FOR_fsina_s
, "__builtin_sh_media_FSINA_S", SH_BLTIN_SISF
, 0 },
10986 { CODE_FOR_fipr
, "__builtin_sh_media_FIPR_S", SH_BLTIN_3
, 0 },
10987 { CODE_FOR_ftrv
, "__builtin_sh_media_FTRV_S", SH_BLTIN_3
, 0 },
10988 { CODE_FOR_mac_media
, "__builtin_sh_media_FMAC_S", SH_BLTIN_3
, 0 },
10989 { CODE_FOR_sqrtdf2
, "__builtin_sh_media_FSQRT_D", SH_BLTIN_2
, 0 },
10990 { CODE_FOR_sqrtsf2
, "__builtin_sh_media_FSQRT_S", SH_BLTIN_2
, 0 },
10991 { CODE_FOR_fsrra_s
, "__builtin_sh_media_FSRRA_S", SH_BLTIN_2
, 0 },
10992 { CODE_FOR_ldhi_l
, "__builtin_sh_media_LDHI_L", SH_BLTIN_LDUA_L
, 0 },
10993 { CODE_FOR_ldhi_q
, "__builtin_sh_media_LDHI_Q", SH_BLTIN_LDUA_Q
, 0 },
10994 { CODE_FOR_ldlo_l
, "__builtin_sh_media_LDLO_L", SH_BLTIN_LDUA_L
, 0 },
10995 { CODE_FOR_ldlo_q
, "__builtin_sh_media_LDLO_Q", SH_BLTIN_LDUA_Q
, 0 },
10996 { CODE_FOR_sthi_l
, "__builtin_sh_media_STHI_L", SH_BLTIN_STUA_L
, 0 },
10997 { CODE_FOR_sthi_q
, "__builtin_sh_media_STHI_Q", SH_BLTIN_STUA_Q
, 0 },
10998 { CODE_FOR_stlo_l
, "__builtin_sh_media_STLO_L", SH_BLTIN_STUA_L
, 0 },
10999 { CODE_FOR_stlo_q
, "__builtin_sh_media_STLO_Q", SH_BLTIN_STUA_Q
, 0 },
11000 { CODE_FOR_ldhi_l64
, "__builtin_sh_media_LDHI_L", SH_BLTIN_LDUA_L64
, 0 },
11001 { CODE_FOR_ldhi_q64
, "__builtin_sh_media_LDHI_Q", SH_BLTIN_LDUA_Q64
, 0 },
11002 { CODE_FOR_ldlo_l64
, "__builtin_sh_media_LDLO_L", SH_BLTIN_LDUA_L64
, 0 },
11003 { CODE_FOR_ldlo_q64
, "__builtin_sh_media_LDLO_Q", SH_BLTIN_LDUA_Q64
, 0 },
11004 { CODE_FOR_sthi_l64
, "__builtin_sh_media_STHI_L", SH_BLTIN_STUA_L64
, 0 },
11005 { CODE_FOR_sthi_q64
, "__builtin_sh_media_STHI_Q", SH_BLTIN_STUA_Q64
, 0 },
11006 { CODE_FOR_stlo_l64
, "__builtin_sh_media_STLO_L", SH_BLTIN_STUA_L64
, 0 },
11007 { CODE_FOR_stlo_q64
, "__builtin_sh_media_STLO_Q", SH_BLTIN_STUA_Q64
, 0 },
11008 { CODE_FOR_nsb
, "__builtin_sh_media_NSB", SH_BLTIN_SU
, 0 },
11009 { CODE_FOR_byterev
, "__builtin_sh_media_BYTEREV", SH_BLTIN_2
, 0 },
11010 { CODE_FOR_prefetch
, "__builtin_sh_media_PREFO", SH_BLTIN_PSSV
, 0 },
11014 sh_media_init_builtins (void)
11016 tree shared
[SH_BLTIN_NUM_SHARED_SIGNATURES
];
11017 struct builtin_description
*d
;
11019 memset (shared
, 0, sizeof shared
);
11020 for (d
= bdesc
; d
- bdesc
< (int) ARRAY_SIZE (bdesc
); d
++)
11022 tree type
, arg_type
= 0;
11023 int signature
= d
->signature
;
11026 if (signature
< SH_BLTIN_NUM_SHARED_SIGNATURES
&& shared
[signature
])
11027 type
= shared
[signature
];
11030 int has_result
= signature_args
[signature
][0] != 0;
11032 if ((signature_args
[signature
][1] & 8)
11033 && (((signature_args
[signature
][1] & 1) && TARGET_SHMEDIA32
)
11034 || ((signature_args
[signature
][1] & 2) && TARGET_SHMEDIA64
)))
11036 if (! TARGET_FPU_ANY
11037 && FLOAT_MODE_P (insn_data
[d
->icode
].operand
[0].mode
))
11039 type
= void_list_node
;
11042 int arg
= signature_args
[signature
][i
];
11043 int opno
= i
- 1 + has_result
;
11046 arg_type
= ptr_type_node
;
11048 arg_type
= (*lang_hooks
.types
.type_for_mode
)
11049 (insn_data
[d
->icode
].operand
[opno
].mode
,
11054 arg_type
= void_type_node
;
11057 type
= tree_cons (NULL_TREE
, arg_type
, type
);
11059 type
= build_function_type (arg_type
, type
);
11060 if (signature
< SH_BLTIN_NUM_SHARED_SIGNATURES
)
11061 shared
[signature
] = type
;
11064 add_builtin_function (d
->name
, type
, d
- bdesc
, BUILT_IN_MD
,
11069 /* Returns the shmedia builtin decl for CODE. */
11072 sh_media_builtin_decl (unsigned code
, bool initialize_p ATTRIBUTE_UNUSED
)
11074 if (code
>= ARRAY_SIZE (bdesc
))
11075 return error_mark_node
;
11077 return bdesc
[code
].fndecl
;
11080 /* Implements target hook vector_mode_supported_p. */
11082 sh_vector_mode_supported_p (enum machine_mode mode
)
11085 && ((mode
== V2SFmode
)
11086 || (mode
== V4SFmode
)
11087 || (mode
== V16SFmode
)))
11090 else if (TARGET_SHMEDIA
11091 && ((mode
== V8QImode
)
11092 || (mode
== V2HImode
)
11093 || (mode
== V4HImode
)
11094 || (mode
== V2SImode
)))
11101 sh_frame_pointer_required (void)
11103 /* If needed override this in other tm.h files to cope with various OS
11104 lossage requiring a frame pointer. */
11105 if (SUBTARGET_FRAME_POINTER_REQUIRED
)
11114 /* Implements target hook dwarf_calling_convention. Return an enum
11115 of dwarf_calling_convention. */
11117 sh_dwarf_calling_convention (const_tree func
)
11119 if (sh_attr_renesas_p (func
))
11120 return DW_CC_GNU_renesas_sh
;
11122 return DW_CC_normal
;
11126 sh_init_builtins (void)
11128 if (TARGET_SHMEDIA
)
11129 sh_media_init_builtins ();
11132 /* Returns the sh builtin decl for CODE. */
11135 sh_builtin_decl (unsigned code
, bool initialize_p ATTRIBUTE_UNUSED
)
11137 if (TARGET_SHMEDIA
)
11138 return sh_media_builtin_decl (code
, initialize_p
);
11140 return error_mark_node
;
11143 /* Expand an expression EXP that calls a built-in function,
11144 with result going to TARGET if that's convenient
11145 (and in mode MODE if that's convenient).
11146 SUBTARGET may be used as the target for computing one of EXP's operands.
11147 IGNORE is nonzero if the value is to be ignored. */
11150 sh_expand_builtin (tree exp
, rtx target
, rtx subtarget ATTRIBUTE_UNUSED
,
11151 enum machine_mode mode ATTRIBUTE_UNUSED
, int ignore
)
11153 tree fndecl
= TREE_OPERAND (CALL_EXPR_FN (exp
), 0);
11154 unsigned int fcode
= DECL_FUNCTION_CODE (fndecl
);
11155 const struct builtin_description
*d
= &bdesc
[fcode
];
11156 enum insn_code icode
= d
->icode
;
11157 int signature
= d
->signature
;
11158 enum machine_mode tmode
= VOIDmode
;
11163 if (signature_args
[signature
][0])
11168 tmode
= insn_data
[icode
].operand
[0].mode
;
11170 || GET_MODE (target
) != tmode
11171 || ! (*insn_data
[icode
].operand
[0].predicate
) (target
, tmode
))
11172 target
= gen_reg_rtx (tmode
);
11173 op
[nop
++] = target
;
11178 for (i
= 1; i
<= 3; i
++, nop
++)
11181 enum machine_mode opmode
, argmode
;
11184 if (! signature_args
[signature
][i
])
11186 arg
= CALL_EXPR_ARG (exp
, i
- 1);
11187 if (arg
== error_mark_node
)
11189 if (signature_args
[signature
][i
] & 8)
11192 optype
= ptr_type_node
;
11196 opmode
= insn_data
[icode
].operand
[nop
].mode
;
11197 optype
= (*lang_hooks
.types
.type_for_mode
) (opmode
, 0);
11199 argmode
= TYPE_MODE (TREE_TYPE (arg
));
11200 if (argmode
!= opmode
)
11201 arg
= build1 (NOP_EXPR
, optype
, arg
);
11202 op
[nop
] = expand_expr (arg
, NULL_RTX
, opmode
, EXPAND_NORMAL
);
11203 if (! (*insn_data
[icode
].operand
[nop
].predicate
) (op
[nop
], opmode
))
11204 op
[nop
] = copy_to_mode_reg (opmode
, op
[nop
]);
11210 pat
= (*insn_data
[d
->icode
].genfun
) (op
[0]);
11213 pat
= (*insn_data
[d
->icode
].genfun
) (op
[0], op
[1]);
11216 pat
= (*insn_data
[d
->icode
].genfun
) (op
[0], op
[1], op
[2]);
11219 pat
= (*insn_data
[d
->icode
].genfun
) (op
[0], op
[1], op
[2], op
[3]);
11222 gcc_unreachable ();
11231 sh_expand_unop_v2sf (enum rtx_code code
, rtx op0
, rtx op1
)
11233 rtx sel0
= const0_rtx
;
11234 rtx sel1
= const1_rtx
;
11235 rtx (*fn
) (rtx
, rtx
, rtx
, rtx
, rtx
) = gen_unary_sf_op
;
11236 rtx op
= gen_rtx_fmt_e (code
, SFmode
, op1
);
11238 emit_insn ((*fn
) (op0
, op1
, op
, sel0
, sel0
));
11239 emit_insn ((*fn
) (op0
, op1
, op
, sel1
, sel1
));
11243 sh_expand_binop_v2sf (enum rtx_code code
, rtx op0
, rtx op1
, rtx op2
)
11245 rtx op
= gen_rtx_fmt_ee (code
, SFmode
, op1
, op2
);
11247 emit_insn (gen_binary_sf_op0 (op0
, op1
, op2
, op
));
11248 emit_insn (gen_binary_sf_op1 (op0
, op1
, op2
, op
));
11251 /* Return true if hard register REGNO can hold a value of machine-mode MODE.
11252 We can allow any mode in any general register. The special registers
11253 only allow SImode. Don't allow any mode in the PR.
11255 We cannot hold DCmode values in the XD registers because alter_reg
11256 handles subregs of them incorrectly. We could work around this by
11257 spacing the XD registers like the DR registers, but this would require
11258 additional memory in every compilation to hold larger register vectors.
11259 We could hold SFmode / SCmode values in XD registers, but that
11260 would require a tertiary reload when reloading from / to memory,
11261 and a secondary reload to reload from / to general regs; that
11262 seems to be a loosing proposition.
11264 We want to allow TImode FP regs so that when V4SFmode is loaded as TImode,
11265 it won't be ferried through GP registers first. */
11268 sh_hard_regno_mode_ok (unsigned int regno
, enum machine_mode mode
)
11270 if (SPECIAL_REGISTER_P (regno
))
11271 return mode
== SImode
;
11273 if (regno
== FPUL_REG
)
11274 return (mode
== SImode
|| mode
== SFmode
);
11276 if (FP_REGISTER_P (regno
) && mode
== SFmode
)
11279 if (mode
== V2SFmode
)
11281 if (((FP_REGISTER_P (regno
) && (regno
- FIRST_FP_REG
) % 2 == 0)
11282 || GENERAL_REGISTER_P (regno
)))
11288 if (mode
== V4SFmode
)
11290 if ((FP_REGISTER_P (regno
) && (regno
- FIRST_FP_REG
) % 4 == 0)
11291 || GENERAL_REGISTER_P (regno
))
11297 if (mode
== V16SFmode
)
11299 if (TARGET_SHMEDIA
)
11301 if (FP_REGISTER_P (regno
) && (regno
- FIRST_FP_REG
) % 16 == 0)
11307 return regno
== FIRST_XD_REG
;
11310 if (FP_REGISTER_P (regno
))
11314 || ((TARGET_SH2E
|| TARGET_SHMEDIA
) && mode
== SCmode
)
11315 || ((((TARGET_SH4
|| TARGET_SH2A_DOUBLE
) && mode
== DFmode
)
11318 && (mode
== DFmode
|| mode
== DImode
11319 || mode
== V2SFmode
|| mode
== TImode
)))
11320 && ((regno
- FIRST_FP_REG
) & 1) == 0)
11321 || ((TARGET_SH4
|| TARGET_SHMEDIA
) && mode
== TImode
11322 && ((regno
- FIRST_FP_REG
) & 3) == 0))
11328 if (XD_REGISTER_P (regno
))
11329 return mode
== DFmode
;
11331 if (TARGET_REGISTER_P (regno
))
11332 return (mode
== DImode
|| mode
== SImode
|| mode
== PDImode
);
11334 if (regno
== PR_REG
)
11335 return mode
== SImode
;
11337 if (regno
== FPSCR_REG
)
11338 return mode
== PSImode
;
11340 /* FIXME. This works around PR target/37633 for -O0. */
11341 if (!optimize
&& TARGET_SHMEDIA32
&& GET_MODE_SIZE (mode
) > 4)
11343 unsigned int n
= GET_MODE_SIZE (mode
) / 8;
11345 if (regno
>= FIRST_GENERAL_REG
+ 10 - n
+ 1
11346 && regno
<= FIRST_GENERAL_REG
+ 14)
11353 /* Return the class of registers for which a mode change from FROM to TO
11356 sh_cannot_change_mode_class (enum machine_mode from
, enum machine_mode to
,
11357 enum reg_class rclass
)
11359 /* We want to enable the use of SUBREGs as a means to
11360 VEC_SELECT a single element of a vector. */
11361 if (to
== SFmode
&& VECTOR_MODE_P (from
) && GET_MODE_INNER (from
) == SFmode
)
11362 return (reg_classes_intersect_p (GENERAL_REGS
, rclass
));
11364 if (GET_MODE_SIZE (from
) != GET_MODE_SIZE (to
))
11366 if (TARGET_LITTLE_ENDIAN
)
11368 if (GET_MODE_SIZE (to
) < 8 || GET_MODE_SIZE (from
) < 8)
11369 return reg_classes_intersect_p (DF_REGS
, rclass
);
11373 if (GET_MODE_SIZE (from
) < 8)
11374 return reg_classes_intersect_p (DF_HI_REGS
, rclass
);
11380 /* Return true if registers in machine mode MODE will likely be
11381 allocated to registers in small register classes. */
11384 sh_small_register_classes_for_mode_p (enum machine_mode mode ATTRIBUTE_UNUSED
)
11386 return (! TARGET_SHMEDIA
);
11389 /* If ADDRESS refers to a CODE_LABEL, add NUSES to the number of times
11390 that label is used. */
11393 sh_mark_label (rtx address
, int nuses
)
11395 if (GOTOFF_P (address
))
11397 /* Extract the label or symbol. */
11398 address
= XEXP (address
, 0);
11399 if (GET_CODE (address
) == PLUS
)
11400 address
= XEXP (address
, 0);
11401 address
= XVECEXP (address
, 0, 0);
11403 if (GET_CODE (address
) == LABEL_REF
11404 && LABEL_P (XEXP (address
, 0)))
11405 LABEL_NUSES (XEXP (address
, 0)) += nuses
;
11408 /* Compute extra cost of moving data between one register class
11411 /* If SECONDARY*_RELOAD_CLASS says something about the src/dst pair, regclass
11412 uses this information. Hence, the general register <-> floating point
11413 register information here is not used for SFmode. */
11416 sh_register_move_cost (enum machine_mode mode
,
11417 reg_class_t srcclass
, reg_class_t dstclass
)
11419 if (dstclass
== T_REGS
|| dstclass
== PR_REGS
)
11422 if (dstclass
== MAC_REGS
&& srcclass
== MAC_REGS
)
11425 if (mode
== SImode
&& ! TARGET_SHMEDIA
&& TARGET_FMOVD
11426 && REGCLASS_HAS_FP_REG (srcclass
)
11427 && REGCLASS_HAS_FP_REG (dstclass
))
11430 if (REGCLASS_HAS_FP_REG (dstclass
) && srcclass
== T_REGS
)
11431 return ((TARGET_HARD_SH4
&& !optimize_size
) ? 10 : 7);
11433 if ((REGCLASS_HAS_FP_REG (dstclass
) && srcclass
== MAC_REGS
)
11434 || (dstclass
== MAC_REGS
&& REGCLASS_HAS_FP_REG (srcclass
)))
11437 if ((REGCLASS_HAS_FP_REG (dstclass
)
11438 && REGCLASS_HAS_GENERAL_REG (srcclass
))
11439 || (REGCLASS_HAS_GENERAL_REG (dstclass
)
11440 && REGCLASS_HAS_FP_REG (srcclass
)))
11441 return ((TARGET_SHMEDIA
? 4 : TARGET_FMOVD
? 8 : 12)
11442 * ((GET_MODE_SIZE (mode
) + 7) / 8U));
11444 if ((dstclass
== FPUL_REGS
11445 && REGCLASS_HAS_GENERAL_REG (srcclass
))
11446 || (srcclass
== FPUL_REGS
11447 && REGCLASS_HAS_GENERAL_REG (dstclass
)))
11450 if ((dstclass
== FPUL_REGS
11451 && (srcclass
== PR_REGS
|| srcclass
== MAC_REGS
|| srcclass
== T_REGS
))
11452 || (srcclass
== FPUL_REGS
11453 && (dstclass
== PR_REGS
|| dstclass
== MAC_REGS
)))
11456 if ((srcclass
== TARGET_REGS
&& ! REGCLASS_HAS_GENERAL_REG (dstclass
))
11457 || ((dstclass
) == TARGET_REGS
&& ! REGCLASS_HAS_GENERAL_REG (srcclass
)))
11460 /* ??? ptabs faults on (value & 0x3) == 0x3 */
11462 && ((srcclass
) == TARGET_REGS
|| (srcclass
) == SIBCALL_REGS
))
11464 if (sh_gettrcost
>= 0)
11465 return sh_gettrcost
;
11466 else if (!TARGET_PT_FIXED
)
11470 if ((srcclass
== FPSCR_REGS
&& ! REGCLASS_HAS_GENERAL_REG (dstclass
))
11471 || (dstclass
== FPSCR_REGS
&& ! REGCLASS_HAS_GENERAL_REG (srcclass
)))
11476 && ! REGCLASS_HAS_GENERAL_REG (srcclass
)
11477 && ! REGCLASS_HAS_GENERAL_REG (dstclass
)))
11478 return 2 * ((GET_MODE_SIZE (mode
) + 7) / 8U);
11480 return 2 * ((GET_MODE_SIZE (mode
) + 3) / 4U);
11483 static rtx
emit_load_ptr (rtx
, rtx
);
11486 emit_load_ptr (rtx reg
, rtx addr
)
11488 rtx mem
= gen_const_mem (ptr_mode
, addr
);
11490 if (Pmode
!= ptr_mode
)
11491 mem
= gen_rtx_SIGN_EXTEND (Pmode
, mem
);
11492 return emit_move_insn (reg
, mem
);
11496 sh_output_mi_thunk (FILE *file
, tree thunk_fndecl ATTRIBUTE_UNUSED
,
11497 HOST_WIDE_INT delta
, HOST_WIDE_INT vcall_offset
,
11500 CUMULATIVE_ARGS cum
;
11501 int structure_value_byref
= 0;
11502 rtx this_rtx
, this_value
, sibcall
, insns
, funexp
;
11503 tree funtype
= TREE_TYPE (function
);
11504 int simple_add
= CONST_OK_FOR_ADD (delta
);
11506 rtx scratch0
, scratch1
, scratch2
;
11509 reload_completed
= 1;
11510 epilogue_completed
= 1;
11511 current_function_uses_only_leaf_regs
= 1;
11513 emit_note (NOTE_INSN_PROLOGUE_END
);
11515 /* Find the "this" pointer. We have such a wide range of ABIs for the
11516 SH that it's best to do this completely machine independently.
11517 "this" is passed as first argument, unless a structure return pointer
11518 comes first, in which case "this" comes second. */
11519 INIT_CUMULATIVE_ARGS (cum
, funtype
, NULL_RTX
, 0, 1);
11520 #ifndef PCC_STATIC_STRUCT_RETURN
11521 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function
)), function
))
11522 structure_value_byref
= 1;
11523 #endif /* not PCC_STATIC_STRUCT_RETURN */
11524 if (structure_value_byref
&& sh_struct_value_rtx (function
, 0) == 0)
11526 tree ptype
= build_pointer_type (TREE_TYPE (funtype
));
11528 sh_function_arg_advance (&cum
, Pmode
, ptype
, true);
11530 this_rtx
= sh_function_arg (&cum
, Pmode
, ptr_type_node
, true);
11532 /* For SHcompact, we only have r0 for a scratch register: r1 is the
11533 static chain pointer (even if you can't have nested virtual functions
11534 right now, someone might implement them sometime), and the rest of the
11535 registers are used for argument passing, are callee-saved, or reserved. */
11536 /* We need to check call_used_regs / fixed_regs in case -fcall_saved-reg /
11537 -ffixed-reg has been used. */
11538 if (! call_used_regs
[0] || fixed_regs
[0])
11539 error ("r0 needs to be available as a call-clobbered register");
11540 scratch0
= scratch1
= scratch2
= gen_rtx_REG (Pmode
, 0);
11543 if (call_used_regs
[1] && ! fixed_regs
[1])
11544 scratch1
= gen_rtx_REG (ptr_mode
, 1);
11545 /* N.B., if not TARGET_HITACHI, register 2 is used to pass the pointer
11546 pointing where to return struct values. */
11547 if (call_used_regs
[3] && ! fixed_regs
[3])
11548 scratch2
= gen_rtx_REG (Pmode
, 3);
11550 else if (TARGET_SHMEDIA
)
11552 for (i
= FIRST_GENERAL_REG
; i
<= LAST_GENERAL_REG
; i
++)
11553 if (i
!= REGNO (scratch0
) &&
11554 call_used_regs
[i
] && ! fixed_regs
[i
] && ! FUNCTION_ARG_REGNO_P (i
))
11556 scratch1
= gen_rtx_REG (ptr_mode
, i
);
11559 if (scratch1
== scratch0
)
11560 error ("Need a second call-clobbered general purpose register");
11561 for (i
= FIRST_TARGET_REG
; i
<= LAST_TARGET_REG
; i
++)
11562 if (call_used_regs
[i
] && ! fixed_regs
[i
])
11564 scratch2
= gen_rtx_REG (Pmode
, i
);
11567 if (scratch2
== scratch0
)
11568 error ("Need a call-clobbered target register");
11571 this_value
= plus_constant (this_rtx
, delta
);
11573 && (simple_add
|| scratch0
!= scratch1
)
11574 && strict_memory_address_p (ptr_mode
, this_value
))
11576 emit_load_ptr (scratch0
, this_value
);
11581 ; /* Do nothing. */
11582 else if (simple_add
)
11583 emit_move_insn (this_rtx
, this_value
);
11586 emit_move_insn (scratch1
, GEN_INT (delta
));
11587 emit_insn (gen_add2_insn (this_rtx
, scratch1
));
11595 emit_load_ptr (scratch0
, this_rtx
);
11597 offset_addr
= plus_constant (scratch0
, vcall_offset
);
11598 if (strict_memory_address_p (ptr_mode
, offset_addr
))
11599 ; /* Do nothing. */
11600 else if (! TARGET_SH5
&& scratch0
!= scratch1
)
11602 /* scratch0 != scratch1, and we have indexed loads. Get better
11603 schedule by loading the offset into r1 and using an indexed
11604 load - then the load of r1 can issue before the load from
11605 (this_rtx + delta) finishes. */
11606 emit_move_insn (scratch1
, GEN_INT (vcall_offset
));
11607 offset_addr
= gen_rtx_PLUS (Pmode
, scratch0
, scratch1
);
11609 else if (CONST_OK_FOR_ADD (vcall_offset
))
11611 emit_insn (gen_add2_insn (scratch0
, GEN_INT (vcall_offset
)));
11612 offset_addr
= scratch0
;
11614 else if (scratch0
!= scratch1
)
11616 emit_move_insn (scratch1
, GEN_INT (vcall_offset
));
11617 emit_insn (gen_add2_insn (scratch0
, scratch1
));
11618 offset_addr
= scratch0
;
11621 gcc_unreachable (); /* FIXME */
11622 emit_load_ptr (scratch0
, offset_addr
);
11624 if (Pmode
!= ptr_mode
)
11625 scratch0
= gen_rtx_TRUNCATE (ptr_mode
, scratch0
);
11626 emit_insn (gen_add2_insn (this_rtx
, scratch0
));
11629 /* Generate a tail call to the target function. */
11630 if (! TREE_USED (function
))
11632 assemble_external (function
);
11633 TREE_USED (function
) = 1;
11635 funexp
= XEXP (DECL_RTL (function
), 0);
11636 /* If the function is overridden, so is the thunk, hence we don't
11637 need GOT addressing even if this is a public symbol. */
11639 if (TARGET_SH1
&& ! flag_weak
)
11640 sibcall
= gen_sibcalli_thunk (funexp
, const0_rtx
);
11643 if (TARGET_SH2
&& flag_pic
)
11645 sibcall
= gen_sibcall_pcrel (funexp
, const0_rtx
);
11646 XEXP (XVECEXP (sibcall
, 0, 2), 0) = scratch2
;
11650 if (TARGET_SHMEDIA
&& flag_pic
)
11652 funexp
= gen_sym2PIC (funexp
);
11653 PUT_MODE (funexp
, Pmode
);
11655 emit_move_insn (scratch2
, funexp
);
11656 funexp
= gen_rtx_MEM (FUNCTION_MODE
, scratch2
);
11657 sibcall
= gen_sibcall (funexp
, const0_rtx
, NULL_RTX
);
11659 sibcall
= emit_call_insn (sibcall
);
11660 SIBLING_CALL_P (sibcall
) = 1;
11661 use_reg (&CALL_INSN_FUNCTION_USAGE (sibcall
), this_rtx
);
11664 /* Run just enough of rest_of_compilation to do scheduling and get
11665 the insns emitted. Note that use_thunk calls
11666 assemble_start_function and assemble_end_function. */
11668 insn_locators_alloc ();
11669 insns
= get_insns ();
11675 split_all_insns_noflow ();
11680 if (optimize
> 0 && flag_delayed_branch
)
11681 dbr_schedule (insns
);
11683 shorten_branches (insns
);
11684 final_start_function (insns
, file
, 1);
11685 final (insns
, file
, 1);
11686 final_end_function ();
11688 reload_completed
= 0;
11689 epilogue_completed
= 0;
11693 function_symbol (rtx target
, const char *name
, enum sh_function_kind kind
)
11697 /* If this is not an ordinary function, the name usually comes from a
11698 string literal or an sprintf buffer. Make sure we use the same
11699 string consistently, so that cse will be able to unify address loads. */
11700 if (kind
!= FUNCTION_ORDINARY
)
11701 name
= IDENTIFIER_POINTER (get_identifier (name
));
11702 sym
= gen_rtx_SYMBOL_REF (Pmode
, name
);
11703 SYMBOL_REF_FLAGS (sym
) = SYMBOL_FLAG_FUNCTION
;
11707 case FUNCTION_ORDINARY
:
11711 rtx reg
= target
? target
: gen_reg_rtx (Pmode
);
11713 emit_insn (gen_symGOT2reg (reg
, sym
));
11719 /* ??? To allow cse to work, we use GOTOFF relocations.
11720 we could add combiner patterns to transform this into
11721 straight pc-relative calls with sym2PIC / bsrf when
11722 label load and function call are still 1:1 and in the
11723 same basic block during combine. */
11724 rtx reg
= target
? target
: gen_reg_rtx (Pmode
);
11726 emit_insn (gen_symGOTOFF2reg (reg
, sym
));
11731 if (target
&& sym
!= target
)
11733 emit_move_insn (target
, sym
);
11739 /* Find the number of a general purpose register in S. */
11741 scavenge_reg (HARD_REG_SET
*s
)
11744 for (r
= FIRST_GENERAL_REG
; r
<= LAST_GENERAL_REG
; r
++)
11745 if (TEST_HARD_REG_BIT (*s
, r
))
11751 sh_get_pr_initial_val (void)
11755 /* ??? Unfortunately, get_hard_reg_initial_val doesn't always work for the
11756 PR register on SHcompact, because it might be clobbered by the prologue.
11757 We check first if that is known to be the case. */
11758 if (TARGET_SHCOMPACT
11759 && ((crtl
->args
.info
.call_cookie
11760 & ~ CALL_COOKIE_RET_TRAMP (1))
11761 || crtl
->saves_all_registers
))
11762 return gen_frame_mem (SImode
, return_address_pointer_rtx
);
11764 /* If we haven't finished rtl generation, there might be a nonlocal label
11765 that we haven't seen yet.
11766 ??? get_hard_reg_initial_val fails if it is called after register
11767 allocation has started, unless it has been called before for the
11768 same register. And even then, we end in trouble if we didn't use
11769 the register in the same basic block before. So call
11770 get_hard_reg_initial_val now and wrap it in an unspec if we might
11771 need to replace it. */
11772 /* ??? We also must do this for TARGET_SH1 in general, because otherwise
11773 combine can put the pseudo returned by get_hard_reg_initial_val into
11774 instructions that need a general purpose registers, which will fail to
11775 be recognized when the pseudo becomes allocated to PR. */
11777 = get_hard_reg_initial_val (Pmode
, TARGET_SHMEDIA
? PR_MEDIA_REG
: PR_REG
);
11779 return gen_rtx_UNSPEC (SImode
, gen_rtvec (1, val
), UNSPEC_RA
);
11784 sh_expand_t_scc (rtx operands
[])
11786 enum rtx_code code
= GET_CODE (operands
[1]);
11787 rtx target
= operands
[0];
11788 rtx op0
= operands
[2];
11789 rtx op1
= operands
[3];
11790 rtx result
= target
;
11793 if (!REG_P (op0
) || REGNO (op0
) != T_REG
11794 || !CONST_INT_P (op1
))
11796 if (!REG_P (result
))
11797 result
= gen_reg_rtx (SImode
);
11798 val
= INTVAL (op1
);
11799 if ((code
== EQ
&& val
== 1) || (code
== NE
&& val
== 0))
11800 emit_insn (gen_movt (result
));
11801 else if (TARGET_SH2A
&& ((code
== EQ
&& val
== 0)
11802 || (code
== NE
&& val
== 1)))
11803 emit_insn (gen_xorsi3_movrt (result
));
11804 else if ((code
== EQ
&& val
== 0) || (code
== NE
&& val
== 1))
11806 emit_clobber (result
);
11807 emit_insn (gen_subc (result
, result
, result
));
11808 emit_insn (gen_addsi3 (result
, result
, const1_rtx
));
11810 else if (code
== EQ
|| code
== NE
)
11811 emit_insn (gen_move_insn (result
, GEN_INT (code
== NE
)));
11814 if (result
!= target
)
11815 emit_move_insn (target
, result
);
11819 /* INSN is an sfunc; return the rtx that describes the address used. */
11821 extract_sfunc_addr (rtx insn
)
11823 rtx pattern
, part
= NULL_RTX
;
11826 pattern
= PATTERN (insn
);
11827 len
= XVECLEN (pattern
, 0);
11828 for (i
= 0; i
< len
; i
++)
11830 part
= XVECEXP (pattern
, 0, i
);
11831 if (GET_CODE (part
) == USE
&& GET_MODE (XEXP (part
, 0)) == Pmode
11832 && GENERAL_REGISTER_P (true_regnum (XEXP (part
, 0))))
11833 return XEXP (part
, 0);
11835 gcc_assert (GET_CODE (XVECEXP (pattern
, 0, 0)) == UNSPEC_VOLATILE
);
11836 return XVECEXP (XVECEXP (pattern
, 0, 0), 0, 1);
11839 /* Verify that the register in use_sfunc_addr still agrees with the address
11840 used in the sfunc. This prevents fill_slots_from_thread from changing
11842 INSN is the use_sfunc_addr instruction, and REG is the register it
11845 check_use_sfunc_addr (rtx insn
, rtx reg
)
11847 /* Search for the sfunc. It should really come right after INSN. */
11848 while ((insn
= NEXT_INSN (insn
)))
11850 if (LABEL_P (insn
) || JUMP_P (insn
))
11852 if (! INSN_P (insn
))
11855 if (GET_CODE (PATTERN (insn
)) == SEQUENCE
)
11856 insn
= XVECEXP (PATTERN (insn
), 0, 0);
11857 if (GET_CODE (PATTERN (insn
)) != PARALLEL
11858 || get_attr_type (insn
) != TYPE_SFUNC
)
11860 return rtx_equal_p (extract_sfunc_addr (insn
), reg
);
11862 gcc_unreachable ();
11865 /* This function returns a constant rtx that represents pi / 2**15 in
11866 SFmode. it's used to scale SFmode angles, in radians, to a
11867 fixed-point signed 16.16-bit fraction of a full circle, i.e., 2*pi
11868 maps to 0x10000). */
11870 static GTY(()) rtx sh_fsca_sf2int_rtx
;
11873 sh_fsca_sf2int (void)
11875 if (! sh_fsca_sf2int_rtx
)
11877 REAL_VALUE_TYPE rv
;
11879 real_from_string (&rv
, "10430.378350470453");
11880 sh_fsca_sf2int_rtx
= const_double_from_real_value (rv
, SFmode
);
11883 return sh_fsca_sf2int_rtx
;
11886 /* This function returns a constant rtx that represents pi / 2**15 in
11887 DFmode. it's used to scale DFmode angles, in radians, to a
11888 fixed-point signed 16.16-bit fraction of a full circle, i.e., 2*pi
11889 maps to 0x10000). */
11891 static GTY(()) rtx sh_fsca_df2int_rtx
;
11894 sh_fsca_df2int (void)
11896 if (! sh_fsca_df2int_rtx
)
11898 REAL_VALUE_TYPE rv
;
11900 real_from_string (&rv
, "10430.378350470453");
11901 sh_fsca_df2int_rtx
= const_double_from_real_value (rv
, DFmode
);
11904 return sh_fsca_df2int_rtx
;
11907 /* This function returns a constant rtx that represents 2**15 / pi in
11908 SFmode. it's used to scale a fixed-point signed 16.16-bit fraction
11909 of a full circle back to a SFmode value, i.e., 0x10000 maps to
11912 static GTY(()) rtx sh_fsca_int2sf_rtx
;
11915 sh_fsca_int2sf (void)
11917 if (! sh_fsca_int2sf_rtx
)
11919 REAL_VALUE_TYPE rv
;
11921 real_from_string (&rv
, "9.587379924285257e-5");
11922 sh_fsca_int2sf_rtx
= const_double_from_real_value (rv
, SFmode
);
11925 return sh_fsca_int2sf_rtx
;
11928 /* Initialize the CUMULATIVE_ARGS structure. */
11931 sh_init_cumulative_args (CUMULATIVE_ARGS
* pcum
,
11933 rtx libname ATTRIBUTE_UNUSED
,
11935 signed int n_named_args
,
11936 enum machine_mode mode
)
11938 pcum
->arg_count
[(int) SH_ARG_FLOAT
] = 0;
11939 pcum
->free_single_fp_reg
= 0;
11940 pcum
->stack_regs
= 0;
11941 pcum
->byref_regs
= 0;
11943 pcum
->outgoing
= (n_named_args
== -1) ? 0 : 1;
11945 /* XXX - Should we check TARGET_HITACHI here ??? */
11946 pcum
->renesas_abi
= sh_attr_renesas_p (fntype
) ? 1 : 0;
11950 pcum
->force_mem
= ((TARGET_HITACHI
|| pcum
->renesas_abi
)
11951 && aggregate_value_p (TREE_TYPE (fntype
), fndecl
));
11952 pcum
->prototype_p
= TYPE_ARG_TYPES (fntype
) ? TRUE
: FALSE
;
11953 pcum
->arg_count
[(int) SH_ARG_INT
]
11954 = TARGET_SH5
&& aggregate_value_p (TREE_TYPE (fntype
), fndecl
);
11957 = CALL_COOKIE_RET_TRAMP (TARGET_SHCOMPACT
11958 && pcum
->arg_count
[(int) SH_ARG_INT
] == 0
11959 && (TYPE_MODE (TREE_TYPE (fntype
)) == BLKmode
11960 ? int_size_in_bytes (TREE_TYPE (fntype
))
11961 : GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (fntype
)))) > 4
11962 && (BASE_RETURN_VALUE_REG (TYPE_MODE (TREE_TYPE (fntype
)))
11963 == FIRST_RET_REG
));
11967 pcum
->arg_count
[(int) SH_ARG_INT
] = 0;
11968 pcum
->prototype_p
= FALSE
;
11969 if (mode
!= VOIDmode
)
11971 pcum
->call_cookie
=
11972 CALL_COOKIE_RET_TRAMP (TARGET_SHCOMPACT
11973 && GET_MODE_SIZE (mode
) > 4
11974 && BASE_RETURN_VALUE_REG (mode
) == FIRST_RET_REG
);
11976 /* If the default ABI is the Renesas ABI then all library
11977 calls must assume that the library will be using the
11978 Renesas ABI. So if the function would return its result
11979 in memory then we must force the address of this memory
11980 block onto the stack. Ideally we would like to call
11981 targetm.calls.return_in_memory() here but we do not have
11982 the TYPE or the FNDECL available so we synthesize the
11983 contents of that function as best we can. */
11985 (TARGET_DEFAULT
& MASK_HITACHI
)
11986 && (mode
== BLKmode
11987 || (GET_MODE_SIZE (mode
) > 4
11988 && !(mode
== DFmode
11989 && TARGET_FPU_DOUBLE
)));
11993 pcum
->call_cookie
= 0;
11994 pcum
->force_mem
= FALSE
;
11999 /* Replace any occurrence of FROM(n) in X with TO(n). The function does
12000 not enter into CONST_DOUBLE for the replace.
12002 Note that copying is not done so X must not be shared unless all copies
12003 are to be modified.
12005 This is like replace_rtx, except that we operate on N_REPLACEMENTS
12006 replacements simultaneously - FROM(n) is replacements[n*2] and to(n) is
12007 replacements[n*2+1] - and that we take mode changes into account.
12009 If a replacement is ambiguous, return NULL_RTX.
12011 If MODIFY is zero, don't modify any rtl in place,
12012 just return zero or nonzero for failure / success. */
12015 replace_n_hard_rtx (rtx x
, rtx
*replacements
, int n_replacements
, int modify
)
12020 /* The following prevents loops occurrence when we change MEM in
12021 CONST_DOUBLE onto the same CONST_DOUBLE. */
12022 if (x
!= 0 && GET_CODE (x
) == CONST_DOUBLE
)
12025 for (i
= n_replacements
- 1; i
>= 0 ; i
--)
12026 if (x
== replacements
[i
*2] && GET_MODE (x
) == GET_MODE (replacements
[i
*2+1]))
12027 return replacements
[i
*2+1];
12029 /* Allow this function to make replacements in EXPR_LISTs. */
12033 if (GET_CODE (x
) == SUBREG
)
12035 rtx new_rtx
= replace_n_hard_rtx (SUBREG_REG (x
), replacements
,
12036 n_replacements
, modify
);
12038 if (CONST_INT_P (new_rtx
))
12040 x
= simplify_subreg (GET_MODE (x
), new_rtx
,
12041 GET_MODE (SUBREG_REG (x
)),
12047 SUBREG_REG (x
) = new_rtx
;
12051 else if (REG_P (x
))
12053 unsigned regno
= REGNO (x
);
12054 unsigned nregs
= (regno
< FIRST_PSEUDO_REGISTER
12055 ? HARD_REGNO_NREGS (regno
, GET_MODE (x
)) : 1);
12056 rtx result
= NULL_RTX
;
12058 for (i
= n_replacements
- 1; i
>= 0; i
--)
12060 rtx from
= replacements
[i
*2];
12061 rtx to
= replacements
[i
*2+1];
12062 unsigned from_regno
, from_nregs
, to_regno
, new_regno
;
12066 from_regno
= REGNO (from
);
12067 from_nregs
= (from_regno
< FIRST_PSEUDO_REGISTER
12068 ? HARD_REGNO_NREGS (from_regno
, GET_MODE (from
)) : 1);
12069 if (regno
< from_regno
+ from_nregs
&& regno
+ nregs
> from_regno
)
12071 if (regno
< from_regno
12072 || regno
+ nregs
> from_regno
+ nregs
12076 to_regno
= REGNO (to
);
12077 if (to_regno
< FIRST_PSEUDO_REGISTER
)
12079 new_regno
= regno
+ to_regno
- from_regno
;
12080 if ((unsigned) HARD_REGNO_NREGS (new_regno
, GET_MODE (x
))
12083 result
= gen_rtx_REG (GET_MODE (x
), new_regno
);
12085 else if (GET_MODE (x
) <= GET_MODE (to
))
12086 result
= gen_lowpart_common (GET_MODE (x
), to
);
12088 result
= gen_lowpart_SUBREG (GET_MODE (x
), to
);
12091 return result
? result
: x
;
12093 else if (GET_CODE (x
) == ZERO_EXTEND
)
12095 rtx new_rtx
= replace_n_hard_rtx (XEXP (x
, 0), replacements
,
12096 n_replacements
, modify
);
12098 if (CONST_INT_P (new_rtx
))
12100 x
= simplify_unary_operation (ZERO_EXTEND
, GET_MODE (x
),
12101 new_rtx
, GET_MODE (XEXP (x
, 0)));
12106 XEXP (x
, 0) = new_rtx
;
12111 fmt
= GET_RTX_FORMAT (GET_CODE (x
));
12112 for (i
= GET_RTX_LENGTH (GET_CODE (x
)) - 1; i
>= 0; i
--)
12118 new_rtx
= replace_n_hard_rtx (XEXP (x
, i
), replacements
,
12119 n_replacements
, modify
);
12123 XEXP (x
, i
) = new_rtx
;
12125 else if (fmt
[i
] == 'E')
12126 for (j
= XVECLEN (x
, i
) - 1; j
>= 0; j
--)
12128 new_rtx
= replace_n_hard_rtx (XVECEXP (x
, i
, j
), replacements
,
12129 n_replacements
, modify
);
12133 XVECEXP (x
, i
, j
) = new_rtx
;
12141 sh_gen_truncate (enum machine_mode mode
, rtx x
, int need_sign_ext
)
12143 enum rtx_code code
= TRUNCATE
;
12145 if (GET_CODE (x
) == ZERO_EXTEND
|| GET_CODE (x
) == SIGN_EXTEND
)
12147 rtx inner
= XEXP (x
, 0);
12148 enum machine_mode inner_mode
= GET_MODE (inner
);
12150 if (inner_mode
== mode
)
12152 else if (GET_MODE_SIZE (inner_mode
) >= GET_MODE_SIZE (mode
))
12154 else if (GET_MODE_SIZE (inner_mode
) < GET_MODE_SIZE (mode
)
12155 && (! need_sign_ext
|| GET_CODE (x
) == SIGN_EXTEND
))
12157 code
= GET_CODE (x
);
12161 return gen_rtx_fmt_e (code
, mode
, x
);
12164 /* called via for_each_rtx after reload, to clean up truncates of
12165 registers that span multiple actual hard registers. */
12167 shmedia_cleanup_truncate (rtx
*p
, void *n_changes
)
12171 if (GET_CODE (x
) != TRUNCATE
)
12174 if (GET_MODE_SIZE (GET_MODE (reg
)) > 8 && REG_P (reg
))
12176 enum machine_mode reg_mode
= GET_MODE (reg
);
12177 XEXP (x
, 0) = simplify_subreg (DImode
, reg
, reg_mode
,
12178 subreg_lowpart_offset (DImode
, reg_mode
));
12179 *(int*) n_changes
+= 1;
12185 /* Load and store depend on the highpart of the address. However,
12186 set_attr_alternative does not give well-defined results before reload,
12187 so we must look at the rtl ourselves to see if any of the feeding
12188 registers is used in a memref. */
12190 /* Called by sh_contains_memref_p via for_each_rtx. */
12192 sh_contains_memref_p_1 (rtx
*loc
, void *data ATTRIBUTE_UNUSED
)
12194 return (MEM_P (*loc
));
12197 /* Return nonzero iff INSN contains a MEM. */
12199 sh_contains_memref_p (rtx insn
)
12201 return for_each_rtx (&PATTERN (insn
), &sh_contains_memref_p_1
, NULL
);
12204 /* Return nonzero iff INSN loads a banked register. */
12206 sh_loads_bankedreg_p (rtx insn
)
12208 if (GET_CODE (PATTERN (insn
)) == SET
)
12210 rtx op
= SET_DEST (PATTERN(insn
));
12211 if (REG_P (op
) && BANKED_REGISTER_P (REGNO (op
)))
12218 /* FNADDR is the MEM expression from a call expander. Return an address
12219 to use in an SHmedia insn pattern. */
12221 shmedia_prepare_call_address (rtx fnaddr
, int is_sibcall
)
12225 fnaddr
= XEXP (fnaddr
, 0);
12226 is_sym
= GET_CODE (fnaddr
) == SYMBOL_REF
;
12227 if (flag_pic
&& is_sym
)
12229 if (! SYMBOL_REF_LOCAL_P (fnaddr
))
12231 rtx reg
= gen_reg_rtx (Pmode
);
12233 /* We must not use GOTPLT for sibcalls, because PIC_REG
12234 must be restored before the PLT code gets to run. */
12236 emit_insn (gen_symGOT2reg (reg
, fnaddr
));
12238 emit_insn (gen_symGOTPLT2reg (reg
, fnaddr
));
12243 fnaddr
= gen_sym2PIC (fnaddr
);
12244 PUT_MODE (fnaddr
, Pmode
);
12247 /* If ptabs might trap, make this visible to the rest of the compiler.
12248 We generally assume that symbols pertain to valid locations, but
12249 it is possible to generate invalid symbols with asm or linker tricks.
12250 In a list of functions where each returns its successor, an invalid
12251 symbol might denote an empty list. */
12252 if (!TARGET_PT_FIXED
12253 && (!is_sym
|| TARGET_INVALID_SYMBOLS
)
12254 && (!REG_P (fnaddr
) || ! TARGET_REGISTER_P (REGNO (fnaddr
))))
12256 rtx tr
= gen_reg_rtx (PDImode
);
12258 emit_insn (gen_ptabs (tr
, fnaddr
));
12261 else if (! target_reg_operand (fnaddr
, Pmode
))
12262 fnaddr
= copy_to_mode_reg (Pmode
, fnaddr
);
12267 sh_secondary_reload (bool in_p
, rtx x
, reg_class_t rclass_i
,
12268 enum machine_mode mode
, secondary_reload_info
*sri
)
12270 enum reg_class rclass
= (enum reg_class
) rclass_i
;
12274 if (REGCLASS_HAS_FP_REG (rclass
)
12275 && ! TARGET_SHMEDIA
12276 && immediate_operand ((x
), mode
)
12277 && ! ((fp_zero_operand (x
) || fp_one_operand (x
))
12278 && mode
== SFmode
&& fldi_ok ()))
12282 sri
->icode
= CODE_FOR_reload_insf__frn
;
12285 sri
->icode
= CODE_FOR_reload_indf__frn
;
12288 /* ??? If we knew that we are in the appropriate mode -
12289 single precision - we could use a reload pattern directly. */
12294 if (rclass
== FPUL_REGS
12296 && (REGNO (x
) == MACL_REG
|| REGNO (x
) == MACH_REG
12297 || REGNO (x
) == T_REG
))
12298 || GET_CODE (x
) == PLUS
))
12299 return GENERAL_REGS
;
12300 if (rclass
== FPUL_REGS
&& immediate_operand (x
, mode
))
12302 if (satisfies_constraint_I08 (x
) || fp_zero_operand (x
))
12303 return GENERAL_REGS
;
12304 else if (mode
== SFmode
)
12306 sri
->icode
= CODE_FOR_reload_insi__i_fpul
;
12309 if (rclass
== FPSCR_REGS
12310 && ((REG_P (x
) && REGNO (x
) >= FIRST_PSEUDO_REGISTER
)
12311 || (MEM_P (x
) && GET_CODE (XEXP (x
, 0)) == PLUS
)))
12312 return GENERAL_REGS
;
12313 if (REGCLASS_HAS_FP_REG (rclass
)
12315 && immediate_operand (x
, mode
)
12316 && x
!= CONST0_RTX (GET_MODE (x
))
12317 && GET_MODE (x
) != V4SFmode
)
12318 return GENERAL_REGS
;
12319 if ((mode
== QImode
|| mode
== HImode
)
12320 && TARGET_SHMEDIA
&& inqhi_operand (x
, mode
))
12322 sri
->icode
= ((mode
== QImode
)
12323 ? CODE_FOR_reload_inqi
: CODE_FOR_reload_inhi
);
12326 if (TARGET_SHMEDIA
&& rclass
== GENERAL_REGS
12327 && (GET_CODE (x
) == LABEL_REF
|| PIC_ADDR_P (x
)))
12328 return TARGET_REGS
;
12329 } /* end of input-only processing. */
12331 if (((REGCLASS_HAS_FP_REG (rclass
)
12333 && (GENERAL_OR_AP_REGISTER_P (REGNO (x
))
12334 || (FP_REGISTER_P (REGNO (x
)) && mode
== SImode
12335 && TARGET_FMOVD
))))
12336 || (REGCLASS_HAS_GENERAL_REG (rclass
)
12338 && FP_REGISTER_P (REGNO (x
))))
12339 && ! TARGET_SHMEDIA
12340 && (mode
== SFmode
|| mode
== SImode
))
12342 if ((rclass
== FPUL_REGS
12343 || (REGCLASS_HAS_FP_REG (rclass
)
12344 && ! TARGET_SHMEDIA
&& mode
== SImode
))
12347 && (REGNO (x
) >= FIRST_PSEUDO_REGISTER
12348 || REGNO (x
) == T_REG
12349 || system_reg_operand (x
, VOIDmode
)))))
12351 if (rclass
== FPUL_REGS
)
12352 return GENERAL_REGS
;
12355 if ((rclass
== TARGET_REGS
12356 || (TARGET_SHMEDIA
&& rclass
== SIBCALL_REGS
))
12357 && !satisfies_constraint_Csy (x
)
12358 && (!REG_P (x
) || ! GENERAL_REGISTER_P (REGNO (x
))))
12359 return GENERAL_REGS
;
12360 if ((rclass
== MAC_REGS
|| rclass
== PR_REGS
)
12361 && REG_P (x
) && ! GENERAL_REGISTER_P (REGNO (x
))
12362 && rclass
!= REGNO_REG_CLASS (REGNO (x
)))
12363 return GENERAL_REGS
;
12364 if (rclass
!= GENERAL_REGS
&& REG_P (x
)
12365 && TARGET_REGISTER_P (REGNO (x
)))
12366 return GENERAL_REGS
;
12370 enum sh_divide_strategy_e sh_div_strategy
= SH_DIV_STRATEGY_DEFAULT
;