]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/config/sh/sh.c
Update copyright years.
[thirdparty/gcc.git] / gcc / config / sh / sh.c
1 /* Output routines for GCC for Renesas / SuperH SH.
2 Copyright (C) 1993-2020 Free Software Foundation, Inc.
3 Contributed by Steve Chamberlain (sac@cygnus.com).
4 Improved by Jim Wilson (wilson@cygnus.com).
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include <sstream>
23
24 #define IN_TARGET_CODE 1
25
26 #include "config.h"
27 #define INCLUDE_VECTOR
28 #include "system.h"
29 #include "coretypes.h"
30 #include "backend.h"
31 #include "target.h"
32 #include "rtl.h"
33 #include "tree.h"
34 #include "gimple.h"
35 #include "cfghooks.h"
36 #include "df.h"
37 #include "memmodel.h"
38 #include "tm_p.h"
39 #include "stringpool.h"
40 #include "attribs.h"
41 #include "optabs.h"
42 #include "emit-rtl.h"
43 #include "recog.h"
44 #include "diagnostic-core.h"
45 #include "alias.h"
46 #include "fold-const.h"
47 #include "stor-layout.h"
48 #include "calls.h"
49 #include "varasm.h"
50 #include "flags.h"
51 #include "explow.h"
52 #include "expr.h"
53 #include "reload.h"
54 #include "output.h"
55 #include "insn-attr.h"
56 #include "dwarf2.h"
57 #include "langhooks.h"
58 #include "cfgrtl.h"
59 #include "intl.h"
60 #include "sched-int.h"
61 #include "gimplify.h"
62 #include "tm-constrs.h"
63 #include "opts.h"
64 #include "tree-pass.h"
65 #include "context.h"
66 #include "builtins.h"
67 #include "rtl-iter.h"
68 #include "regs.h"
69 #include "toplev.h"
70
71 /* This file should be included last. */
72 #include "target-def.h"
73
74 int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
75
76 #define CONST_OK_FOR_ADD(size) CONST_OK_FOR_I08 (size)
77 #define GEN_MOV (*(gen_movsi))
78 #define GEN_ADD3 (*(gen_addsi3))
79 #define GEN_SUB3 (*(gen_subsi3))
80
81 /* Used to simplify the logic below. Find the attributes wherever
82 they may be. */
83 #define SH_ATTRIBUTES(decl) \
84 (TYPE_P (decl)) ? TYPE_ATTRIBUTES (decl) \
85 : DECL_ATTRIBUTES (decl) \
86 ? (DECL_ATTRIBUTES (decl)) \
87 : TYPE_ATTRIBUTES (TREE_TYPE (decl))
88
89 /* Set to true by expand_prologue() when the function is an
90 interrupt handler. */
91 bool current_function_interrupt;
92
93 tree sh_deferred_function_attributes;
94 tree *sh_deferred_function_attributes_tail = &sh_deferred_function_attributes;
95
96 /* Global variables for machine-dependent things. */
97
98 /* Which cpu are we scheduling for. */
99 enum processor_type sh_cpu;
100
101 /* Definitions used in ready queue reordering for first scheduling pass. */
102
103 /* Reg weights arrays for modes SFmode and SImode, indexed by insn LUID. */
104 static short *regmode_weight[2];
105
106 /* Total SFmode and SImode weights of scheduled insns. */
107 static int curr_regmode_pressure[2];
108
109 /* Number of r0 life regions. */
110 static int r0_life_regions;
111
112 /* If true, skip cycles for Q -> R movement. */
113 static int skip_cycles = 0;
114
115 /* Cached value of can_issue_more. This is cached in sh_variable_issue hook
116 and returned from sh_reorder2. */
117 static short cached_can_issue_more;
118
119 /* Unique number for UNSPEC_BBR pattern. */
120 static unsigned int unspec_bbr_uid = 1;
121
122 /* Provides the class number of the smallest class containing
123 reg number. */
124 enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER] =
125 {
126 R0_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 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
136 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
137 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
138 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
139 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
140 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
141 GENERAL_REGS, GENERAL_REGS, GENERAL_REGS, GENERAL_REGS,
142 FP0_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 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
152 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
153 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
154 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
155 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
156 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
157 FP_REGS, FP_REGS, FP_REGS, FP_REGS,
158 TARGET_REGS, TARGET_REGS, TARGET_REGS, TARGET_REGS,
159 TARGET_REGS, TARGET_REGS, TARGET_REGS, TARGET_REGS,
160 DF_REGS, DF_REGS, DF_REGS, DF_REGS,
161 DF_REGS, DF_REGS, DF_REGS, DF_REGS,
162 NO_REGS, GENERAL_REGS, PR_REGS, T_REGS,
163 MAC_REGS, MAC_REGS, FPUL_REGS, FPSCR_REGS,
164 GENERAL_REGS, GENERAL_REGS,
165 };
166
167 char sh_register_names[FIRST_PSEUDO_REGISTER] \
168 [MAX_REGISTER_NAME_LENGTH + 1] = SH_REGISTER_NAMES_INITIALIZER;
169
170 char sh_additional_register_names[ADDREGNAMES_SIZE] \
171 [MAX_ADDITIONAL_REGISTER_NAME_LENGTH + 1]
172 = SH_ADDITIONAL_REGISTER_NAMES_INITIALIZER;
173
174 int assembler_dialect;
175
176 static void split_branches (rtx_insn *);
177 static int branch_dest (rtx);
178 static void print_slot (rtx_sequence *);
179 static rtx_code_label *add_constant (rtx, machine_mode, rtx);
180 static void dump_table (rtx_insn *, rtx_insn *);
181 static bool broken_move (rtx_insn *);
182 static bool mova_p (rtx_insn *);
183 static rtx_insn *find_barrier (int, rtx_insn *, rtx_insn *);
184 static bool noncall_uses_reg (rtx, rtx_insn *, rtx *);
185 static rtx_insn *gen_block_redirect (rtx_insn *, int, int);
186 static void sh_reorg (void);
187 static void sh_option_override (void);
188 static void sh_override_options_after_change (void);
189 static void output_stack_adjust (int, rtx, int, HARD_REG_SET *, bool);
190 static rtx_insn* emit_frame_insn (rtx);
191 static rtx push (int);
192 static void pop (int);
193 static void push_regs (HARD_REG_SET* mask, bool interrupt_handler);
194 static int calc_live_regs (HARD_REG_SET *);
195 static HOST_WIDE_INT rounded_frame_size (int);
196 static bool sh_frame_pointer_required (void);
197 static void sh_emit_mode_set (int, int, int, HARD_REG_SET);
198 static int sh_mode_needed (int, rtx_insn *);
199 static int sh_mode_after (int, int, rtx_insn *);
200 static int sh_mode_entry (int);
201 static int sh_mode_exit (int);
202 static int sh_mode_priority (int entity, int n);
203
204 static rtx mark_constant_pool_use (rtx);
205 static tree sh_handle_interrupt_handler_attribute (tree *, tree, tree,
206 int, bool *);
207 static tree sh_handle_resbank_handler_attribute (tree *, tree,
208 tree, int, bool *);
209 static tree sh2a_handle_function_vector_handler_attribute (tree *, tree,
210 tree, int, bool *);
211 static tree sh_handle_sp_switch_attribute (tree *, tree, tree, int, bool *);
212 static tree sh_handle_trap_exit_attribute (tree *, tree, tree, int, bool *);
213 static tree sh_handle_renesas_attribute (tree *, tree, tree, int, bool *);
214 static void sh_print_operand (FILE *, rtx, int);
215 static void sh_print_operand_address (FILE *, machine_mode, rtx);
216 static bool sh_print_operand_punct_valid_p (unsigned char code);
217 static bool sh_asm_output_addr_const_extra (FILE *file, rtx x);
218 static void sh_output_function_epilogue (FILE *);
219 static void sh_insert_attributes (tree, tree *);
220 static const char *sh_check_pch_target_flags (int);
221 static int sh_register_move_cost (machine_mode, reg_class_t, reg_class_t);
222 static int sh_adjust_cost (rtx_insn *, int, rtx_insn *, int, unsigned int);
223 static int sh_issue_rate (void);
224 static int sh_dfa_new_cycle (FILE *, int, rtx_insn *, int, int, int *sort_p);
225 static short find_set_regmode_weight (rtx, machine_mode);
226 static short find_insn_regmode_weight (rtx, machine_mode);
227 static void find_regmode_weight (basic_block, machine_mode);
228 static int find_r0_life_regions (basic_block);
229 static void sh_md_init_global (FILE *, int, int);
230 static void sh_md_finish_global (FILE *, int);
231 static int rank_for_reorder (const void *, const void *);
232 static void swap_reorder (rtx_insn **, int);
233 static void ready_reorder (rtx_insn **, int);
234 static bool high_pressure (machine_mode);
235 static int sh_reorder (FILE *, int, rtx_insn **, int *, int);
236 static int sh_reorder2 (FILE *, int, rtx_insn **, int *, int);
237 static void sh_md_init (FILE *, int, int);
238 static int sh_variable_issue (FILE *, int, rtx_insn *, int);
239
240 static bool sh_function_ok_for_sibcall (tree, tree);
241
242 static bool sh_can_follow_jump (const rtx_insn *, const rtx_insn *);
243 static bool sh_ms_bitfield_layout_p (const_tree);
244
245 static void sh_init_builtins (void);
246 static tree sh_builtin_decl (unsigned, bool);
247 static rtx sh_expand_builtin (tree, rtx, rtx, machine_mode, int);
248 static void sh_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
249 HOST_WIDE_INT, tree);
250 static void sh_file_start (void);
251 static bool sh_assemble_integer (rtx, unsigned int, int);
252 static bool flow_dependent_p (rtx_insn *, rtx_insn *);
253 static void flow_dependent_p_1 (rtx, const_rtx, void *);
254 static int shiftcosts (rtx);
255 static int and_xor_ior_costs (rtx, int);
256 static int addsubcosts (rtx);
257 static int multcosts (rtx);
258 static bool unspec_caller_rtx_p (rtx);
259 static bool sh_cannot_copy_insn_p (rtx_insn *);
260 static bool sh_cannot_force_const_mem_p (machine_mode, rtx);
261 static bool sh_rtx_costs (rtx, machine_mode, int, int, int *, bool);
262 static int sh_address_cost (rtx, machine_mode, addr_space_t, bool);
263 static int sh_pr_n_sets (void);
264 static rtx sh_allocate_initial_value (rtx);
265 static reg_class_t sh_preferred_reload_class (rtx, reg_class_t);
266 static reg_class_t sh_secondary_reload (bool, rtx, reg_class_t,
267 machine_mode,
268 struct secondary_reload_info *);
269 static bool sh_legitimate_address_p (machine_mode, rtx, bool);
270 static rtx sh_legitimize_address (rtx, rtx, machine_mode);
271 static rtx sh_delegitimize_address (rtx);
272 static bool sh_cannot_substitute_mem_equiv_p (rtx);
273 static bool sh_legitimize_address_displacement (rtx *, rtx *,
274 poly_int64, machine_mode);
275 static int scavenge_reg (HARD_REG_SET *s);
276
277 static rtx sh_struct_value_rtx (tree, int);
278 static rtx sh_function_value (const_tree, const_tree, bool);
279 static bool sh_function_value_regno_p (const unsigned int);
280 static rtx sh_libcall_value (machine_mode, const_rtx);
281 static bool sh_return_in_memory (const_tree, const_tree);
282 static rtx sh_builtin_saveregs (void);
283 static void sh_setup_incoming_varargs (cumulative_args_t,
284 const function_arg_info &, int *, int);
285 static bool sh_strict_argument_naming (cumulative_args_t);
286 static bool sh_pretend_outgoing_varargs_named (cumulative_args_t);
287 static void sh_atomic_assign_expand_fenv (tree *, tree *, tree *);
288 static tree sh_build_builtin_va_list (void);
289 static void sh_va_start (tree, rtx);
290 static tree sh_gimplify_va_arg_expr (tree, tree, gimple_seq *, gimple_seq *);
291 static bool sh_promote_prototypes (const_tree);
292 static machine_mode sh_promote_function_mode (const_tree type,
293 machine_mode,
294 int *punsignedp,
295 const_tree funtype,
296 int for_return);
297 static bool sh_pass_by_reference (cumulative_args_t,
298 const function_arg_info &);
299 static bool sh_callee_copies (cumulative_args_t, const function_arg_info &);
300 static int sh_arg_partial_bytes (cumulative_args_t, const function_arg_info &);
301 static void sh_function_arg_advance (cumulative_args_t,
302 const function_arg_info &);
303 static rtx sh_function_arg (cumulative_args_t, const function_arg_info &);
304 static int sh_dwarf_calling_convention (const_tree);
305 static void sh_encode_section_info (tree, rtx, int);
306 static bool sh2a_function_vector_p (tree);
307 static void sh_trampoline_init (rtx, tree, rtx);
308 static rtx sh_trampoline_adjust_address (rtx);
309 static void sh_conditional_register_usage (void);
310 static bool sh_legitimate_constant_p (machine_mode, rtx);
311 static int mov_insn_size (machine_mode, bool);
312 static int mov_insn_alignment_mask (machine_mode, bool);
313 static bool sh_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT,
314 unsigned int,
315 enum by_pieces_operation,
316 bool);
317 static bool sequence_insn_p (rtx_insn *);
318 static void sh_canonicalize_comparison (int *, rtx *, rtx *, bool);
319 static void sh_canonicalize_comparison (enum rtx_code&, rtx&, rtx&,
320 machine_mode, bool);
321 static bool sh_legitimate_combined_insn (rtx_insn* insn);
322
323 static bool sh_fixed_condition_code_regs (unsigned int* p1, unsigned int* p2);
324
325 static void sh_init_sync_libfuncs (void) ATTRIBUTE_UNUSED;
326 static unsigned int sh_hard_regno_nregs (unsigned int, machine_mode);
327 static bool sh_hard_regno_mode_ok (unsigned int, machine_mode);
328 static bool sh_modes_tieable_p (machine_mode, machine_mode);
329 static bool sh_can_change_mode_class (machine_mode, machine_mode, reg_class_t);
330 \f
331 static const struct attribute_spec sh_attribute_table[] =
332 {
333 /* { name, min_len, max_len, decl_req, type_req, fn_type_req,
334 affects_type_identity, handler, exclude } */
335 { "interrupt_handler", 0, 0, true, false, false, false,
336 sh_handle_interrupt_handler_attribute, NULL },
337 { "sp_switch", 1, 1, true, false, false, false,
338 sh_handle_sp_switch_attribute, NULL },
339 { "trap_exit", 1, 1, true, false, false, false,
340 sh_handle_trap_exit_attribute, NULL },
341 { "renesas", 0, 0, false, true, false, false,
342 sh_handle_renesas_attribute, NULL },
343 { "trapa_handler", 0, 0, true, false, false, false,
344 sh_handle_interrupt_handler_attribute, NULL },
345 { "nosave_low_regs", 0, 0, true, false, false, false,
346 sh_handle_interrupt_handler_attribute, NULL },
347 { "resbank", 0, 0, true, false, false, false,
348 sh_handle_resbank_handler_attribute, NULL },
349 { "function_vector", 1, 1, true, false, false, false,
350 sh2a_handle_function_vector_handler_attribute, NULL },
351 { NULL, 0, 0, false, false, false, false, NULL, NULL }
352 };
353 \f
354 /* Initialize the GCC target structure. */
355 #undef TARGET_ATTRIBUTE_TABLE
356 #define TARGET_ATTRIBUTE_TABLE sh_attribute_table
357
358 /* The next two are used for debug info when compiling with -gdwarf. */
359 #undef TARGET_ASM_UNALIGNED_HI_OP
360 #define TARGET_ASM_UNALIGNED_HI_OP "\t.uaword\t"
361 #undef TARGET_ASM_UNALIGNED_SI_OP
362 #define TARGET_ASM_UNALIGNED_SI_OP "\t.ualong\t"
363
364 #undef TARGET_OPTION_OVERRIDE
365 #define TARGET_OPTION_OVERRIDE sh_option_override
366
367 #undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE
368 #define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE \
369 sh_override_options_after_change
370
371 #undef TARGET_PRINT_OPERAND
372 #define TARGET_PRINT_OPERAND sh_print_operand
373 #undef TARGET_PRINT_OPERAND_ADDRESS
374 #define TARGET_PRINT_OPERAND_ADDRESS sh_print_operand_address
375 #undef TARGET_PRINT_OPERAND_PUNCT_VALID_P
376 #define TARGET_PRINT_OPERAND_PUNCT_VALID_P sh_print_operand_punct_valid_p
377 #undef TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA
378 #define TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA sh_asm_output_addr_const_extra
379
380 #undef TARGET_ASM_FUNCTION_EPILOGUE
381 #define TARGET_ASM_FUNCTION_EPILOGUE sh_output_function_epilogue
382
383 #undef TARGET_ASM_OUTPUT_MI_THUNK
384 #define TARGET_ASM_OUTPUT_MI_THUNK sh_output_mi_thunk
385
386 #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
387 #define TARGET_ASM_CAN_OUTPUT_MI_THUNK \
388 hook_bool_const_tree_hwi_hwi_const_tree_true
389
390 #undef TARGET_ASM_FILE_START
391 #define TARGET_ASM_FILE_START sh_file_start
392 #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
393 #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
394
395 #undef TARGET_ASM_INTEGER
396 #define TARGET_ASM_INTEGER sh_assemble_integer
397
398 #undef TARGET_REGISTER_MOVE_COST
399 #define TARGET_REGISTER_MOVE_COST sh_register_move_cost
400
401 #undef TARGET_INSERT_ATTRIBUTES
402 #define TARGET_INSERT_ATTRIBUTES sh_insert_attributes
403
404 #undef TARGET_SCHED_ADJUST_COST
405 #define TARGET_SCHED_ADJUST_COST sh_adjust_cost
406
407 #undef TARGET_SCHED_ISSUE_RATE
408 #define TARGET_SCHED_ISSUE_RATE sh_issue_rate
409
410 /* The next 5 hooks have been implemented for reenabling sched1. With the
411 help of these macros we are limiting the movement of insns in sched1 to
412 reduce the register pressure. The overall idea is to keep count of SImode
413 and SFmode regs required by already scheduled insns. When these counts
414 cross some threshold values; give priority to insns that free registers.
415 The insn that frees registers is most likely to be the insn with lowest
416 LUID (original insn order); but such an insn might be there in the stalled
417 queue (Q) instead of the ready queue (R). To solve this, we skip cycles
418 up to a max of 8 cycles so that such insns may move from Q -> R.
419
420 The description of the hooks are as below:
421
422 TARGET_SCHED_INIT_GLOBAL: Added a new target hook in the generic
423 scheduler; it is called inside the sched_init function just after
424 find_insn_reg_weights function call. It is used to calculate the SImode
425 and SFmode weights of insns of basic blocks; much similar to what
426 find_insn_reg_weights does.
427 TARGET_SCHED_FINISH_GLOBAL: Corresponding cleanup hook.
428
429 TARGET_SCHED_DFA_NEW_CYCLE: Skip cycles if high register pressure is
430 indicated by TARGET_SCHED_REORDER2; doing this may move insns from
431 (Q)->(R).
432
433 TARGET_SCHED_REORDER: If the register pressure for SImode or SFmode is
434 high; reorder the ready queue so that the insn with lowest LUID will be
435 issued next.
436
437 TARGET_SCHED_REORDER2: If the register pressure is high, indicate to
438 TARGET_SCHED_DFA_NEW_CYCLE to skip cycles.
439
440 TARGET_SCHED_VARIABLE_ISSUE: Cache the value of can_issue_more so that it
441 can be returned from TARGET_SCHED_REORDER2.
442
443 TARGET_SCHED_INIT: Reset the register pressure counting variables. */
444
445 #undef TARGET_SCHED_DFA_NEW_CYCLE
446 #define TARGET_SCHED_DFA_NEW_CYCLE sh_dfa_new_cycle
447
448 #undef TARGET_SCHED_INIT_GLOBAL
449 #define TARGET_SCHED_INIT_GLOBAL sh_md_init_global
450
451 #undef TARGET_SCHED_FINISH_GLOBAL
452 #define TARGET_SCHED_FINISH_GLOBAL sh_md_finish_global
453
454 #undef TARGET_SCHED_VARIABLE_ISSUE
455 #define TARGET_SCHED_VARIABLE_ISSUE sh_variable_issue
456
457 #undef TARGET_SCHED_REORDER
458 #define TARGET_SCHED_REORDER sh_reorder
459
460 #undef TARGET_SCHED_REORDER2
461 #define TARGET_SCHED_REORDER2 sh_reorder2
462
463 #undef TARGET_SCHED_INIT
464 #define TARGET_SCHED_INIT sh_md_init
465
466 #undef TARGET_DELEGITIMIZE_ADDRESS
467 #define TARGET_DELEGITIMIZE_ADDRESS sh_delegitimize_address
468
469 #undef TARGET_LEGITIMIZE_ADDRESS
470 #define TARGET_LEGITIMIZE_ADDRESS sh_legitimize_address
471
472 #undef TARGET_CAN_FOLLOW_JUMP
473 #define TARGET_CAN_FOLLOW_JUMP sh_can_follow_jump
474
475 #undef TARGET_MS_BITFIELD_LAYOUT_P
476 #define TARGET_MS_BITFIELD_LAYOUT_P sh_ms_bitfield_layout_p
477
478 #undef TARGET_INIT_BUILTINS
479 #define TARGET_INIT_BUILTINS sh_init_builtins
480 #undef TARGET_BUILTIN_DECL
481 #define TARGET_BUILTIN_DECL sh_builtin_decl
482 #undef TARGET_EXPAND_BUILTIN
483 #define TARGET_EXPAND_BUILTIN sh_expand_builtin
484
485 #undef TARGET_FUNCTION_OK_FOR_SIBCALL
486 #define TARGET_FUNCTION_OK_FOR_SIBCALL sh_function_ok_for_sibcall
487
488 #undef TARGET_CANNOT_COPY_INSN_P
489 #define TARGET_CANNOT_COPY_INSN_P sh_cannot_copy_insn_p
490 #undef TARGET_RTX_COSTS
491 #define TARGET_RTX_COSTS sh_rtx_costs
492 #undef TARGET_ADDRESS_COST
493 #define TARGET_ADDRESS_COST sh_address_cost
494 #undef TARGET_ALLOCATE_INITIAL_VALUE
495 #define TARGET_ALLOCATE_INITIAL_VALUE sh_allocate_initial_value
496
497 #undef TARGET_MACHINE_DEPENDENT_REORG
498 #define TARGET_MACHINE_DEPENDENT_REORG sh_reorg
499
500 #undef TARGET_DWARF_REGISTER_SPAN
501 #define TARGET_DWARF_REGISTER_SPAN sh_dwarf_register_span
502
503 #ifdef HAVE_AS_TLS
504 #undef TARGET_HAVE_TLS
505 #define TARGET_HAVE_TLS true
506 #endif
507
508 #undef TARGET_PROMOTE_PROTOTYPES
509 #define TARGET_PROMOTE_PROTOTYPES sh_promote_prototypes
510 #undef TARGET_PROMOTE_FUNCTION_MODE
511 #define TARGET_PROMOTE_FUNCTION_MODE sh_promote_function_mode
512
513 #undef TARGET_FUNCTION_VALUE
514 #define TARGET_FUNCTION_VALUE sh_function_value
515 #undef TARGET_FUNCTION_VALUE_REGNO_P
516 #define TARGET_FUNCTION_VALUE_REGNO_P sh_function_value_regno_p
517 #undef TARGET_LIBCALL_VALUE
518 #define TARGET_LIBCALL_VALUE sh_libcall_value
519 #undef TARGET_STRUCT_VALUE_RTX
520 #define TARGET_STRUCT_VALUE_RTX sh_struct_value_rtx
521 #undef TARGET_RETURN_IN_MEMORY
522 #define TARGET_RETURN_IN_MEMORY sh_return_in_memory
523
524 #undef TARGET_EXPAND_BUILTIN_SAVEREGS
525 #define TARGET_EXPAND_BUILTIN_SAVEREGS sh_builtin_saveregs
526 #undef TARGET_SETUP_INCOMING_VARARGS
527 #define TARGET_SETUP_INCOMING_VARARGS sh_setup_incoming_varargs
528 #undef TARGET_STRICT_ARGUMENT_NAMING
529 #define TARGET_STRICT_ARGUMENT_NAMING sh_strict_argument_naming
530 #undef TARGET_PRETEND_OUTGOING_VARARGS_NAMED
531 #define TARGET_PRETEND_OUTGOING_VARARGS_NAMED sh_pretend_outgoing_varargs_named
532 #undef TARGET_MUST_PASS_IN_STACK
533 #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
534 #undef TARGET_PASS_BY_REFERENCE
535 #define TARGET_PASS_BY_REFERENCE sh_pass_by_reference
536 #undef TARGET_CALLEE_COPIES
537 #define TARGET_CALLEE_COPIES sh_callee_copies
538 #undef TARGET_ARG_PARTIAL_BYTES
539 #define TARGET_ARG_PARTIAL_BYTES sh_arg_partial_bytes
540 #undef TARGET_FUNCTION_ARG
541 #define TARGET_FUNCTION_ARG sh_function_arg
542 #undef TARGET_FUNCTION_ARG_ADVANCE
543 #define TARGET_FUNCTION_ARG_ADVANCE sh_function_arg_advance
544
545 #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
546 #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV sh_atomic_assign_expand_fenv
547
548 #undef TARGET_BUILD_BUILTIN_VA_LIST
549 #define TARGET_BUILD_BUILTIN_VA_LIST sh_build_builtin_va_list
550 #undef TARGET_EXPAND_BUILTIN_VA_START
551 #define TARGET_EXPAND_BUILTIN_VA_START sh_va_start
552 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
553 #define TARGET_GIMPLIFY_VA_ARG_EXPR sh_gimplify_va_arg_expr
554
555 #undef TARGET_VECTOR_MODE_SUPPORTED_P
556 #define TARGET_VECTOR_MODE_SUPPORTED_P sh_vector_mode_supported_p
557
558 #undef TARGET_CHECK_PCH_TARGET_FLAGS
559 #define TARGET_CHECK_PCH_TARGET_FLAGS sh_check_pch_target_flags
560
561 #undef TARGET_DWARF_CALLING_CONVENTION
562 #define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention
563
564 #undef TARGET_FRAME_POINTER_REQUIRED
565 #define TARGET_FRAME_POINTER_REQUIRED sh_frame_pointer_required
566
567 #undef TARGET_MODE_EMIT
568 #define TARGET_MODE_EMIT sh_emit_mode_set
569
570 #undef TARGET_MODE_NEEDED
571 #define TARGET_MODE_NEEDED sh_mode_needed
572
573 #undef TARGET_MODE_AFTER
574 #define TARGET_MODE_AFTER sh_mode_after
575
576 #undef TARGET_MODE_ENTRY
577 #define TARGET_MODE_ENTRY sh_mode_entry
578
579 #undef TARGET_MODE_EXIT
580 #define TARGET_MODE_EXIT sh_mode_exit
581
582 #undef TARGET_MODE_PRIORITY
583 #define TARGET_MODE_PRIORITY sh_mode_priority
584
585 /* Return regmode weight for insn. */
586 #define INSN_REGMODE_WEIGHT(INSN, MODE)\
587 regmode_weight[((MODE) == SImode) ? 0 : 1][INSN_UID (INSN)]
588
589 /* Return current register pressure for regmode. */
590 #define CURR_REGMODE_PRESSURE(MODE)\
591 curr_regmode_pressure[((MODE) == SImode) ? 0 : 1]
592
593 #undef TARGET_ENCODE_SECTION_INFO
594 #define TARGET_ENCODE_SECTION_INFO sh_encode_section_info
595
596 #undef TARGET_LRA_P
597 #define TARGET_LRA_P sh_lra_p
598
599 #undef TARGET_SECONDARY_RELOAD
600 #define TARGET_SECONDARY_RELOAD sh_secondary_reload
601
602 #undef TARGET_PREFERRED_RELOAD_CLASS
603 #define TARGET_PREFERRED_RELOAD_CLASS sh_preferred_reload_class
604
605 #undef TARGET_CONDITIONAL_REGISTER_USAGE
606 #define TARGET_CONDITIONAL_REGISTER_USAGE sh_conditional_register_usage
607
608 #undef TARGET_LEGITIMATE_ADDRESS_P
609 #define TARGET_LEGITIMATE_ADDRESS_P sh_legitimate_address_p
610
611 #undef TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P
612 #define TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P sh_cannot_substitute_mem_equiv_p
613
614 #undef TARGET_LEGITIMIZE_ADDRESS_DISPLACEMENT
615 #define TARGET_LEGITIMIZE_ADDRESS_DISPLACEMENT \
616 sh_legitimize_address_displacement
617
618 #undef TARGET_TRAMPOLINE_INIT
619 #define TARGET_TRAMPOLINE_INIT sh_trampoline_init
620 #undef TARGET_TRAMPOLINE_ADJUST_ADDRESS
621 #define TARGET_TRAMPOLINE_ADJUST_ADDRESS sh_trampoline_adjust_address
622
623 #undef TARGET_LEGITIMATE_CONSTANT_P
624 #define TARGET_LEGITIMATE_CONSTANT_P sh_legitimate_constant_p
625
626 #undef TARGET_CANONICALIZE_COMPARISON
627 #define TARGET_CANONICALIZE_COMPARISON sh_canonicalize_comparison
628
629 #undef TARGET_LEGITIMATE_COMBINED_INSN
630 #define TARGET_LEGITIMATE_COMBINED_INSN sh_legitimate_combined_insn
631
632 #undef TARGET_FIXED_CONDITION_CODE_REGS
633 #define TARGET_FIXED_CONDITION_CODE_REGS sh_fixed_condition_code_regs
634
635 #undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
636 #define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P \
637 sh_use_by_pieces_infrastructure_p
638
639 /* Machine-specific symbol_ref flags. */
640 #define SYMBOL_FLAG_FUNCVEC_FUNCTION (SYMBOL_FLAG_MACH_DEP << 0)
641
642 /* The tas.b instruction sets the 7th bit in the byte, i.e. 0x80. This value
643 is used by optabs.c atomic op expansion code as well as in sync.md. */
644 #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL
645 #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 0x80
646
647 #undef TARGET_CANNOT_FORCE_CONST_MEM
648 #define TARGET_CANNOT_FORCE_CONST_MEM sh_cannot_force_const_mem_p
649
650 #undef TARGET_HARD_REGNO_NREGS
651 #define TARGET_HARD_REGNO_NREGS sh_hard_regno_nregs
652 #undef TARGET_HARD_REGNO_MODE_OK
653 #define TARGET_HARD_REGNO_MODE_OK sh_hard_regno_mode_ok
654
655 #undef TARGET_MODES_TIEABLE_P
656 #define TARGET_MODES_TIEABLE_P sh_modes_tieable_p
657
658 #undef TARGET_CAN_CHANGE_MODE_CLASS
659 #define TARGET_CAN_CHANGE_MODE_CLASS sh_can_change_mode_class
660
661 #undef TARGET_CONSTANT_ALIGNMENT
662 #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings
663
664 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
665 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
666
667 struct gcc_target targetm = TARGET_INITIALIZER;
668 \f
669
670 /* Information on the currently selected atomic model.
671 This is initialized in sh_option_override. */
672 static sh_atomic_model selected_atomic_model_;
673
674 const sh_atomic_model&
675 selected_atomic_model (void)
676 {
677 return selected_atomic_model_;
678 }
679
680 static sh_atomic_model
681 parse_validate_atomic_model_option (const char* str)
682 {
683 const char* model_names[sh_atomic_model::num_models];
684 model_names[sh_atomic_model::none] = "none";
685 model_names[sh_atomic_model::soft_gusa] = "soft-gusa";
686 model_names[sh_atomic_model::hard_llcs] = "hard-llcs";
687 model_names[sh_atomic_model::soft_tcb] = "soft-tcb";
688 model_names[sh_atomic_model::soft_imask] = "soft-imask";
689
690 const char* model_cdef_names[sh_atomic_model::num_models];
691 model_cdef_names[sh_atomic_model::none] = "NONE";
692 model_cdef_names[sh_atomic_model::soft_gusa] = "SOFT_GUSA";
693 model_cdef_names[sh_atomic_model::hard_llcs] = "HARD_LLCS";
694 model_cdef_names[sh_atomic_model::soft_tcb] = "SOFT_TCB";
695 model_cdef_names[sh_atomic_model::soft_imask] = "SOFT_IMASK";
696
697 sh_atomic_model ret;
698 ret.type = sh_atomic_model::none;
699 ret.name = model_names[sh_atomic_model::none];
700 ret.cdef_name = model_cdef_names[sh_atomic_model::none];
701 ret.strict = false;
702 ret.tcb_gbr_offset = -1;
703
704 /* Handle empty string as 'none'. */
705 if (str == NULL || *str == '\0')
706 return ret;
707
708 #define err_ret(...) do { error (__VA_ARGS__); return ret; } while (0)
709
710 std::vector<std::string> tokens;
711 for (std::stringstream ss (str); ss.good (); )
712 {
713 tokens.push_back (std::string ());
714 std::getline (ss, tokens.back (), ',');
715 }
716
717 if (tokens.empty ())
718 err_ret ("invalid atomic model option");
719
720 /* The first token must be the atomic model name. */
721 {
722 for (size_t i = 0; i < sh_atomic_model::num_models; ++i)
723 if (tokens.front () == model_names[i])
724 {
725 ret.type = (sh_atomic_model::enum_type)i;
726 ret.name = model_names[i];
727 ret.cdef_name = model_cdef_names[i];
728 goto got_mode_name;
729 }
730
731 err_ret ("invalid atomic model name \"%s\"", tokens.front ().c_str ());
732 got_mode_name:;
733 }
734
735 /* Go through the remaining tokens. */
736 for (size_t i = 1; i < tokens.size (); ++i)
737 {
738 if (tokens[i] == "strict")
739 ret.strict = true;
740 else if (!tokens[i].compare (0, strlen ("gbr-offset="), "gbr-offset="))
741 {
742 std::string offset_str = tokens[i].substr (strlen ("gbr-offset="));
743 ret.tcb_gbr_offset = integral_argument (offset_str.c_str ());
744 if (offset_str.empty () || ret.tcb_gbr_offset == -1)
745 err_ret ("could not parse gbr-offset value \"%s\" in atomic model "
746 "option", offset_str.c_str ());
747 }
748 else
749 err_ret ("unknown parameter \"%s\" in atomic model option",
750 tokens[i].c_str ());
751 }
752
753 /* Check that the selection makes sense. */
754 if (ret.type == sh_atomic_model::soft_gusa && !TARGET_SH3)
755 err_ret ("atomic model %s is only available on SH3 and SH4 targets",
756 ret.name);
757
758 if (ret.type == sh_atomic_model::hard_llcs && !TARGET_SH4A)
759 err_ret ("atomic model %s is only available on SH4A targets", ret.name);
760
761 if (ret.type == sh_atomic_model::soft_tcb && ret.tcb_gbr_offset == -1)
762 err_ret ("atomic model %s requires gbr-offset parameter", ret.name);
763
764 if (ret.type == sh_atomic_model::soft_tcb
765 && (ret.tcb_gbr_offset < 0 || ret.tcb_gbr_offset > 1020
766 || (ret.tcb_gbr_offset & 3) != 0))
767 err_ret ("invalid gbr-offset value \"%d\" for atomic model %s; it must be "
768 "a multiple of 4 in the range 0-1020", ret.tcb_gbr_offset,
769 ret.name);
770
771 if (ret.type == sh_atomic_model::soft_imask && TARGET_USERMODE)
772 err_ret ("cannot use atomic model %s in user mode", ret.name);
773
774 return ret;
775
776 #undef err_ret
777 }
778
779 /* Register SH specific RTL passes. */
780 extern opt_pass* make_pass_sh_treg_combine (gcc::context* ctx, bool split_insns,
781 const char* name);
782 extern opt_pass* make_pass_sh_optimize_sett_clrt (gcc::context* ctx,
783 const char* name);
784 static void
785 register_sh_passes (void)
786 {
787 /* Running the sh_treg_combine pass after ce1 generates better code when
788 comparisons are combined and reg-reg moves are introduced, because
789 reg-reg moves will be eliminated afterwards. However, there are quite
790 some cases where combine will be unable to fold comparison related insns,
791 thus for now don't do it.
792 register_pass (make_pass_sh_treg_combine (g, false, "sh_treg_combine1"),
793 PASS_POS_INSERT_AFTER, "ce1", 1);
794 */
795
796 /* Run sh_treg_combine pass after combine but before register allocation. */
797 register_pass (make_pass_sh_treg_combine (g, true, "sh_treg_combine2"),
798 PASS_POS_INSERT_AFTER, "split1", 1);
799
800 /* Run sh_treg_combine pass after register allocation and basic block
801 reordering as this sometimes creates new opportunities. */
802 register_pass (make_pass_sh_treg_combine (g, true, "sh_treg_combine3"),
803 PASS_POS_INSERT_AFTER, "split4", 1);
804
805 /* Optimize sett and clrt insns, by e.g. removing them if the T bit value
806 is known after a conditional branch.
807 This must be done after basic blocks and branch conditions have
808 stabilized and won't be changed by further passes. */
809 register_pass (make_pass_sh_optimize_sett_clrt (g, "sh_optimize_sett_clrt"),
810 PASS_POS_INSERT_BEFORE, "sched2", 1);
811 }
812
813 /* Implement TARGET_OPTION_OVERRIDE macro. Validate and override
814 various options, and do some machine dependent initialization. */
815 static void
816 sh_option_override (void)
817 {
818 int regno;
819
820 SUBTARGET_OVERRIDE_OPTIONS;
821
822 sh_cpu = PROCESSOR_SH1;
823 assembler_dialect = 0;
824 if (TARGET_SH2)
825 sh_cpu = PROCESSOR_SH2;
826 if (TARGET_SH2E)
827 sh_cpu = PROCESSOR_SH2E;
828 if (TARGET_SH2A)
829 sh_cpu = PROCESSOR_SH2A;
830 if (TARGET_SH3)
831 sh_cpu = PROCESSOR_SH3;
832 if (TARGET_SH3E)
833 sh_cpu = PROCESSOR_SH3E;
834 if (TARGET_SH4)
835 {
836 assembler_dialect = 1;
837 sh_cpu = PROCESSOR_SH4;
838 }
839 if (TARGET_SH4A)
840 {
841 assembler_dialect = 1;
842 sh_cpu = PROCESSOR_SH4A;
843 }
844
845 /* User/priviledged mode is supported only on SH3* and SH4*.
846 Disable it for everything else. */
847 if (!TARGET_SH3 && TARGET_USERMODE)
848 TARGET_USERMODE = false;
849
850 if (! strcmp (sh_div_str, "call-div1"))
851 sh_div_strategy = SH_DIV_CALL_DIV1;
852 else if (! strcmp (sh_div_str, "call-fp") && TARGET_FPU_ANY)
853 sh_div_strategy = SH_DIV_CALL_FP;
854 else if (! strcmp (sh_div_str, "call-table") && TARGET_DYNSHIFT)
855 sh_div_strategy = SH_DIV_CALL_TABLE;
856 else
857 {
858 /* Pick one that makes most sense for the target in general.
859 It is not much good to use different functions depending on -Os,
860 since then we'll end up with two different functions when some of
861 the code is compiled for size, and some for speed. */
862
863 /* SH4 tends to emphasize speed. */
864 if (TARGET_HARD_SH4)
865 sh_div_strategy = SH_DIV_CALL_TABLE;
866 /* These have their own way of doing things. */
867 else if (TARGET_SH2A)
868 sh_div_strategy = SH_DIV_INTRINSIC;
869 /* SH1 .. SH3 cores often go into small-footprint systems, so
870 default to the smallest implementation available. */
871 else
872 sh_div_strategy = SH_DIV_CALL_DIV1;
873 }
874
875 if (sh_divsi3_libfunc[0])
876 ; /* User supplied - leave it alone. */
877 else if (TARGET_DIVIDE_CALL_FP)
878 sh_divsi3_libfunc = "__sdivsi3_i4";
879 else if (TARGET_DIVIDE_CALL_TABLE)
880 sh_divsi3_libfunc = "__sdivsi3_i4i";
881 else
882 sh_divsi3_libfunc = "__sdivsi3";
883
884 if (sh_branch_cost == -1)
885 {
886 /* The SH1 does not have delay slots, hence we get a pipeline stall
887 at every branch. The SH4 is superscalar, so the single delay slot
888 is not sufficient to keep both pipelines filled.
889 In any case, set the default branch cost to '2', as it results in
890 slightly overall smaller code and also enables some if conversions
891 that are required for matching special T bit related insns. */
892 sh_branch_cost = 2;
893 }
894
895 /* Set -mzdcbranch for SH4 / SH4A if not otherwise specified by the user. */
896 if (! global_options_set.x_TARGET_ZDCBRANCH && TARGET_HARD_SH4)
897 TARGET_ZDCBRANCH = 1;
898
899 /* FDPIC code is a special form of PIC, and the vast majority of code
900 generation constraints that apply to PIC also apply to FDPIC, so we
901 set flag_pic to avoid the need to check TARGET_FDPIC everywhere
902 flag_pic is checked. */
903 if (TARGET_FDPIC && !flag_pic)
904 flag_pic = 2;
905
906 for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
907 if (! VALID_REGISTER_P (regno))
908 sh_register_names[regno][0] = '\0';
909
910 for (regno = 0; regno < ADDREGNAMES_SIZE; regno++)
911 if (! VALID_REGISTER_P (ADDREGNAMES_REGNO (regno)))
912 sh_additional_register_names[regno][0] = '\0';
913
914 if (flag_pic && ! TARGET_PREFERGOT)
915 flag_no_function_cse = 1;
916
917 if (targetm.small_register_classes_for_mode_p (VOIDmode))
918 {
919 /* Never run scheduling before reload, since that can
920 break global alloc, and generates slower code anyway due
921 to the pressure on R0. */
922 /* Enable sched1 for SH4 if the user explicitly requests.
923 When sched1 is enabled, the ready queue will be reordered by
924 the target hooks if pressure is high. We cannot do this for
925 PIC, SH3 and lower as they give spill failures for R0. */
926 if (!TARGET_HARD_SH4 || flag_pic)
927 flag_schedule_insns = 0;
928 /* ??? Current exception handling places basic block boundaries
929 after call_insns. It causes the high pressure on R0 and gives
930 spill failures for R0 in reload. See PR 22553 and the thread
931 on gcc-patches
932 <http://gcc.gnu.org/ml/gcc-patches/2005-10/msg00816.html>. */
933 else if (flag_exceptions)
934 {
935 if (flag_schedule_insns && global_options_set.x_flag_schedule_insns)
936 warning (0, "ignoring %<-fschedule-insns%> because of exception "
937 "handling bug");
938 flag_schedule_insns = 0;
939 }
940 else if (flag_schedule_insns
941 && !global_options_set.x_flag_schedule_insns)
942 flag_schedule_insns = 0;
943 }
944
945 /* Unwind info is not correct around the CFG unless either a frame
946 pointer is present or M_A_O_A is set. Fixing this requires rewriting
947 unwind info generation to be aware of the CFG and propagating states
948 around edges. */
949 if ((flag_unwind_tables || flag_asynchronous_unwind_tables
950 || flag_exceptions || flag_non_call_exceptions)
951 && flag_omit_frame_pointer && !TARGET_ACCUMULATE_OUTGOING_ARGS)
952 {
953 warning (0, "unwind tables currently require either a frame pointer "
954 "or %<-maccumulate-outgoing-args%> for correctness");
955 TARGET_ACCUMULATE_OUTGOING_ARGS = 1;
956 }
957
958 if (flag_unsafe_math_optimizations)
959 {
960 /* Enable fsca insn for SH4A if not otherwise specified by the user. */
961 if (global_options_set.x_TARGET_FSCA == 0
962 && (TARGET_SH4A_FP || TARGET_FPU_SH4_300))
963 TARGET_FSCA = 1;
964
965 /* Enable fsrra insn for SH4A if not otherwise specified by the user. */
966 if (global_options_set.x_TARGET_FSRRA == 0
967 && (TARGET_SH4A_FP || TARGET_FPU_SH4_300))
968 TARGET_FSRRA = 1;
969 }
970
971 /* Allow fsrra insn only if -funsafe-math-optimizations and
972 -ffinite-math-only is enabled. */
973 TARGET_FSRRA = TARGET_FSRRA
974 && flag_unsafe_math_optimizations
975 && flag_finite_math_only;
976
977 /* If the -mieee option was not explicitly set by the user, turn it on
978 unless -ffinite-math-only was specified. See also PR 33135. */
979 if (! global_options_set.x_TARGET_IEEE)
980 TARGET_IEEE = ! flag_finite_math_only;
981
982 if (sh_fixed_range_str)
983 sh_fix_range (sh_fixed_range_str);
984
985 /* This target defaults to strict volatile bitfields. */
986 if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2))
987 flag_strict_volatile_bitfields = 1;
988
989 sh_override_options_after_change ();
990
991 /* Parse atomic model option and make sure it is valid for the current
992 target CPU. */
993 selected_atomic_model_
994 = parse_validate_atomic_model_option (sh_atomic_model_str);
995
996 register_sh_passes ();
997 }
998
999 /* Implement targetm.override_options_after_change. */
1000
1001 static void
1002 sh_override_options_after_change (void)
1003 {
1004 /* Adjust loop, jump and function alignment values (in bytes), if those
1005 were not specified by the user using -falign-loops, -falign-jumps
1006 and -falign-functions options.
1007 32 bit alignment is better for speed, because instructions can be
1008 fetched as a pair from a longword boundary. For size use 16 bit
1009 alignment to get more compact code.
1010 Aligning all jumps increases the code size, even if it might
1011 result in slightly faster code. Thus, it is set to the smallest
1012 alignment possible if not specified by the user. */
1013 if (flag_align_loops && !str_align_loops)
1014 str_align_loops = optimize_size ? "2" : "4";
1015
1016 /* Parse values so that we can compare for current value. */
1017 parse_alignment_opts ();
1018 if (flag_align_jumps && !str_align_jumps)
1019 str_align_jumps = "2";
1020 else if (align_jumps.levels[0].get_value () < 2)
1021 str_align_jumps = "2";
1022
1023 if (flag_align_functions && !str_align_functions)
1024 str_align_functions = optimize_size ? "2" : "4";
1025
1026 /* The linker relaxation code breaks when a function contains
1027 alignments that are larger than that at the start of a
1028 compilation unit. */
1029 if (TARGET_RELAX)
1030 {
1031 /* Parse values so that we can compare for current value. */
1032 parse_alignment_opts ();
1033 int min_align = MAX (align_loops.levels[0].get_value (),
1034 align_jumps.levels[0].get_value ());
1035
1036 /* Also take possible .long constants / mova tables into account. */
1037 if (min_align < 4)
1038 min_align = 4;
1039 if (align_functions.levels[0].get_value () < min_align)
1040 {
1041 char *r = XNEWVEC (char, 16);
1042 sprintf (r, "%d", min_align);
1043 str_align_functions = r;
1044 }
1045 }
1046 }
1047 \f
1048 /* Print the operand address in x to the stream. */
1049 static void
1050 sh_print_operand_address (FILE *stream, machine_mode /*mode*/, rtx x)
1051 {
1052 switch (GET_CODE (x))
1053 {
1054 case REG:
1055 case SUBREG:
1056 fprintf (stream, "@%s", reg_names[true_regnum (x)]);
1057 break;
1058
1059 case PLUS:
1060 {
1061 rtx base = XEXP (x, 0);
1062 rtx index = XEXP (x, 1);
1063
1064 switch (GET_CODE (index))
1065 {
1066 case CONST_INT:
1067 fprintf (stream, "@(%d,%s)", (int) INTVAL (index),
1068 reg_names[true_regnum (base)]);
1069 break;
1070
1071 case REG:
1072 case SUBREG:
1073 {
1074 int base_num = true_regnum (base);
1075 int index_num = true_regnum (index);
1076
1077 /* If base or index is R0, make sure that it comes first.
1078 Usually one of them will be R0, but the order might be wrong.
1079 If neither base nor index are R0 it's an error and we just
1080 pass it on to the assembler. This avoids silent wrong code
1081 bugs. */
1082 if (base_num == 0 && index_num != 0)
1083 std::swap (base_num, index_num);
1084
1085 fprintf (stream, "@(%s,%s)", reg_names[index_num],
1086 reg_names[base_num]);
1087 break;
1088 }
1089
1090 default:
1091 gcc_unreachable ();
1092 }
1093 }
1094 break;
1095
1096 case PRE_DEC:
1097 fprintf (stream, "@-%s", reg_names[true_regnum (XEXP (x, 0))]);
1098 break;
1099
1100 case POST_INC:
1101 fprintf (stream, "@%s+", reg_names[true_regnum (XEXP (x, 0))]);
1102 break;
1103
1104 default:
1105 x = mark_constant_pool_use (x);
1106 output_addr_const (stream, x);
1107 break;
1108 }
1109 }
1110
1111 /* Print operand x (an rtx) in assembler syntax to file stream
1112 according to modifier code.
1113
1114 '.' print a .s if insn needs delay slot
1115 ',' print LOCAL_LABEL_PREFIX
1116 '@' print trap, rte or rts depending upon pragma interruptness
1117 '#' output a nop if there is nothing to put in the delay slot
1118 ''' print likelihood suffix (/u for unlikely).
1119 '>' print branch target if -fverbose-asm
1120 'O' print a constant without the #
1121 'R' print the LSW of a dp value - changes if in little endian
1122 'S' print the MSW of a dp value - changes if in little endian
1123 'T' print the next word of a dp value - same as 'R' in big endian mode.
1124 'M' print .b / .w / .l / .s / .d suffix if operand is a MEM.
1125 'N' print 'r63' if the operand is (const_int 0).
1126 'd' print a V2SF reg as dN instead of fpN.
1127 'm' print a pair `base,offset' or `base,index', for LD and ST.
1128 'U' Likewise for {LD,ST}{HI,LO}.
1129 'V' print the position of a single bit set.
1130 'W' print the position of a single bit cleared.
1131 't' print a memory address which is a register.
1132 'u' prints the lowest 16 bits of CONST_INT, as an unsigned value.
1133 'o' output an operator. */
1134 static void
1135 sh_print_operand (FILE *stream, rtx x, int code)
1136 {
1137 int regno;
1138 machine_mode mode;
1139
1140 switch (code)
1141 {
1142 tree trapa_attr;
1143
1144 case '.':
1145 if (final_sequence
1146 && ! INSN_ANNULLED_BRANCH_P (final_sequence->insn (0))
1147 && get_attr_length (final_sequence->insn (1)))
1148 fprintf (stream, ASSEMBLER_DIALECT ? "/s" : ".s");
1149 break;
1150 case ',':
1151 fprintf (stream, "%s", LOCAL_LABEL_PREFIX);
1152 break;
1153 case '@':
1154 trapa_attr = lookup_attribute ("trap_exit",
1155 DECL_ATTRIBUTES (current_function_decl));
1156 if (trapa_attr)
1157 fprintf (stream, "trapa #%ld",
1158 (long) TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (trapa_attr))));
1159 else if (sh_cfun_interrupt_handler_p ())
1160 {
1161 if (sh_cfun_resbank_handler_p ())
1162 fprintf (stream, "resbank\n");
1163 fprintf (stream, "rte");
1164 }
1165 else
1166 fprintf (stream, "rts");
1167 break;
1168 case '#':
1169 /* Output a nop if there's nothing in the delay slot. */
1170 if (dbr_sequence_length () == 0)
1171 fprintf (stream, "\n\tnop");
1172 break;
1173 case '\'':
1174 {
1175 rtx note = find_reg_note (current_output_insn, REG_BR_PROB, 0);
1176
1177 if (note
1178 && profile_probability::from_reg_br_prob_note (XINT (note, 0))
1179 < profile_probability::even ())
1180 fputs ("/u", stream);
1181 break;
1182 }
1183 case '>':
1184 if (flag_verbose_asm && JUMP_LABEL (current_output_insn))
1185 {
1186 fputs ("\t! target: ", stream);
1187 output_addr_const (stream, JUMP_LABEL (current_output_insn));
1188 }
1189 break;
1190 case 'O':
1191 x = mark_constant_pool_use (x);
1192 output_addr_const (stream, x);
1193 break;
1194 /* N.B.: %R / %S / %T adjust memory addresses by four.
1195 While they can be used to access 64 bit parts of a larger value
1196 held in general purpose registers, that won't work with memory -
1197 neither for fp registers, since the frxx names are used. */
1198 case 'R':
1199 if (REG_P (x) || GET_CODE (x) == SUBREG)
1200 {
1201 regno = true_regnum (x);
1202 regno += FP_REGISTER_P (regno) ? 1 : SH_REG_LSW_OFFSET;
1203 fputs (reg_names[regno], (stream));
1204 }
1205 else if (MEM_P (x))
1206 {
1207 x = adjust_address (x, SImode, 4 * SH_REG_LSW_OFFSET);
1208 sh_print_operand_address (stream, GET_MODE (x), XEXP (x, 0));
1209 }
1210 else
1211 {
1212 rtx sub = NULL_RTX;
1213
1214 mode = GET_MODE (x);
1215 if (mode == VOIDmode)
1216 mode = DImode;
1217 if (GET_MODE_SIZE (mode) >= 8)
1218 sub = simplify_subreg (SImode, x, mode, 4 * SH_REG_LSW_OFFSET);
1219 if (sub)
1220 sh_print_operand (stream, sub, 0);
1221 else
1222 output_operand_lossage ("invalid operand to %%R");
1223 }
1224 break;
1225 case 'S':
1226 if (REG_P (x) || GET_CODE (x) == SUBREG)
1227 {
1228 regno = true_regnum (x);
1229 regno += FP_REGISTER_P (regno) ? 0 : SH_REG_MSW_OFFSET;
1230 fputs (reg_names[regno], (stream));
1231 }
1232 else if (MEM_P (x))
1233 {
1234 x = adjust_address (x, SImode, 4 * SH_REG_MSW_OFFSET);
1235 sh_print_operand_address (stream, GET_MODE (x), XEXP (x, 0));
1236 }
1237 else
1238 {
1239 rtx sub = NULL_RTX;
1240
1241 mode = GET_MODE (x);
1242 if (mode == VOIDmode)
1243 mode = DImode;
1244 if (GET_MODE_SIZE (mode) >= 8)
1245 sub = simplify_subreg (SImode, x, mode, 4 * SH_REG_MSW_OFFSET);
1246 if (sub)
1247 sh_print_operand (stream, sub, 0);
1248 else
1249 output_operand_lossage ("invalid operand to %%S");
1250 }
1251 break;
1252 case 'T':
1253 /* Next word of a double. */
1254 switch (GET_CODE (x))
1255 {
1256 case REG:
1257 fputs (reg_names[REGNO (x) + 1], (stream));
1258 break;
1259 case MEM:
1260 {
1261 machine_mode mode = GET_MODE (x);
1262 if (GET_CODE (XEXP (x, 0)) != PRE_DEC
1263 && GET_CODE (XEXP (x, 0)) != POST_INC)
1264 x = adjust_address (x, SImode, 4);
1265 sh_print_operand_address (stream, mode, XEXP (x, 0));
1266 }
1267 break;
1268 default:
1269 break;
1270 }
1271 break;
1272
1273 case 't':
1274 gcc_assert (MEM_P (x));
1275 x = XEXP (x, 0);
1276 switch (GET_CODE (x))
1277 {
1278 case REG:
1279 case SUBREG:
1280 sh_print_operand (stream, x, 0);
1281 break;
1282 default:
1283 break;
1284 }
1285 break;
1286
1287 case 'o':
1288 switch (GET_CODE (x))
1289 {
1290 case PLUS: fputs ("add", stream); break;
1291 case MINUS: fputs ("sub", stream); break;
1292 case MULT: fputs ("mul", stream); break;
1293 case DIV: fputs ("div", stream); break;
1294 case EQ: fputs ("eq", stream); break;
1295 case NE: fputs ("ne", stream); break;
1296 case GT: case LT: fputs ("gt", stream); break;
1297 case GE: case LE: fputs ("ge", stream); break;
1298 case GTU: case LTU: fputs ("gtu", stream); break;
1299 case GEU: case LEU: fputs ("geu", stream); break;
1300 default:
1301 break;
1302 }
1303 break;
1304 case 'M':
1305 if (MEM_P (x))
1306 {
1307 switch (GET_MODE (x))
1308 {
1309 case E_QImode: fputs (".b", stream); break;
1310 case E_HImode: fputs (".w", stream); break;
1311 case E_SImode: fputs (".l", stream); break;
1312 case E_SFmode: fputs (".s", stream); break;
1313 case E_DFmode: fputs (".d", stream); break;
1314 default: gcc_unreachable ();
1315 }
1316 }
1317 break;
1318
1319 case 'm':
1320 gcc_assert (MEM_P (x));
1321 x = XEXP (x, 0);
1322 /* Fall through. */
1323 case 'U':
1324 switch (GET_CODE (x))
1325 {
1326 case REG:
1327 case SUBREG:
1328 sh_print_operand (stream, x, 0);
1329 fputs (", 0", stream);
1330 break;
1331
1332 case PLUS:
1333 sh_print_operand (stream, XEXP (x, 0), 0);
1334 fputs (", ", stream);
1335 sh_print_operand (stream, XEXP (x, 1), 0);
1336 break;
1337
1338 default:
1339 gcc_unreachable ();
1340 }
1341 break;
1342
1343 case 'V':
1344 {
1345 int num = exact_log2 (INTVAL (x));
1346 gcc_assert (num >= 0);
1347 fprintf (stream, "#%d", num);
1348 }
1349 break;
1350
1351 case 'W':
1352 {
1353 int num = exact_log2 (~INTVAL (x));
1354 gcc_assert (num >= 0);
1355 fprintf (stream, "#%d", num);
1356 }
1357 break;
1358
1359 case 'd':
1360 gcc_assert (REG_P (x) && GET_MODE (x) == V2SFmode);
1361
1362 fprintf ((stream), "d%s", reg_names[REGNO (x)] + 1);
1363 break;
1364
1365 case 'N':
1366 if (x == CONST0_RTX (GET_MODE (x)))
1367 {
1368 fprintf ((stream), "r63");
1369 break;
1370 }
1371 goto default_output;
1372 case 'u':
1373 if (CONST_INT_P (x))
1374 {
1375 fprintf ((stream), "%u", (unsigned) INTVAL (x) & (0x10000 - 1));
1376 break;
1377 }
1378 /* Fall through. */
1379
1380 default_output:
1381 default:
1382 regno = 0;
1383 mode = GET_MODE (x);
1384
1385 switch (GET_CODE (x))
1386 {
1387 case TRUNCATE:
1388 {
1389 rtx inner = XEXP (x, 0);
1390 int offset = 0;
1391 machine_mode inner_mode;
1392
1393 /* We might see SUBREGs with vector mode registers inside. */
1394 if (GET_CODE (inner) == SUBREG
1395 && (GET_MODE_SIZE (GET_MODE (inner))
1396 == GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner))))
1397 && subreg_lowpart_p (inner))
1398 inner = SUBREG_REG (inner);
1399 if (CONST_INT_P (inner))
1400 {
1401 x = GEN_INT (trunc_int_for_mode (INTVAL (inner), GET_MODE (x)));
1402 goto default_output;
1403 }
1404 inner_mode = GET_MODE (inner);
1405 if (GET_CODE (inner) == SUBREG
1406 && (GET_MODE_SIZE (GET_MODE (inner))
1407 < GET_MODE_SIZE (GET_MODE (SUBREG_REG (inner))))
1408 && REG_P (SUBREG_REG (inner)))
1409 {
1410 offset = subreg_regno_offset (REGNO (SUBREG_REG (inner)),
1411 GET_MODE (SUBREG_REG (inner)),
1412 SUBREG_BYTE (inner),
1413 GET_MODE (inner));
1414 inner = SUBREG_REG (inner);
1415 }
1416 if (!REG_P (inner) || GET_MODE_SIZE (inner_mode) > 8)
1417 abort ();
1418 /* Floating point register pairs are always big endian;
1419 general purpose registers are 64 bit wide. */
1420 regno = REGNO (inner);
1421 regno = (hard_regno_nregs (regno, inner_mode)
1422 - hard_regno_nregs (regno, mode))
1423 + offset;
1424 x = inner;
1425 goto reg;
1426 }
1427 case SIGN_EXTEND:
1428 x = XEXP (x, 0);
1429 goto reg;
1430 case SUBREG:
1431 gcc_assert (SUBREG_BYTE (x) == 0
1432 && REG_P (SUBREG_REG (x)));
1433
1434 x = SUBREG_REG (x);
1435 /* Fall through. */
1436
1437 reg:
1438 case REG:
1439 regno += REGNO (x);
1440 if (FP_REGISTER_P (regno)
1441 && mode == V16SFmode)
1442 fprintf ((stream), "mtrx%s", reg_names[regno] + 2);
1443 else if (FP_REGISTER_P (REGNO (x))
1444 && mode == V4SFmode)
1445 fprintf ((stream), "fv%s", reg_names[regno] + 2);
1446 else if (REG_P (x)
1447 && mode == V2SFmode)
1448 fprintf ((stream), "fp%s", reg_names[regno] + 2);
1449 else if (FP_REGISTER_P (REGNO (x))
1450 && GET_MODE_SIZE (mode) > 4)
1451 fprintf ((stream), "d%s", reg_names[regno] + 1);
1452 else
1453 fputs (reg_names[regno], (stream));
1454 break;
1455
1456 case MEM:
1457 output_address (GET_MODE (x), XEXP (x, 0));
1458 break;
1459
1460 default:
1461 fputc ('#', stream);
1462 output_addr_const (stream, x);
1463 break;
1464 }
1465 break;
1466 }
1467 }
1468
1469 static bool
1470 sh_print_operand_punct_valid_p (unsigned char code)
1471 {
1472 return (code == '.' || code == '#' || code == '@' || code == ','
1473 || code == '$' || code == '\'' || code == '>');
1474 }
1475
1476 /* Implement TARGET_ASM_OUTPUT_ADDR_CONST_EXTRA. */
1477 static bool
1478 sh_asm_output_addr_const_extra (FILE *file, rtx x)
1479 {
1480 if (GET_CODE (x) == UNSPEC)
1481 {
1482 switch (XINT (x, 1))
1483 {
1484 case UNSPEC_PIC:
1485 /* GLOBAL_OFFSET_TABLE or local symbols, no suffix. */
1486 output_addr_const (file, XVECEXP (x, 0, 0));
1487 break;
1488 case UNSPEC_GOT:
1489 output_addr_const (file, XVECEXP (x, 0, 0));
1490 fputs ("@GOT", file);
1491 break;
1492 case UNSPEC_GOTOFF:
1493 output_addr_const (file, XVECEXP (x, 0, 0));
1494 fputs ("@GOTOFF", file);
1495 break;
1496 case UNSPEC_PLT:
1497 output_addr_const (file, XVECEXP (x, 0, 0));
1498 fputs ("@PLT", file);
1499 break;
1500 case UNSPEC_GOTPLT:
1501 output_addr_const (file, XVECEXP (x, 0, 0));
1502 fputs ("@GOTPLT", file);
1503 break;
1504 case UNSPEC_PCREL:
1505 output_addr_const (file, XVECEXP (x, 0, 0));
1506 fputs ("@PCREL", file);
1507 break;
1508 case UNSPEC_DTPOFF:
1509 output_addr_const (file, XVECEXP (x, 0, 0));
1510 fputs ("@DTPOFF", file);
1511 break;
1512 case UNSPEC_GOTTPOFF:
1513 output_addr_const (file, XVECEXP (x, 0, 0));
1514 fputs ("@GOTTPOFF", file);
1515 break;
1516 case UNSPEC_TPOFF:
1517 output_addr_const (file, XVECEXP (x, 0, 0));
1518 fputs ("@TPOFF", file);
1519 break;
1520 case UNSPEC_CALLER:
1521 {
1522 char name[32];
1523 /* LPCS stands for Label for PIC Call Site. */
1524 targetm.asm_out.generate_internal_label (name, "LPCS",
1525 INTVAL (XVECEXP (x, 0, 0)));
1526 assemble_name (file, name);
1527 }
1528 break;
1529 case UNSPEC_SYMOFF:
1530 output_addr_const (file, XVECEXP (x, 0, 0));
1531 fputc ('-', file);
1532 if (GET_CODE (XVECEXP (x, 0, 1)) == CONST)
1533 {
1534 fputc ('(', file);
1535 output_addr_const (file, XVECEXP (x, 0, 1));
1536 fputc (')', file);
1537 }
1538 else
1539 output_addr_const (file, XVECEXP (x, 0, 1));
1540 break;
1541 case UNSPEC_PCREL_SYMOFF:
1542 output_addr_const (file, XVECEXP (x, 0, 0));
1543 fputs ("-(", file);
1544 output_addr_const (file, XVECEXP (x, 0, 1));
1545 fputs ("-.)", file);
1546 break;
1547 case UNSPEC_GOTFUNCDESC:
1548 output_addr_const (file, XVECEXP (x, 0, 0));
1549 fputs ("@GOTFUNCDESC", file);
1550 break;
1551 case UNSPEC_GOTOFFFUNCDESC:
1552 output_addr_const (file, XVECEXP (x, 0, 0));
1553 fputs ("@GOTOFFFUNCDESC", file);
1554 break;
1555 default:
1556 return false;
1557 }
1558 return true;
1559 }
1560 else
1561 return false;
1562 }
1563 \f
1564 /* Encode symbol attributes of a SYMBOL_REF into its
1565 SYMBOL_REF_FLAGS. */
1566 static void
1567 sh_encode_section_info (tree decl, rtx rtl, int first)
1568 {
1569 default_encode_section_info (decl, rtl, first);
1570
1571 if (TREE_CODE (decl) == FUNCTION_DECL
1572 && sh2a_function_vector_p (decl) && TARGET_SH2A)
1573 SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FUNCVEC_FUNCTION;
1574 }
1575
1576 /* Prepare operands for a move define_expand; specifically, one of the
1577 operands must be in a register. */
1578 void
1579 prepare_move_operands (rtx operands[], machine_mode mode)
1580 {
1581 if ((mode == SImode || mode == DImode)
1582 && flag_pic
1583 && ! ((mode == Pmode || mode == ptr_mode)
1584 && tls_symbolic_operand (operands[1], Pmode) != TLS_MODEL_NONE))
1585 {
1586 rtx temp;
1587 if (SYMBOLIC_CONST_P (operands[1]))
1588 {
1589 if (MEM_P (operands[0]))
1590 operands[1] = force_reg (Pmode, operands[1]);
1591 else
1592 {
1593 temp = (!can_create_pseudo_p ()
1594 ? operands[0]
1595 : gen_reg_rtx (Pmode));
1596 operands[1] = legitimize_pic_address (operands[1], mode, temp);
1597 }
1598 }
1599 else if (GET_CODE (operands[1]) == CONST
1600 && GET_CODE (XEXP (operands[1], 0)) == PLUS
1601 && SYMBOLIC_CONST_P (XEXP (XEXP (operands[1], 0), 0)))
1602 {
1603 temp = !can_create_pseudo_p () ? operands[0] : gen_reg_rtx (Pmode);
1604 temp = legitimize_pic_address (XEXP (XEXP (operands[1], 0), 0),
1605 mode, temp);
1606 operands[1] = expand_binop (mode, add_optab, temp,
1607 XEXP (XEXP (operands[1], 0), 1),
1608 (!can_create_pseudo_p ()
1609 ? temp
1610 : gen_reg_rtx (Pmode)),
1611 0, OPTAB_LIB_WIDEN);
1612 }
1613 }
1614
1615 if (! reload_in_progress && ! reload_completed)
1616 {
1617 /* Copy the source to a register if both operands aren't registers. */
1618 if (! register_operand (operands[0], mode)
1619 && ! register_operand (operands[1], mode))
1620 operands[1] = copy_to_mode_reg (mode, operands[1]);
1621
1622 if (MEM_P (operands[0]) && ! memory_operand (operands[0], mode))
1623 {
1624 /* This is like change_address_1 (operands[0], mode, 0, 1) ,
1625 except that we can't use that function because it is static. */
1626 rtx new_rtx = change_address (operands[0], mode, 0);
1627 MEM_COPY_ATTRIBUTES (new_rtx, operands[0]);
1628 operands[0] = new_rtx;
1629 }
1630
1631 /* This case can happen while generating code to move the result
1632 of a library call to the target. Reject `st r0,@(rX,rY)' because
1633 reload will fail to find a spill register for rX, since r0 is already
1634 being used for the source. */
1635 else if (refers_to_regno_p (R0_REG, operands[1])
1636 && MEM_P (operands[0])
1637 && GET_CODE (XEXP (operands[0], 0)) == PLUS
1638 && REG_P (XEXP (XEXP (operands[0], 0), 1)))
1639 operands[1] = copy_to_mode_reg (mode, operands[1]);
1640
1641 /* When the displacement addressing is used, RA will assign r0 to
1642 the pseudo register operand for the QI/HImode load/store.
1643 This tends to make a long live range for R0 and might cause
1644 anomalous register spills in some case with LRA. See PR
1645 target/55212.
1646 We split possible load/store to two move insns via r0 so as to
1647 shorten R0 live range. It will make some codes worse but will
1648 win on average for LRA.
1649 Also when base+index addressing is used and the index term is
1650 a subreg, LRA assumes that more hard registers can be available
1651 in some situation. It isn't the case for SH in the problematic
1652 case. We can pre-allocate R0 for that index term to avoid
1653 the issue. See PR target/66591. */
1654 else if (sh_lra_p ()
1655 && ! TARGET_SH2A
1656 && ((REG_P (operands[0]) && MEM_P (operands[1]))
1657 || (REG_P (operands[1]) && MEM_P (operands[0]))))
1658 {
1659 bool load_p = REG_P (operands[0]);
1660 rtx reg = operands[load_p ? 0 : 1];
1661 rtx adr = XEXP (operands[load_p ? 1 : 0], 0);
1662
1663 if ((mode == QImode || mode == HImode)
1664 && REGNO (reg) >= FIRST_PSEUDO_REGISTER
1665 && GET_CODE (adr) == PLUS
1666 && REG_P (XEXP (adr, 0))
1667 && (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER)
1668 && CONST_INT_P (XEXP (adr, 1))
1669 && INTVAL (XEXP (adr, 1)) != 0
1670 && sh_legitimate_index_p (mode, XEXP (adr, 1), false, true))
1671 {
1672 rtx r0_rtx = gen_rtx_REG (mode, R0_REG);
1673 emit_move_insn (r0_rtx, operands[1]);
1674 operands[1] = r0_rtx;
1675 }
1676 if (REGNO (reg) >= FIRST_PSEUDO_REGISTER
1677 && GET_CODE (adr) == PLUS
1678 && REG_P (XEXP (adr, 0))
1679 && (REGNO (XEXP (adr, 0)) >= FIRST_PSEUDO_REGISTER)
1680 && SUBREG_P (XEXP (adr, 1))
1681 && REG_P (SUBREG_REG (XEXP (adr, 1))))
1682 {
1683 rtx r0_rtx = gen_rtx_REG (GET_MODE (XEXP (adr, 1)), R0_REG);
1684 emit_move_insn (r0_rtx, XEXP (adr, 1));
1685 XEXP (adr, 1) = r0_rtx;
1686 }
1687 }
1688 }
1689
1690 if (mode == Pmode || mode == ptr_mode)
1691 {
1692 rtx op0 = operands[0];
1693 rtx op1 = operands[1];
1694 rtx opc;
1695 if (GET_CODE (op1) == CONST
1696 && GET_CODE (XEXP (op1, 0)) == PLUS
1697 && (tls_symbolic_operand (XEXP (XEXP (op1, 0), 0), Pmode)
1698 != TLS_MODEL_NONE))
1699 {
1700 opc = XEXP (XEXP (op1, 0), 1);
1701 op1 = XEXP (XEXP (op1, 0), 0);
1702 }
1703 else
1704 opc = NULL_RTX;
1705
1706 enum tls_model tls_kind;
1707
1708 if (! reload_in_progress && ! reload_completed
1709 && (tls_kind = tls_symbolic_operand (op1, Pmode)) != TLS_MODEL_NONE)
1710 {
1711 rtx tga_op1, tga_ret, tmp, tmp2;
1712
1713 if (! flag_pic
1714 && (tls_kind == TLS_MODEL_GLOBAL_DYNAMIC
1715 || tls_kind == TLS_MODEL_LOCAL_DYNAMIC
1716 || tls_kind == TLS_MODEL_INITIAL_EXEC))
1717 {
1718 static int got_labelno;
1719 /* Don't schedule insns for getting GOT address when
1720 the first scheduling is enabled, to avoid spill
1721 failures for R0. */
1722 if (flag_schedule_insns)
1723 emit_insn (gen_blockage ());
1724 emit_insn (gen_GOTaddr2picreg (GEN_INT (++got_labelno)));
1725 emit_use (gen_rtx_REG (SImode, PIC_REG));
1726 if (flag_schedule_insns)
1727 emit_insn (gen_blockage ());
1728 }
1729
1730 switch (tls_kind)
1731 {
1732 case TLS_MODEL_GLOBAL_DYNAMIC:
1733 tga_ret = gen_rtx_REG (Pmode, R0_REG);
1734 if (TARGET_FDPIC)
1735 emit_move_insn (gen_rtx_REG (Pmode, PIC_REG),
1736 sh_get_fdpic_reg_initial_val ());
1737 emit_call_insn (gen_tls_global_dynamic (tga_ret, op1));
1738 tmp = gen_reg_rtx (Pmode);
1739 emit_move_insn (tmp, tga_ret);
1740 op1 = tmp;
1741 break;
1742
1743 case TLS_MODEL_LOCAL_DYNAMIC:
1744 tga_ret = gen_rtx_REG (Pmode, R0_REG);
1745 if (TARGET_FDPIC)
1746 emit_move_insn (gen_rtx_REG (Pmode, PIC_REG),
1747 sh_get_fdpic_reg_initial_val ());
1748 emit_call_insn (gen_tls_local_dynamic (tga_ret, op1));
1749
1750 tmp = gen_reg_rtx (Pmode);
1751 emit_move_insn (tmp, tga_ret);
1752
1753 if (register_operand (op0, Pmode))
1754 tmp2 = op0;
1755 else
1756 tmp2 = gen_reg_rtx (Pmode);
1757
1758 emit_insn (gen_symDTPOFF2reg (tmp2, op1, tmp));
1759 op1 = tmp2;
1760 break;
1761
1762 case TLS_MODEL_INITIAL_EXEC:
1763 tga_op1 = !can_create_pseudo_p () ? op0 : gen_reg_rtx (Pmode);
1764 tmp = gen_sym2GOTTPOFF (op1);
1765 if (TARGET_FDPIC)
1766 emit_move_insn (gen_rtx_REG (Pmode, PIC_REG),
1767 sh_get_fdpic_reg_initial_val ());
1768 emit_insn (gen_tls_initial_exec (tga_op1, tmp));
1769 op1 = tga_op1;
1770 break;
1771
1772 case TLS_MODEL_LOCAL_EXEC:
1773 tmp2 = gen_reg_rtx (Pmode);
1774 emit_insn (gen_store_gbr (tmp2));
1775 tmp = gen_reg_rtx (Pmode);
1776 emit_insn (gen_symTPOFF2reg (tmp, op1));
1777
1778 if (register_operand (op0, Pmode))
1779 op1 = op0;
1780 else
1781 op1 = gen_reg_rtx (Pmode);
1782
1783 emit_insn (gen_addsi3 (op1, tmp, tmp2));
1784 break;
1785
1786 default:
1787 gcc_unreachable ();
1788 }
1789 if (opc)
1790 emit_insn (gen_addsi3 (op1, op1, force_reg (SImode, opc)));
1791 operands[1] = op1;
1792 }
1793 }
1794
1795 if (SH_OFFSETS_MUST_BE_WITHIN_SECTIONS_P)
1796 {
1797 rtx base, offset;
1798 split_const (operands[1], &base, &offset);
1799
1800 if (GET_CODE (base) == SYMBOL_REF
1801 && !offset_within_block_p (base, INTVAL (offset)))
1802 {
1803 rtx tmp = can_create_pseudo_p () ? gen_reg_rtx (mode) : operands[0];
1804 emit_move_insn (tmp, base);
1805 if (!arith_operand (offset, mode))
1806 offset = force_reg (mode, offset);
1807 emit_insn (gen_add3_insn (operands[0], tmp, offset));
1808 }
1809 }
1810 }
1811
1812 /* Implement the canonicalize_comparison target hook for the combine
1813 pass. For the target hook this function is invoked via
1814 sh_canonicalize_comparison. This function is also re-used to
1815 canonicalize comparisons in cbranch pattern expanders. */
1816 static void
1817 sh_canonicalize_comparison (enum rtx_code& cmp, rtx& op0, rtx& op1,
1818 machine_mode mode,
1819 bool op0_preserve_value)
1820 {
1821 /* When invoked from within the combine pass the mode is not specified,
1822 so try to get it from one of the operands. */
1823 if (mode == VOIDmode)
1824 mode = GET_MODE (op0);
1825 if (mode == VOIDmode)
1826 mode = GET_MODE (op1);
1827
1828 // We need to have a mode to do something useful here.
1829 if (mode == VOIDmode)
1830 return;
1831
1832 // Currently, we don't deal with floats here.
1833 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
1834 return;
1835
1836 // Make sure that the constant operand is the second operand.
1837 if (CONST_INT_P (op0) && !CONST_INT_P (op1))
1838 {
1839 if (op0_preserve_value)
1840 return;
1841
1842 std::swap (op0, op1);
1843 cmp = swap_condition (cmp);
1844 }
1845
1846 if (CONST_INT_P (op1))
1847 {
1848 /* Try to adjust the constant operand in such a way that available
1849 comparison insns can be utilized better and the constant can be
1850 loaded with a 'mov #imm,Rm' insn. This avoids a load from the
1851 constant pool. */
1852 const HOST_WIDE_INT val = INTVAL (op1);
1853
1854 /* x > -1 --> x >= 0
1855 x > 0xFFFFFF7F --> x >= 0xFFFFFF80
1856 x <= -1 --> x < 0
1857 x <= 0xFFFFFF7F --> x < 0xFFFFFF80 */
1858 if ((val == -1 || val == -0x81) && (cmp == GT || cmp == LE))
1859 {
1860 cmp = cmp == GT ? GE : LT;
1861 op1 = gen_int_mode (val + 1, mode);
1862 }
1863
1864 /* x >= 1 --> x > 0
1865 x >= 0x80 --> x > 0x7F
1866 x < 1 --> x <= 0
1867 x < 0x80 --> x <= 0x7F */
1868 else if ((val == 1 || val == 0x80) && (cmp == GE || cmp == LT))
1869 {
1870 cmp = cmp == GE ? GT : LE;
1871 op1 = gen_int_mode (val - 1, mode);
1872 }
1873
1874 /* unsigned x >= 1 --> x != 0
1875 unsigned x < 1 --> x == 0 */
1876 else if (val == 1 && (cmp == GEU || cmp == LTU))
1877 {
1878 cmp = cmp == GEU ? NE : EQ;
1879 op1 = CONST0_RTX (mode);
1880 }
1881
1882 /* unsigned x >= 0x80 --> unsigned x > 0x7F
1883 unsigned x < 0x80 --> unsigned x < 0x7F */
1884 else if (val == 0x80 && (cmp == GEU || cmp == LTU))
1885 {
1886 cmp = cmp == GEU ? GTU : LEU;
1887 op1 = gen_int_mode (val - 1, mode);
1888 }
1889
1890 /* unsigned x > 0 --> x != 0
1891 unsigned x <= 0 --> x == 0 */
1892 else if (val == 0 && (cmp == GTU || cmp == LEU))
1893 cmp = cmp == GTU ? NE : EQ;
1894
1895 /* unsigned x > 0x7FFFFFFF --> signed x < 0
1896 unsigned x <= 0x7FFFFFFF --> signed x >= 0 */
1897 else if (mode == SImode && (cmp == GTU || cmp == LEU)
1898 && val == 0x7FFFFFFF)
1899 {
1900 cmp = cmp == GTU ? LT : GE;
1901 op1 = const0_rtx;
1902 }
1903
1904 /* unsigned x >= 0x80000000 --> signed x < 0
1905 unsigned x < 0x80000000 --> signed x >= 0 */
1906 else if (mode == SImode && (cmp == GEU || cmp == LTU)
1907 && (unsigned HOST_WIDE_INT)val
1908 == ((unsigned HOST_WIDE_INT)0x7FFFFFFF + 1))
1909 {
1910 cmp = cmp == GEU ? LT : GE;
1911 op1 = const0_rtx;
1912 }
1913 }
1914 }
1915
1916 /* This function implements the canonicalize_comparison target hook.
1917 This wrapper around the internally used sh_canonicalize_comparison
1918 function is needed to do the enum rtx_code <-> int conversion.
1919 Target hooks cannot use enum rtx_code in its definition. */
1920 static void
1921 sh_canonicalize_comparison (int *code, rtx *op0, rtx *op1,
1922 bool op0_preserve_value)
1923 {
1924 enum rtx_code tmp_code = (enum rtx_code)*code;
1925 sh_canonicalize_comparison (tmp_code, *op0, *op1,
1926 VOIDmode, op0_preserve_value);
1927 *code = (int)tmp_code;
1928 }
1929
1930 /* This function implements the legitimate_combined_insn target hook,
1931 which the combine pass uses to early reject combined insns, before
1932 it tries to recog the insn and determine its cost. */
1933 static bool
1934 sh_legitimate_combined_insn (rtx_insn* insn)
1935 {
1936 /* Reject combinations of memory loads and zero extensions, as these
1937 interfere with other combine patterns such as zero extracts and bit
1938 tests. The SH2A movu.{b|w} insns are formed later in the
1939 'sh_optimize_extu_exts' pass after combine/split1. */
1940 rtx p = PATTERN (insn);
1941 if (GET_CODE (p) == SET
1942 && REG_P (XEXP (p, 0)) && GET_MODE (XEXP (p, 0)) == SImode
1943 && GET_CODE (XEXP (p, 1)) == ZERO_EXTEND
1944 && MEM_P (XEXP (XEXP (p, 1), 0)))
1945 return false;
1946
1947 return true;
1948 }
1949
1950 bool
1951 sh_fixed_condition_code_regs (unsigned int* p1, unsigned int* p2)
1952 {
1953 *p1 = T_REG;
1954 *p2 = INVALID_REGNUM;
1955 return true;
1956 }
1957
1958 /* Try to calculate the branch distance of a conditional branch in bytes.
1959
1960 FIXME: Because of PR 59189 we can't use the CFG here. Instead just
1961 walk from this insn into the next (fall-through) basic block and see if
1962 we hit the label. */
1963 unsigned int
1964 sh_cbranch_distance (rtx_insn* _cbranch_insn, unsigned int max_dist)
1965 {
1966 rtx_jump_insn* cbranch_insn = safe_as_a<rtx_jump_insn*> (_cbranch_insn);
1967
1968 if (dump_file)
1969 {
1970 fprintf (dump_file, "sh_cbranch_distance insn = \n");
1971 print_rtl_single (dump_file, cbranch_insn);
1972 }
1973
1974 unsigned int dist = 0;
1975
1976 for (rtx_insn* i = next_nonnote_insn (cbranch_insn);
1977 i != NULL && dist < max_dist; i = next_nonnote_insn (i))
1978 {
1979 const unsigned int i_len = get_attr_length (i);
1980 dist += i_len;
1981
1982 if (dump_file)
1983 fprintf (dump_file, " insn %d length = %u dist = %u\n",
1984 INSN_UID (i), i_len, dist);
1985
1986 if (rtx_code_label* l = dyn_cast<rtx_code_label*> (i))
1987 {
1988 if (l == cbranch_insn->jump_target ())
1989 {
1990 if (dump_file)
1991 fprintf (dump_file, " cbranch dist = %u\n", dist);
1992 return dist;
1993 }
1994 break;
1995 }
1996 }
1997
1998 if (dump_file)
1999 fprintf (dump_file, " cbranch dist = unknown\n");
2000
2001 return unknown_cbranch_distance;
2002 }
2003
2004 enum rtx_code
2005 prepare_cbranch_operands (rtx *operands, machine_mode mode,
2006 enum rtx_code comparison)
2007 {
2008 gcc_assert (can_create_pseudo_p ());
2009
2010 if (comparison == LAST_AND_UNUSED_RTX_CODE)
2011 comparison = GET_CODE (operands[0]);
2012
2013 sh_canonicalize_comparison (comparison, operands[1], operands[2],
2014 mode, false);
2015
2016 rtx op1 = operands[1];
2017 operands[1] = force_reg (mode, op1);
2018
2019 /* When we are handling DImode comparisons, we want to keep constants so
2020 that we can optimize the component comparisons; however, memory loads
2021 are better issued as a whole so that they can be scheduled well.
2022 SImode equality comparisons allow I08 constants, but only when they
2023 compare r0. Hence, if operands[1] has to be loaded from somewhere else
2024 into a register, that register might as well be r0, and we allow the
2025 constant. If it is already in a register, this is likely to be
2026 allocated to a different hard register, thus we load the constant into
2027 a register unless it is zero. */
2028 if (!REG_P (operands[2])
2029 && (!CONST_INT_P (operands[2])
2030 || (mode == SImode && operands[2] != CONST0_RTX (SImode)
2031 && ((comparison != EQ && comparison != NE)
2032 || (REG_P (op1) && REGNO (op1) != R0_REG)
2033 || !satisfies_constraint_I08 (operands[2])))))
2034 operands[2] = force_reg (mode, operands[2]);
2035
2036 return comparison;
2037 }
2038
2039 static void
2040 expand_cbranchsi4 (rtx *operands, enum rtx_code comparison,
2041 profile_probability probability)
2042 {
2043 rtx (*branch_expander) (rtx) = gen_branch_true;
2044 comparison = prepare_cbranch_operands (operands, SImode, comparison);
2045 switch (comparison)
2046 {
2047 case NE: case LT: case LE: case LTU: case LEU:
2048 comparison = reverse_condition (comparison);
2049 branch_expander = gen_branch_false;
2050 default: ;
2051 }
2052 emit_insn (gen_rtx_SET (get_t_reg_rtx (),
2053 gen_rtx_fmt_ee (comparison, SImode,
2054 operands[1], operands[2])));
2055 rtx_insn *jump = emit_jump_insn (branch_expander (operands[3]));
2056 if (probability.initialized_p ())
2057 add_reg_br_prob_note (jump, probability);
2058 }
2059
2060 void
2061 expand_cbranchsi4 (rtx *operands, enum rtx_code comparison)
2062 {
2063 expand_cbranchsi4 (operands, comparison,
2064 profile_probability::uninitialized ());
2065 }
2066
2067 /* ??? How should we distribute probabilities when more than one branch
2068 is generated. So far we only have some ad-hoc observations:
2069 - If the operands are random, they are likely to differ in both parts.
2070 - If comparing items in a hash chain, the operands are random or equal;
2071 operation should be EQ or NE.
2072 - If items are searched in an ordered tree from the root, we can expect
2073 the highpart to be unequal about half of the time; operation should be
2074 an inequality comparison, operands non-constant, and overall probability
2075 about 50%. Likewise for quicksort.
2076 - Range checks will be often made against constants. Even if we assume for
2077 simplicity an even distribution of the non-constant operand over a
2078 sub-range here, the same probability could be generated with differently
2079 wide sub-ranges - as long as the ratio of the part of the subrange that
2080 is before the threshold to the part that comes after the threshold stays
2081 the same. Thus, we can't really tell anything here;
2082 assuming random distribution is at least simple.
2083 */
2084 bool
2085 expand_cbranchdi4 (rtx *operands, enum rtx_code comparison)
2086 {
2087 enum rtx_code msw_taken, msw_skip, lsw_taken;
2088 rtx_code_label *skip_label = NULL;
2089 rtx op1h, op1l, op2h, op2l;
2090 int num_branches;
2091 profile_probability prob, rev_prob;
2092 profile_probability msw_taken_prob = profile_probability::uninitialized (),
2093 msw_skip_prob = profile_probability::uninitialized (),
2094 lsw_taken_prob = profile_probability::uninitialized ();
2095
2096 comparison = prepare_cbranch_operands (operands, DImode, comparison);
2097 op1h = gen_highpart_mode (SImode, DImode, operands[1]);
2098 op2h = gen_highpart_mode (SImode, DImode, operands[2]);
2099 op1l = gen_lowpart (SImode, operands[1]);
2100 op2l = gen_lowpart (SImode, operands[2]);
2101 msw_taken = msw_skip = lsw_taken = LAST_AND_UNUSED_RTX_CODE;
2102 prob = split_branch_probability;
2103 rev_prob = prob.invert ();
2104 switch (comparison)
2105 {
2106 case EQ:
2107 msw_skip = NE;
2108 lsw_taken = EQ;
2109 if (prob.initialized_p ())
2110 {
2111 /* FIXME: This is not optimal. We do not really know the probablity
2112 that values differ by MCW only, but we should probably distribute
2113 probabilities more evenly. */
2114 msw_skip_prob = rev_prob;
2115 lsw_taken_prob = prob > profile_probability::never ()
2116 ? profile_probability::guessed_always ()
2117 : profile_probability::guessed_never ();
2118 }
2119 break;
2120 case NE:
2121 msw_taken = NE;
2122 msw_taken_prob = prob;
2123 lsw_taken = NE;
2124 lsw_taken_prob = profile_probability::guessed_never ();
2125 break;
2126 case GTU: case GT:
2127 msw_taken = comparison;
2128 if (CONST_INT_P (op2l) && INTVAL (op2l) == -1)
2129 break;
2130 if (comparison != GTU || op2h != CONST0_RTX (SImode))
2131 msw_skip = swap_condition (msw_taken);
2132 lsw_taken = GTU;
2133 break;
2134 case GEU: case GE:
2135 if (op2l == CONST0_RTX (SImode))
2136 msw_taken = comparison;
2137 else
2138 {
2139 msw_taken = comparison == GE ? GT : GTU;
2140 msw_skip = swap_condition (msw_taken);
2141 lsw_taken = GEU;
2142 }
2143 break;
2144 case LTU: case LT:
2145 msw_taken = comparison;
2146 if (op2l == CONST0_RTX (SImode))
2147 break;
2148 msw_skip = swap_condition (msw_taken);
2149 lsw_taken = LTU;
2150 break;
2151 case LEU: case LE:
2152 if (CONST_INT_P (op2l) && INTVAL (op2l) == -1)
2153 msw_taken = comparison;
2154 else
2155 {
2156 lsw_taken = LEU;
2157 if (comparison == LE)
2158 msw_taken = LT;
2159 else if (op2h != CONST0_RTX (SImode))
2160 msw_taken = LTU;
2161 else
2162 {
2163 msw_skip = swap_condition (LTU);
2164 break;
2165 }
2166 msw_skip = swap_condition (msw_taken);
2167 }
2168 break;
2169 default: return false;
2170 }
2171 num_branches = ((msw_taken != LAST_AND_UNUSED_RTX_CODE)
2172 + (msw_skip != LAST_AND_UNUSED_RTX_CODE)
2173 + (lsw_taken != LAST_AND_UNUSED_RTX_CODE));
2174 if (comparison != EQ && comparison != NE && num_branches > 1)
2175 {
2176 if (!CONSTANT_P (operands[2])
2177 && prob.initialized_p ()
2178 && prob.to_reg_br_prob_base () >= (int) (REG_BR_PROB_BASE * 3 / 8U)
2179 && prob.to_reg_br_prob_base () <= (int) (REG_BR_PROB_BASE * 5 / 8U))
2180 {
2181 msw_taken_prob = prob.apply_scale (1, 2);
2182 msw_skip_prob = rev_prob.apply_scale (REG_BR_PROB_BASE,
2183 rev_prob.to_reg_br_prob_base ()
2184 + REG_BR_PROB_BASE);
2185 lsw_taken_prob = prob;
2186 }
2187 else
2188 {
2189 msw_taken_prob = prob;
2190 msw_skip_prob = profile_probability::guessed_always ();
2191 /* ??? If we have a constant op2h, should we use that when
2192 calculating lsw_taken_prob? */
2193 lsw_taken_prob = prob;
2194 }
2195 }
2196 operands[1] = op1h;
2197 operands[2] = op2h;
2198
2199 if (msw_taken != LAST_AND_UNUSED_RTX_CODE)
2200 expand_cbranchsi4 (operands, msw_taken, msw_taken_prob);
2201 if (msw_skip != LAST_AND_UNUSED_RTX_CODE)
2202 {
2203 rtx taken_label = operands[3];
2204
2205 /* Operands were possibly modified, but msw_skip doesn't expect this.
2206 Always use the original ones. */
2207 if (msw_taken != LAST_AND_UNUSED_RTX_CODE)
2208 {
2209 operands[1] = op1h;
2210 operands[2] = op2h;
2211 }
2212
2213 operands[3] = skip_label = gen_label_rtx ();
2214 expand_cbranchsi4 (operands, msw_skip, msw_skip_prob);
2215 operands[3] = taken_label;
2216 }
2217 operands[1] = op1l;
2218 operands[2] = op2l;
2219 if (lsw_taken != LAST_AND_UNUSED_RTX_CODE)
2220 expand_cbranchsi4 (operands, lsw_taken, lsw_taken_prob);
2221 if (msw_skip != LAST_AND_UNUSED_RTX_CODE)
2222 emit_label (skip_label);
2223 return true;
2224 }
2225
2226 /* Given an operand, return 1 if the evaluated operand plugged into an
2227 if_then_else will result in a branch_true, 0 if branch_false, or
2228 -1 if neither nor applies. The truth table goes like this:
2229
2230 op | cmpval | code | result
2231 ---------+--------+---------+--------------------
2232 T (0) | 0 | EQ (1) | 0 = 0 ^ (0 == 1)
2233 T (0) | 1 | EQ (1) | 1 = 0 ^ (1 == 1)
2234 T (0) | 0 | NE (0) | 1 = 0 ^ (0 == 0)
2235 T (0) | 1 | NE (0) | 0 = 0 ^ (1 == 0)
2236 !T (1) | 0 | EQ (1) | 1 = 1 ^ (0 == 1)
2237 !T (1) | 1 | EQ (1) | 0 = 1 ^ (1 == 1)
2238 !T (1) | 0 | NE (0) | 0 = 1 ^ (0 == 0)
2239 !T (1) | 1 | NE (0) | 1 = 1 ^ (1 == 0) */
2240 int
2241 sh_eval_treg_value (rtx op)
2242 {
2243 if (t_reg_operand (op, GET_MODE (op)))
2244 return 1;
2245 if (negt_reg_operand (op, GET_MODE (op)))
2246 return 0;
2247
2248 rtx_code code = GET_CODE (op);
2249 if ((code != EQ && code != NE) || !CONST_INT_P (XEXP (op, 1)))
2250 return -1;
2251
2252 int cmpop = code == EQ ? 1 : 0;
2253 int cmpval = INTVAL (XEXP (op, 1));
2254 if (cmpval != 0 && cmpval != 1)
2255 return -1;
2256
2257 int t;
2258 if (t_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))))
2259 t = 0;
2260 else if (negt_reg_operand (XEXP (op, 0), GET_MODE (XEXP (op, 0))))
2261 t = 1;
2262 else
2263 return -1;
2264
2265 return t ^ (cmpval == cmpop);
2266 }
2267
2268 /* Emit INSN, possibly in a PARALLEL with an USE/CLOBBER of FPSCR bits in case
2269 of floating-point comparisons. */
2270 static void
2271 sh_emit_set_t_insn (rtx insn, machine_mode mode)
2272 {
2273 if (TARGET_FPU_ANY && GET_MODE_CLASS (mode) == MODE_FLOAT
2274 && GET_CODE (insn) != PARALLEL)
2275 {
2276 insn = gen_rtx_PARALLEL (VOIDmode,
2277 gen_rtvec (3, insn,
2278 gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, FPSCR_STAT_REG)),
2279 gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, FPSCR_MODES_REG))));
2280 }
2281 emit_insn (insn);
2282 }
2283
2284 /* Prepare the operands for an scc instruction; make sure that the
2285 compare has been done and the result is in T_REG. */
2286 void
2287 sh_emit_scc_to_t (enum rtx_code code, rtx op0, rtx op1)
2288 {
2289 rtx t_reg = get_t_reg_rtx ();
2290 enum rtx_code oldcode = code;
2291
2292 /* First need a compare insn. */
2293 switch (code)
2294 {
2295 case NE:
2296 /* It isn't possible to handle this case. */
2297 gcc_unreachable ();
2298 case LT:
2299 code = GT;
2300 break;
2301 case LE:
2302 code = GE;
2303 break;
2304 case LTU:
2305 code = GTU;
2306 break;
2307 case LEU:
2308 code = GEU;
2309 break;
2310 default:
2311 break;
2312 }
2313 if (code != oldcode)
2314 std::swap (op0, op1);
2315
2316 machine_mode mode = GET_MODE (op0);
2317 if (mode == VOIDmode)
2318 mode = GET_MODE (op1);
2319
2320 op0 = force_reg (mode, op0);
2321 if ((code != EQ && code != NE
2322 && (op1 != const0_rtx
2323 || code == GTU || code == GEU || code == LTU || code == LEU))
2324 || (mode == DImode && op1 != const0_rtx)
2325 || (TARGET_SH2E && GET_MODE_CLASS (mode) == MODE_FLOAT))
2326 op1 = force_reg (mode, op1);
2327
2328 sh_emit_set_t_insn (gen_rtx_SET (t_reg,
2329 gen_rtx_fmt_ee (code, SImode, op0, op1)),
2330 mode);
2331 }
2332
2333 /* Called from the md file, set up the operands of a compare instruction. */
2334 void
2335 sh_emit_compare_and_branch (rtx *operands, machine_mode mode)
2336 {
2337 enum rtx_code code = GET_CODE (operands[0]);
2338 enum rtx_code branch_code;
2339 rtx op0 = operands[1];
2340 rtx op1 = operands[2];
2341 rtx insn;
2342 bool need_ccmpeq = false;
2343
2344 if (TARGET_SH2E && GET_MODE_CLASS (mode) == MODE_FLOAT)
2345 {
2346 op0 = force_reg (mode, op0);
2347 op1 = force_reg (mode, op1);
2348 }
2349 else
2350 {
2351 if (code != EQ || mode == DImode)
2352 {
2353 /* Force args into regs, since we can't use constants here. */
2354 op0 = force_reg (mode, op0);
2355 if (op1 != const0_rtx || code == GTU || code == GEU)
2356 op1 = force_reg (mode, op1);
2357 }
2358 }
2359
2360 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
2361 {
2362 if (code == LT
2363 || (code == LE && TARGET_IEEE && TARGET_SH2E)
2364 || (code == GE && !(TARGET_IEEE && TARGET_SH2E)))
2365 {
2366 std::swap (op0, op1);
2367 code = swap_condition (code);
2368 }
2369
2370 /* GE becomes fcmp/gt+fcmp/eq, for SH2E and TARGET_IEEE only. */
2371 if (code == GE)
2372 {
2373 gcc_assert (TARGET_IEEE && TARGET_SH2E);
2374 need_ccmpeq = true;
2375 code = GT;
2376 }
2377
2378 /* Now we can have EQ, NE, GT, LE. NE and LE are then transformed
2379 to EQ/GT respectively. */
2380 gcc_assert (code == EQ || code == GT || code == NE || code == LE);
2381 }
2382
2383 switch (code)
2384 {
2385 case EQ:
2386 case GT:
2387 case GE:
2388 case GTU:
2389 case GEU:
2390 branch_code = code;
2391 break;
2392 case NE:
2393 case LT:
2394 case LE:
2395 case LTU:
2396 case LEU:
2397 branch_code = reverse_condition (code);
2398 break;
2399 default:
2400 gcc_unreachable ();
2401 }
2402
2403 insn = gen_rtx_SET (get_t_reg_rtx (),
2404 gen_rtx_fmt_ee (branch_code, SImode, op0, op1));
2405
2406 sh_emit_set_t_insn (insn, mode);
2407 if (need_ccmpeq)
2408 sh_emit_set_t_insn (gen_ieee_ccmpeqsf_t (op0, op1), mode);
2409
2410 if (branch_code == code)
2411 emit_jump_insn (gen_branch_true (operands[3]));
2412 else
2413 emit_jump_insn (gen_branch_false (operands[3]));
2414 }
2415
2416 void
2417 sh_emit_compare_and_set (rtx *operands, machine_mode mode)
2418 {
2419 enum rtx_code code = GET_CODE (operands[1]);
2420 rtx op0 = operands[2];
2421 rtx op1 = operands[3];
2422 rtx_code_label *lab = NULL;
2423 bool invert = false;
2424
2425 op0 = force_reg (mode, op0);
2426 if ((code != EQ && code != NE
2427 && (op1 != const0_rtx
2428 || code == GTU || code == GEU || code == LTU || code == LEU))
2429 || (mode == DImode && op1 != const0_rtx)
2430 || (TARGET_SH2E && GET_MODE_CLASS (mode) == MODE_FLOAT))
2431 op1 = force_reg (mode, op1);
2432
2433 if (GET_MODE_CLASS (mode) == MODE_FLOAT)
2434 {
2435 if (code == LT || code == LE)
2436 {
2437 std::swap (op0, op1);
2438 code = swap_condition (code);
2439 }
2440 if (code == GE)
2441 {
2442 if (TARGET_IEEE)
2443 {
2444 lab = gen_label_rtx ();
2445 sh_emit_scc_to_t (EQ, op0, op1);
2446 emit_jump_insn (gen_branch_true (lab));
2447 code = GT;
2448 }
2449 else
2450 {
2451 code = LT;
2452 invert = true;
2453 }
2454 }
2455 }
2456
2457 if (code == NE)
2458 {
2459 code = EQ;
2460 invert = true;
2461 }
2462
2463 sh_emit_scc_to_t (code, op0, op1);
2464 if (lab)
2465 emit_label (lab);
2466 if (invert)
2467 emit_insn (gen_movnegt (operands[0], get_t_reg_rtx ()));
2468 else
2469 emit_move_insn (operands[0], get_t_reg_rtx ());
2470 }
2471 \f
2472 /* Functions to output assembly code. */
2473
2474 /* Return a sequence of instructions to perform DI or DF move.
2475
2476 Since the SH cannot move a DI or DF in one instruction, we have
2477 to take care when we see overlapping source and dest registers. */
2478 const char *
2479 output_movedouble (rtx insn ATTRIBUTE_UNUSED, rtx operands[],
2480 machine_mode mode)
2481 {
2482 rtx dst = operands[0];
2483 rtx src = operands[1];
2484
2485 if (MEM_P (dst)
2486 && GET_CODE (XEXP (dst, 0)) == PRE_DEC)
2487 return "mov.l %T1,%0" "\n"
2488 " mov.l %1,%0";
2489
2490 if (register_operand (dst, mode)
2491 && register_operand (src, mode))
2492 {
2493 if (REGNO (src) == MACH_REG)
2494 return "sts mach,%S0" "\n"
2495 " sts macl,%R0";
2496
2497 /* When mov.d r1,r2 do r2->r3 then r1->r2;
2498 when mov.d r1,r0 do r1->r0 then r2->r1. */
2499 if (REGNO (src) + 1 == REGNO (dst))
2500 return "mov %T1,%T0" "\n"
2501 " mov %1,%0";
2502 else
2503 return "mov %1,%0" "\n"
2504 " mov %T1,%T0";
2505 }
2506 else if (CONST_INT_P (src))
2507 {
2508 if (INTVAL (src) < 0)
2509 output_asm_insn ("mov #-1,%S0", operands);
2510 else
2511 output_asm_insn ("mov #0,%S0", operands);
2512
2513 return "mov %1,%R0";
2514 }
2515 else if (MEM_P (src))
2516 {
2517 int ptrreg = -1;
2518 int dreg = REGNO (dst);
2519 rtx inside = XEXP (src, 0);
2520
2521 switch (GET_CODE (inside))
2522 {
2523 case REG:
2524 ptrreg = REGNO (inside);
2525 break;
2526
2527 case SUBREG:
2528 ptrreg = subreg_regno (inside);
2529 break;
2530
2531 case PLUS:
2532 ptrreg = REGNO (XEXP (inside, 0));
2533 /* ??? A r0+REG address shouldn't be possible here, because it isn't
2534 an offsettable address. Unfortunately, offsettable addresses use
2535 QImode to check the offset, and a QImode offsettable address
2536 requires r0 for the other operand, which is not currently
2537 supported, so we can't use the 'o' constraint.
2538 Thus we must check for and handle r0+REG addresses here.
2539 We punt for now, since this is likely very rare. */
2540 gcc_assert (!REG_P (XEXP (inside, 1)));
2541 break;
2542
2543 case LABEL_REF:
2544 return "mov.l %1,%0" "\n"
2545 " mov.l %1+4,%T0";
2546 case POST_INC:
2547 return "mov.l %1,%0" "\n"
2548 " mov.l %1,%T0";
2549 default:
2550 gcc_unreachable ();
2551 }
2552
2553 /* Work out the safe way to copy. Copy into the second half first. */
2554 if (dreg == ptrreg)
2555 return "mov.l %T1,%T0" "\n"
2556 " mov.l %1,%0";
2557 }
2558
2559 return "mov.l %1,%0" "\n"
2560 " mov.l %T1,%T0";
2561 }
2562
2563 /* Print an instruction which would have gone into a delay slot after
2564 another instruction, but couldn't because the other instruction expanded
2565 into a sequence where putting the slot insn at the end wouldn't work. */
2566 static void
2567 print_slot (rtx_sequence *seq)
2568 {
2569 final_scan_insn (seq->insn (1), asm_out_file, optimize, 1, NULL);
2570
2571 seq->insn (1)->set_deleted ();
2572 }
2573
2574 const char *
2575 output_far_jump (rtx_insn *insn, rtx op)
2576 {
2577 struct { rtx lab, reg, op; } this_jmp;
2578 rtx_code_label *braf_base_lab = NULL;
2579 const char *jump;
2580 int far;
2581 int offset = branch_dest (insn) - INSN_ADDRESSES (INSN_UID (insn));
2582 rtx_insn *prev;
2583
2584 this_jmp.lab = gen_label_rtx ();
2585
2586 if (TARGET_SH2
2587 && offset >= -32764
2588 && offset - get_attr_length (insn) <= 32766
2589 && ! CROSSING_JUMP_P (insn))
2590 {
2591 far = 0;
2592 jump = "mov.w %O0,%1" "\n"
2593 " braf %1";
2594 }
2595 else
2596 {
2597 far = 1;
2598 if (flag_pic)
2599 {
2600 if (TARGET_SH2)
2601 jump = "mov.l %O0,%1" "\n"
2602 " braf %1";
2603 else
2604 jump = "mov.l r0,@-r15" "\n"
2605 " mova %O0,r0" "\n"
2606 " mov.l @r0,%1" "\n"
2607 " add r0,%1" "\n"
2608 " mov.l @r15+,r0" "\n"
2609 " jmp @%1";
2610 }
2611 else
2612 jump = "mov.l %O0,%1" "\n"
2613 " jmp @%1";
2614 }
2615 /* If we have a scratch register available, use it. */
2616 if (NONJUMP_INSN_P ((prev = prev_nonnote_insn (insn)))
2617 && INSN_CODE (prev) == CODE_FOR_indirect_jump_scratch)
2618 {
2619 this_jmp.reg = SET_DEST (XVECEXP (PATTERN (prev), 0, 0));
2620 if (REGNO (this_jmp.reg) == R0_REG && flag_pic && ! TARGET_SH2)
2621 jump = "mov.l r1,@-r15" "\n"
2622 " mova %O0,r0" "\n"
2623 " mov.l @r0,r1" "\n"
2624 " add r1,r0" "\n"
2625 " mov.l @r15+,r1" "\n"
2626 " jmp @%1";
2627 output_asm_insn (jump, &this_jmp.lab);
2628 if (dbr_sequence_length ())
2629 print_slot (final_sequence);
2630 else
2631 output_asm_insn ("nop", 0);
2632 }
2633 else
2634 {
2635 /* Output the delay slot insn first if any. */
2636 if (dbr_sequence_length ())
2637 print_slot (final_sequence);
2638
2639 this_jmp.reg = gen_rtx_REG (SImode, 13);
2640 output_asm_insn ("mov.l r13,@-r15", 0);
2641 output_asm_insn (jump, &this_jmp.lab);
2642 output_asm_insn ("mov.l @r15+,r13", 0);
2643 }
2644 if (far && flag_pic && TARGET_SH2)
2645 {
2646 braf_base_lab = gen_label_rtx ();
2647 (*targetm.asm_out.internal_label) (asm_out_file, "L",
2648 CODE_LABEL_NUMBER (braf_base_lab));
2649 }
2650 if (far)
2651 output_asm_insn (".align 2", 0);
2652 (*targetm.asm_out.internal_label) (asm_out_file, "L", CODE_LABEL_NUMBER (this_jmp.lab));
2653 this_jmp.op = op;
2654 if (far && flag_pic)
2655 {
2656 if (TARGET_SH2)
2657 this_jmp.lab = braf_base_lab;
2658 output_asm_insn (".long %O2-%O0", &this_jmp.lab);
2659 }
2660 else
2661 output_asm_insn (far ? ".long %O2" : ".word %O2-%O0", &this_jmp.lab);
2662 return "";
2663 }
2664
2665 /* Local label counter, used for constants in the pool and inside
2666 pattern branches. */
2667 static int lf = 100;
2668
2669 /* Output code for ordinary branches. */
2670 const char *
2671 output_branch (int logic, rtx_insn *insn, rtx *operands)
2672 {
2673 switch (get_attr_length (insn))
2674 {
2675 case 6:
2676 /* This can happen if filling the delay slot has caused a forward
2677 branch to exceed its range (we could reverse it, but only
2678 when we know we won't overextend other branches; this should
2679 best be handled by relaxation).
2680 It can also happen when other condbranches hoist delay slot insn
2681 from their destination, thus leading to code size increase.
2682 But the branch will still be in the range -4092..+4098 bytes. */
2683 if (! TARGET_RELAX)
2684 {
2685 int label = lf++;
2686 /* The call to print_slot will clobber the operands. */
2687 rtx op0 = operands[0];
2688
2689 /* If the instruction in the delay slot is annulled (true), then
2690 there is no delay slot where we can put it now. The only safe
2691 place for it is after the label. final will do that by default. */
2692
2693 if (final_sequence
2694 && ! INSN_ANNULLED_BRANCH_P (final_sequence->insn (0))
2695 && get_attr_length (final_sequence->insn (1)))
2696 {
2697 asm_fprintf (asm_out_file, "\tb%s%ss\t%LLF%d\n", logic ? "f" : "t",
2698 ASSEMBLER_DIALECT ? "/" : ".", label);
2699 print_slot (final_sequence);
2700 }
2701 else
2702 asm_fprintf (asm_out_file, "\tb%s\t%LLF%d\n", logic ? "f" : "t", label);
2703
2704 output_asm_insn ("bra\t%l0", &op0);
2705 fprintf (asm_out_file, "\tnop\n");
2706 (*targetm.asm_out.internal_label) (asm_out_file, "LF", label);
2707
2708 return "";
2709 }
2710 /* FALLTHRU */
2711 /* When relaxing, handle this like a short branch. The linker
2712 will fix it up if it still doesn't fit after relaxation. */
2713 case 2:
2714 return logic ? "bt%.\t%l0" : "bf%.\t%l0";
2715
2716 /* These are for SH2e, in which we have to account for the
2717 extra nop because of the hardware bug in annulled branches. */
2718 case 8:
2719 if (! TARGET_RELAX)
2720 {
2721 int label = lf++;
2722
2723 gcc_assert (!final_sequence
2724 || !(INSN_ANNULLED_BRANCH_P
2725 (XVECEXP (final_sequence, 0, 0))));
2726 asm_fprintf (asm_out_file, "b%s%ss\t%LLF%d\n",
2727 logic ? "f" : "t",
2728 ASSEMBLER_DIALECT ? "/" : ".", label);
2729 fprintf (asm_out_file, "\tnop\n");
2730 output_asm_insn ("bra\t%l0", operands);
2731 fprintf (asm_out_file, "\tnop\n");
2732 (*targetm.asm_out.internal_label) (asm_out_file, "LF", label);
2733
2734 return "";
2735 }
2736 /* FALLTHRU */
2737 case 4:
2738 {
2739 char buffer[10];
2740
2741 sprintf (buffer, "b%s%ss\t%%l0",
2742 logic ? "t" : "f",
2743 ASSEMBLER_DIALECT ? "/" : ".");
2744 output_asm_insn (buffer, &operands[0]);
2745 return "nop";
2746 }
2747
2748 default:
2749 /* There should be no longer branches now - that would
2750 indicate that something has destroyed the branches set
2751 up in machine_dependent_reorg. */
2752 gcc_unreachable ();
2753 }
2754 }
2755
2756 /* Output a code sequence for INSN using TEMPL with OPERANDS; but before,
2757 fill in operands 9 as a label to the successor insn.
2758 We try to use jump threading where possible.
2759 IF CODE matches the comparison in the IF_THEN_ELSE of a following jump,
2760 we assume the jump is taken. I.e. EQ means follow jmp and bf, NE means
2761 follow jmp and bt, if the address is in range. */
2762 const char *
2763 output_branchy_insn (enum rtx_code code, const char *templ,
2764 rtx_insn *insn, rtx *operands)
2765 {
2766 rtx_insn *next_insn = NEXT_INSN (insn);
2767
2768 if (next_insn && JUMP_P (next_insn) && condjump_p (next_insn))
2769 {
2770 rtx src = SET_SRC (PATTERN (next_insn));
2771 if (GET_CODE (src) == IF_THEN_ELSE && GET_CODE (XEXP (src, 0)) != code)
2772 {
2773 /* Following branch not taken */
2774 rtx_code_label *lab = gen_label_rtx ();
2775 emit_label_after (lab, next_insn);
2776 INSN_ADDRESSES_NEW (lab,
2777 INSN_ADDRESSES (INSN_UID (next_insn))
2778 + get_attr_length (next_insn));
2779 operands[9] = lab;
2780 return templ;
2781 }
2782 else
2783 {
2784 int offset = (branch_dest (next_insn)
2785 - INSN_ADDRESSES (INSN_UID (next_insn)) + 4);
2786 if (offset >= -252 && offset <= 258)
2787 {
2788 if (GET_CODE (src) == IF_THEN_ELSE)
2789 /* branch_true */
2790 src = XEXP (src, 1);
2791 operands[9] = src;
2792 return templ;
2793 }
2794 }
2795 }
2796 rtx_code_label *lab = gen_label_rtx ();
2797 emit_label_after (lab, insn);
2798 INSN_ADDRESSES_NEW (lab,
2799 INSN_ADDRESSES (INSN_UID (insn))
2800 + get_attr_length (insn));
2801 operands[9] = lab;
2802 return templ;
2803 }
2804
2805 const char *
2806 output_ieee_ccmpeq (rtx_insn *insn, rtx *operands)
2807 {
2808 return output_branchy_insn (NE, "bt %l9" "\n"
2809 " fcmp/eq %1,%0",
2810 insn, operands);
2811 }
2812 \f
2813 /* Output the start of the assembler file. */
2814 static void
2815 sh_file_start (void)
2816 {
2817 default_file_start ();
2818
2819 if (TARGET_ELF)
2820 /* We need to show the text section with the proper
2821 attributes as in TEXT_SECTION_ASM_OP, before dwarf2out
2822 emits it without attributes in TEXT_SECTION_ASM_OP, else GAS
2823 will complain. We can teach GAS specifically about the
2824 default attributes for our choice of text section, but
2825 then we would have to change GAS again if/when we change
2826 the text section name. */
2827 fprintf (asm_out_file, "%s\n", TEXT_SECTION_ASM_OP);
2828 else
2829 /* Switch to the data section so that the coffsem symbol
2830 isn't in the text section. */
2831 switch_to_section (data_section);
2832
2833 if (TARGET_LITTLE_ENDIAN)
2834 fputs ("\t.little\n", asm_out_file);
2835 }
2836 \f
2837 /* Implementation of TARGET_ASM_INTEGER for SH. Pointers to functions
2838 need to be output as pointers to function descriptors for
2839 FDPIC. */
2840
2841 static bool
2842 sh_assemble_integer (rtx value, unsigned int size, int aligned_p)
2843 {
2844 if (TARGET_FDPIC && size == UNITS_PER_WORD
2845 && GET_CODE (value) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (value))
2846 {
2847 fputs ("\t.long\t", asm_out_file);
2848 output_addr_const (asm_out_file, value);
2849 fputs ("@FUNCDESC\n", asm_out_file);
2850 return true;
2851 }
2852 return default_assemble_integer (value, size, aligned_p);
2853 }
2854 \f
2855 /* Check if PAT includes UNSPEC_CALLER unspec pattern. */
2856 static bool
2857 unspec_caller_rtx_p (rtx pat)
2858 {
2859 rtx base, offset;
2860 split_const (pat, &base, &offset);
2861
2862 if (GET_CODE (base) == UNSPEC)
2863 {
2864 if (XINT (base, 1) == UNSPEC_CALLER)
2865 return true;
2866 for (int i = 0; i < XVECLEN (base, 0); i++)
2867 if (unspec_caller_rtx_p (XVECEXP (base, 0, i)))
2868 return true;
2869 }
2870 return false;
2871 }
2872
2873 /* Indicate that INSN cannot be duplicated. This is true for insn
2874 that generates a unique label. */
2875 static bool
2876 sh_cannot_copy_insn_p (rtx_insn *insn)
2877 {
2878 if (!reload_completed || !flag_pic)
2879 return false;
2880
2881 if (!NONJUMP_INSN_P (insn))
2882 return false;
2883 if (asm_noperands (insn) >= 0)
2884 return false;
2885
2886 rtx pat = PATTERN (insn);
2887
2888 if (GET_CODE (pat) == CLOBBER || GET_CODE (pat) == USE)
2889 return false;
2890
2891 if (TARGET_FDPIC && GET_CODE (pat) == PARALLEL)
2892 {
2893 rtx t = XVECEXP (pat, 0, XVECLEN (pat, 0) - 1);
2894 if (GET_CODE (t) == USE && unspec_caller_rtx_p (XEXP (t, 0)))
2895 return true;
2896 }
2897
2898 if (GET_CODE (pat) != SET)
2899 return false;
2900 pat = SET_SRC (pat);
2901
2902 if (unspec_caller_rtx_p (pat))
2903 return true;
2904
2905 return false;
2906 }
2907 \f
2908 /* Number of instructions used to make an arithmetic right shift by N. */
2909 static const char ashiftrt_insns[] =
2910 { 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};
2911
2912 /* Description of a logical left or right shift, when expanded to a sequence
2913 of 1/2/8/16 shifts.
2914 Notice that one bit right shifts clobber the T bit. One bit left shifts
2915 are done with an 'add Rn,Rm' insn and thus do not clobber the T bit. */
2916 enum
2917 {
2918 ASHL_CLOBBERS_T = 1 << 0,
2919 LSHR_CLOBBERS_T = 1 << 1
2920 };
2921
2922 struct ashl_lshr_sequence
2923 {
2924 char insn_count;
2925 signed char amount[6];
2926 char clobbers_t;
2927 };
2928
2929 static const struct ashl_lshr_sequence ashl_lshr_seq[32] =
2930 {
2931 { 0, { 0 }, 0 }, // 0
2932 { 1, { 1 }, LSHR_CLOBBERS_T },
2933 { 1, { 2 }, 0 },
2934 { 2, { 2, 1 }, LSHR_CLOBBERS_T },
2935 { 2, { 2, 2 }, 0 }, // 4
2936 { 3, { 2, 1, 2 }, LSHR_CLOBBERS_T },
2937 { 3, { 2, 2, 2 }, 0 },
2938 { 4, { 2, 2, 1, 2 }, LSHR_CLOBBERS_T },
2939 { 1, { 8 }, 0 }, // 8
2940 { 2, { 8, 1 }, LSHR_CLOBBERS_T },
2941 { 2, { 8, 2 }, 0 },
2942 { 3, { 8, 1, 2 }, LSHR_CLOBBERS_T },
2943 { 3, { 8, 2, 2 }, 0 }, // 12
2944 { 4, { 8, 2, 1, 2 }, LSHR_CLOBBERS_T },
2945 { 3, { 8, -2, 8 }, 0 },
2946 { 3, { 8, -1, 8 }, ASHL_CLOBBERS_T },
2947 { 1, { 16 }, 0 }, // 16
2948 { 2, { 16, 1 }, LSHR_CLOBBERS_T },
2949 { 2, { 16, 2 }, 0 },
2950 { 3, { 16, 1, 2 }, LSHR_CLOBBERS_T },
2951 { 3, { 16, 2, 2 }, 0 }, // 20
2952 { 4, { 16, 2, 1, 2 }, LSHR_CLOBBERS_T },
2953 { 3, { 16, -2, 8 }, 0 },
2954 { 3, { 16, -1, 8 }, ASHL_CLOBBERS_T },
2955 { 2, { 16, 8 }, 0 }, // 24
2956 { 3, { 16, 1, 8 }, LSHR_CLOBBERS_T },
2957 { 3, { 16, 8, 2 }, 0 },
2958 { 4, { 16, 8, 1, 2 }, LSHR_CLOBBERS_T },
2959 { 4, { 16, 8, 2, 2 }, 0 }, // 28
2960 { 4, { 16, -1, -2, 16 }, ASHL_CLOBBERS_T },
2961 { 3, { 16, -2, 16 }, 0 },
2962
2963 /* For a right shift by 31 a 2 insn shll-movt sequence can be used.
2964 For a left shift by 31 a 2 insn and-rotl sequences can be used.
2965 However, the shift-and combiner code needs this entry here to be in
2966 terms of real shift insns. */
2967 { 3, { 16, -1, 16 }, ASHL_CLOBBERS_T }
2968 };
2969
2970 /* Individual shift amounts for shift amounts < 16, up to three highmost
2971 bits might be clobbered. This is typically used when combined with some
2972 kind of sign or zero extension. */
2973 static const struct ashl_lshr_sequence ext_ashl_lshr_seq[32] =
2974 {
2975 { 0, { 0 }, 0 }, // 0
2976 { 1, { 1 }, LSHR_CLOBBERS_T },
2977 { 1, { 2 }, 0 },
2978 { 2, { 2, 1 }, LSHR_CLOBBERS_T },
2979 { 2, { 2, 2 }, 0 }, // 4
2980 { 3, { 2, 1, 2 }, LSHR_CLOBBERS_T },
2981 { 2, { 8, -2 }, 0 },
2982 { 2, { 8, -1 }, ASHL_CLOBBERS_T },
2983 { 1, { 8 }, 0 }, // 8
2984 { 2, { 8, 1 }, LSHR_CLOBBERS_T },
2985 { 2, { 8, 2 }, 0 },
2986 { 3, { 8, 1, 2 }, LSHR_CLOBBERS_T },
2987 { 3, { 8, 2, 2 }, 0 }, // 12
2988 { 3, { 16, -2, -1 }, ASHL_CLOBBERS_T },
2989 { 2, { 16, -2 }, 0 },
2990 { 2, { 16, -1 }, ASHL_CLOBBERS_T },
2991 { 1, { 16 }, 0 }, // 16
2992 { 2, { 16, 1 }, LSHR_CLOBBERS_T },
2993 { 2, { 16, 2 }, 0 },
2994 { 3, { 16, 1, 2 }, LSHR_CLOBBERS_T },
2995 { 3, { 16, 2, 2 }, 0 }, // 20
2996 { 4, { 16, 2, 1, 2 }, LSHR_CLOBBERS_T },
2997 { 3, { 16, -2, 8 }, 0 },
2998 { 3, { 16, -1, 8 }, ASHL_CLOBBERS_T },
2999 { 2, { 16, 8 }, 0 }, // 24
3000 { 3, { 16, 1, 8 }, LSHR_CLOBBERS_T },
3001 { 3, { 16, 8, 2 }, 0 },
3002 { 4, { 16, 8, 1, 2 }, LSHR_CLOBBERS_T },
3003 { 4, { 16, 8, 2, 2 }, 0 }, // 28
3004 { 4, { 16, -1, -2, 16 }, ASHL_CLOBBERS_T },
3005 { 3, { 16, -2, 16 }, 0 },
3006 { 3, { 16, -1, 16 }, ASHL_CLOBBERS_T }
3007 };
3008
3009 /* Return true if a shift left consisting of 1/2/8/16 shift instructions
3010 will clobber the T bit. */
3011 bool
3012 sh_ashlsi_clobbers_t_reg_p (rtx shift_amount)
3013 {
3014 gcc_assert (CONST_INT_P (shift_amount));
3015
3016 const int shift_amount_i = INTVAL (shift_amount) & 31;
3017
3018 /* Special case for shift count of 31: use and-rotl sequence. */
3019 if (shift_amount_i == 31)
3020 return true;
3021
3022 return (ashl_lshr_seq[shift_amount_i].clobbers_t
3023 & ASHL_CLOBBERS_T) != 0;
3024 }
3025
3026 /* Return true if a logical right shift consisting of 1/2/8/16 shift
3027 instructions will clobber the T bit. */
3028 bool
3029 sh_lshrsi_clobbers_t_reg_p (rtx shift_amount)
3030 {
3031 gcc_assert (CONST_INT_P (shift_amount));
3032
3033 /* For right shifts the constant might be negative. */
3034 const int shift_amount_i = std::abs (INTVAL (shift_amount)) & 31;
3035
3036 /* Special case for shift count of 31: use shll-movt sequence. */
3037 if (shift_amount_i == 31)
3038 return true;
3039
3040 return (ashl_lshr_seq[shift_amount_i].clobbers_t
3041 & LSHR_CLOBBERS_T) != 0;
3042 }
3043
3044 /* Return true if it is potentially beneficial to use a dynamic shift
3045 instruction (shad / shar) instead of a combination of 1/2/8/16
3046 shift instructions for the specified shift count.
3047 If dynamic shifts are not available, always return false. */
3048 bool
3049 sh_dynamicalize_shift_p (rtx count)
3050 {
3051 gcc_assert (CONST_INT_P (count));
3052
3053 /* For right shifts the constant might be negative. */
3054 const int shift_amount_i = std::abs (INTVAL (count)) & 31;
3055 int insn_count;
3056
3057 /* For left and right shifts, there are shorter 2 insn sequences for
3058 shift amounts of 31. */
3059 if (shift_amount_i == 31)
3060 insn_count = 2;
3061 else
3062 insn_count = ashl_lshr_seq[shift_amount_i].insn_count;
3063
3064 return TARGET_DYNSHIFT && (insn_count > 1 + SH_DYNAMIC_SHIFT_COST);
3065 }
3066
3067 /* Assuming we have a value that has been sign-extended by at least one bit,
3068 can we use the ext_shift_amounts with the last shift turned to an
3069 arithmetic shift to shift it by N without data loss, and quicker than by
3070 other means? */
3071 #define EXT_SHIFT_SIGNED(n) (((n) | 8) == 15)
3072
3073 /* Return the cost of a shift. */
3074 static inline int
3075 shiftcosts (rtx x)
3076 {
3077 if (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
3078 {
3079 if (GET_MODE (x) == DImode
3080 && CONST_INT_P (XEXP (x, 1))
3081 && INTVAL (XEXP (x, 1)) == 1)
3082 return 2;
3083
3084 /* Everything else is invalid, because there is no pattern for it. */
3085 return -1;
3086 }
3087 /* If shift by a non constant, then this will be expensive. */
3088 if (!CONST_INT_P (XEXP (x, 1)))
3089 return SH_DYNAMIC_SHIFT_COST;
3090
3091 /* Otherwise, return the true cost in instructions. Cope with out of range
3092 shift counts more or less arbitrarily. */
3093 int value = INTVAL (XEXP (x, 1)) & 31;
3094
3095 if (GET_CODE (x) == ASHIFTRT)
3096 {
3097 int cost = ashiftrt_insns[value];
3098 /* If dynamic shifts are available and profitable in this case, then we
3099 put the constant in a reg and use shad. */
3100 if (cost > 1 + SH_DYNAMIC_SHIFT_COST)
3101 cost = 1 + SH_DYNAMIC_SHIFT_COST;
3102 return cost;
3103 }
3104 else
3105 return ashl_lshr_seq[value].insn_count;
3106 }
3107
3108 /* Return the cost of an AND/XOR/IOR operation. */
3109 static inline int
3110 and_xor_ior_costs (rtx x, int code)
3111 {
3112 /* On SH1-4 we have only max. SImode operations.
3113 Double the cost for modes > SImode. */
3114 const int cost_scale = GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD ? 2 : 1;
3115
3116 /* A logical operation with two registers is a single cycle
3117 instruction. */
3118 if (!CONST_INT_P (XEXP (x, 1)))
3119 return 1 * cost_scale;
3120
3121 int i = INTVAL (XEXP (x, 1));
3122
3123 /* These constants are single cycle extu.[bw] instructions. */
3124 if ((i == 0xff || i == 0xffff) && code == AND)
3125 return 1 * cost_scale;
3126 /* Constants that can be used in an instruction as an immediate are
3127 a single cycle, but this requires r0, so make it a little more
3128 expensive. */
3129 if (CONST_OK_FOR_K08 (i))
3130 return 2 * cost_scale;
3131 /* Constants that can be loaded with a mov immediate need one more cycle.
3132 This case is probably unnecessary. */
3133 if (CONST_OK_FOR_I08 (i))
3134 return 2 * cost_scale;
3135 /* Any other constant requires an additional 2 cycle pc-relative load.
3136 This case is probably unnecessary. */
3137 return 3 * cost_scale;
3138 }
3139
3140 /* Return the cost of an addition or a subtraction. */
3141 static inline int
3142 addsubcosts (rtx x)
3143 {
3144 if (GET_MODE (x) == SImode)
3145 {
3146 /* The addc or subc patterns will eventually become one or two
3147 instructions. Below are some costs for some of the patterns
3148 which combine would reject because the costs of the individual
3149 insns in the patterns are lower.
3150
3151 FIXME: It would be much easier if we had something like insn cost
3152 attributes and the cost calculation machinery used those attributes
3153 in the first place. This would eliminate redundant recog-like C
3154 code to calculate costs of complex patterns. */
3155 rtx op0 = XEXP (x, 0);
3156 rtx op1 = XEXP (x, 1);
3157
3158 if (GET_CODE (x) == PLUS)
3159 {
3160 if (GET_CODE (op0) == AND
3161 && XEXP (op0, 1) == const1_rtx
3162 && (GET_CODE (op1) == PLUS
3163 || (GET_CODE (op1) == MULT && XEXP (op1, 1) == const2_rtx)))
3164 return 1;
3165
3166 if (GET_CODE (op0) == MULT && XEXP (op0, 1) == const2_rtx
3167 && GET_CODE (op1) == LSHIFTRT
3168 && CONST_INT_P (XEXP (op1, 1)) && INTVAL (XEXP (op1, 1)) == 31)
3169 return 1;
3170 }
3171 /* Let's assume that adding the result of an insns that stores into
3172 the T bit is cheap. */
3173 if (treg_set_expr (op1, SImode))
3174 return 1;
3175 if (treg_set_expr (op0, SImode))
3176 return 1;
3177 }
3178
3179 /* On SH1-4 we have only max. SImode operations.
3180 Double the cost for modes > SImode. */
3181 const int cost_scale = GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD ? 2 : 1;
3182
3183 /* Adding a register is a single cycle insn. */
3184 if (REG_P (XEXP (x, 1))
3185 || GET_CODE (XEXP (x, 1)) == SUBREG)
3186 return 1 * cost_scale;
3187
3188 /* Likewise for small constants. */
3189 if (CONST_INT_P (XEXP (x, 1))
3190 && CONST_OK_FOR_ADD (INTVAL (XEXP (x, 1))))
3191 return 1 * cost_scale;
3192
3193 /* Any other constant requires a 2 cycle pc-relative load plus an
3194 addition. */
3195 return 3 * cost_scale;
3196 }
3197
3198 /* Return the cost of a multiply. */
3199 static inline int
3200 multcosts (rtx x ATTRIBUTE_UNUSED)
3201 {
3202 if (sh_multcost >= 0)
3203 return sh_multcost;
3204
3205 if (TARGET_SH2)
3206 {
3207 /* We have a mul insn, so we can never take more than the mul and the
3208 read of the mac reg, but count more because of the latency and extra
3209 reg usage. */
3210 if (optimize_size)
3211 return 2;
3212 return 3;
3213 }
3214
3215 /* If we're aiming at small code, then just count the number of
3216 insns in a multiply call sequence. */
3217 if (optimize_size)
3218 return 5;
3219
3220 /* Otherwise count all the insns in the routine we'd be calling too. */
3221 return 20;
3222 }
3223
3224 /* Compute a (partial) cost for rtx X. Return true if the complete
3225 cost has been computed, and false if subexpressions should be
3226 scanned. In either case, *TOTAL contains the cost result. */
3227 static bool
3228 sh_rtx_costs (rtx x, machine_mode mode ATTRIBUTE_UNUSED, int outer_code,
3229 int opno ATTRIBUTE_UNUSED,
3230 int *total, bool speed ATTRIBUTE_UNUSED)
3231 {
3232 int code = GET_CODE (x);
3233
3234 switch (code)
3235 {
3236 /* The lower-subreg pass decides whether to split multi-word regs
3237 into individual regs by looking at the cost for a SET of certain
3238 modes with the following patterns:
3239 (set (reg) (reg))
3240 (set (reg) (const_int 0))
3241 On machines that support vector-move operations a multi-word move
3242 is the same cost as individual reg move. On SH there is no
3243 vector-move, so we have to provide the correct cost in the number
3244 of move insns to load/store the reg of the mode in question. */
3245 case SET:
3246 if (sh_movt_set_dest (x) != NULL || sh_movrt_set_dest (x) != NULL)
3247 {
3248 *total = COSTS_N_INSNS (1);
3249 return true;
3250 }
3251
3252 if (register_operand (SET_DEST (x), VOIDmode)
3253 && (register_operand (SET_SRC (x), VOIDmode)
3254 || satisfies_constraint_Z (SET_SRC (x))))
3255 {
3256 const machine_mode mode = GET_MODE (SET_DEST (x));
3257 *total = COSTS_N_INSNS (GET_MODE_SIZE (mode)
3258 / mov_insn_size (mode, TARGET_SH2A));
3259 return true;
3260 }
3261 return false;
3262
3263 /* The cost of a mem access is mainly the cost of the address mode. */
3264 case MEM:
3265 *total = sh_address_cost (XEXP (x, 0), GET_MODE (x), MEM_ADDR_SPACE (x),
3266 true);
3267 return true;
3268
3269 case IF_THEN_ELSE:
3270 /* This case is required for the if_then_else negc pattern. */
3271 if (treg_set_expr (XEXP (x, 0), SImode))
3272 {
3273 *total = COSTS_N_INSNS (1);
3274 return true;
3275 }
3276 else
3277 return false;
3278
3279 /* Zero extracts of single bits are usually combine patterns for the
3280 tst insns. */
3281 case ZERO_EXTRACT:
3282 if (GET_CODE (XEXP (x, 0)) == XOR
3283 && arith_reg_operand (XEXP (XEXP (x, 0), 0), VOIDmode)
3284 && XEXP (x, 1) == const1_rtx
3285 && CONST_INT_P (XEXP (x, 2))
3286 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
3287 /* Check that the xor constaint overlaps with the extracted bit. */
3288 && (INTVAL (XEXP (XEXP (x, 0), 1)) & (1LL << INTVAL (XEXP (x, 2)))))
3289 {
3290 *total = 1; //COSTS_N_INSNS (1);
3291 return true;
3292 }
3293
3294 /* div0s variant. */
3295 if (GET_CODE (XEXP (x, 0)) == XOR
3296 && GET_CODE (XEXP (XEXP (x, 0), 0)) == XOR
3297 && CONST_INT_P (XEXP (XEXP (x, 0), 1)))
3298 {
3299 *total = 1;
3300 return true;
3301 }
3302 return false;
3303
3304 /* The cost of a sign or zero extend depends on whether the source is a
3305 reg or a mem. In case of a mem take the address into account. */
3306 case SIGN_EXTEND:
3307 if (arith_reg_operand (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
3308 {
3309 *total = COSTS_N_INSNS (1);
3310 return true;
3311 }
3312 if (MEM_P (XEXP (x, 0)))
3313 {
3314 *total = sh_address_cost (XEXP (XEXP (x, 0), 0),
3315 GET_MODE (XEXP (x, 0)),
3316 MEM_ADDR_SPACE (XEXP (x, 0)), true);
3317 return true;
3318 }
3319 return false;
3320
3321 case ZERO_EXTEND:
3322 if (arith_reg_operand (XEXP (x, 0), GET_MODE (XEXP (x, 0))))
3323 {
3324 *total = COSTS_N_INSNS (1);
3325 return true;
3326 }
3327 else if (TARGET_SH2A && MEM_P (XEXP (x, 0))
3328 && (GET_MODE (XEXP (x, 0)) == QImode
3329 || GET_MODE (XEXP (x, 0)) == HImode))
3330 {
3331 /* Handle SH2A's movu.b and movu.w insn. */
3332 *total = sh_address_cost (XEXP (XEXP (x, 0), 0),
3333 GET_MODE (XEXP (x, 0)),
3334 MEM_ADDR_SPACE (XEXP (x, 0)), true);
3335 return true;
3336 }
3337 return false;
3338
3339 /* mems for SFmode and DFmode can be inside a parallel due to
3340 the way the fpscr is handled. */
3341 case PARALLEL:
3342 for (int i = 0; i < XVECLEN (x, 0); i++)
3343 {
3344 rtx xx = XVECEXP (x, 0, i);
3345 if (GET_CODE (xx) == SET && MEM_P (XEXP (xx, 0)))
3346 {
3347 *total = sh_address_cost (XEXP (XEXP (xx, 0), 0),
3348 GET_MODE (XEXP (xx, 0)),
3349 MEM_ADDR_SPACE (XEXP (xx, 0)), true);
3350 return true;
3351 }
3352 if (GET_CODE (xx) == SET && MEM_P (XEXP (xx, 1)))
3353 {
3354 *total = sh_address_cost (XEXP (XEXP (xx, 1), 0),
3355 GET_MODE (XEXP (xx, 1)),
3356 MEM_ADDR_SPACE (XEXP (xx, 1)), true);
3357 return true;
3358 }
3359 }
3360
3361 if (sh_1el_vec (x, VOIDmode))
3362 *total = outer_code != SET;
3363 else if (sh_rep_vec (x, VOIDmode))
3364 *total = ((GET_MODE_UNIT_SIZE (GET_MODE (x)) + 3) / 4
3365 + (outer_code != SET));
3366 else
3367 *total = COSTS_N_INSNS (3) + (outer_code != SET);
3368 return true;
3369
3370 case CONST_INT:
3371 if (CONST_OK_FOR_I08 (INTVAL (x)))
3372 *total = 0;
3373 else if ((outer_code == AND || outer_code == IOR || outer_code == XOR)
3374 && CONST_OK_FOR_K08 (INTVAL (x)))
3375 *total = 1;
3376 /* prepare_cmp_insn will force costly constants int registers before
3377 the cbranch[sd]i4 patterns can see them, so preserve potentially
3378 interesting ones not covered by I08 above. */
3379 else if (outer_code == COMPARE
3380 && ((unsigned HOST_WIDE_INT) INTVAL (x)
3381 == (unsigned HOST_WIDE_INT) 0x7fffffff + 1
3382 || INTVAL (x) == 0x7fffffff
3383 || INTVAL (x) == 0x80 || INTVAL (x) == -0x81))
3384 *total = 1;
3385 else
3386 *total = 8;
3387 return true;
3388
3389 case EQ:
3390 /* An and with a constant compared against zero is
3391 most likely going to be a TST #imm, R0 instruction. */
3392 if (XEXP (x, 1) == const0_rtx
3393 && ((GET_CODE (XEXP (x, 0)) == AND
3394 || (SUBREG_P (XEXP (x, 0))
3395 && GET_CODE (SUBREG_REG (XEXP (x, 0))) == AND))
3396 || GET_CODE (XEXP (x, 0)) == ZERO_EXTRACT))
3397 {
3398 *total = 1;
3399 return true;
3400 }
3401
3402 else if (XEXP (x, 1) == const0_rtx
3403 && GET_CODE (XEXP (x, 0)) == AND
3404 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
3405 && GET_CODE (XEXP (XEXP (x, 0), 0)) == ASHIFT
3406 && arith_reg_operand (XEXP (XEXP (XEXP (x, 0), 0), 0), SImode)
3407 && CONST_INT_P (XEXP (XEXP (XEXP (x, 0), 0), 1)))
3408 {
3409 *total = 1;
3410 return true;
3411 }
3412 else
3413 return false;
3414
3415 case SMIN:
3416 case SMAX:
3417 /* This is most likely a clips.b or clips.w insn that is being made up
3418 by combine. */
3419 if (TARGET_SH2A
3420 && (GET_CODE (XEXP (x, 0)) == SMAX || GET_CODE (XEXP (x, 0)) == SMIN)
3421 && CONST_INT_P (XEXP (XEXP (x, 0), 1))
3422 && REG_P (XEXP (XEXP (x, 0), 0))
3423 && CONST_INT_P (XEXP (x, 1)))
3424 {
3425 *total = COSTS_N_INSNS (1);
3426 return true;
3427 }
3428 else
3429 return false;
3430
3431 case CONST:
3432 case LABEL_REF:
3433 case SYMBOL_REF:
3434 *total = 5;
3435 return true;
3436
3437 case CONST_DOUBLE:
3438 /* prepare_cmp_insn will force costly constants int registers before
3439 the cbranchdi4 pattern can see them, so preserve potentially
3440 interesting ones. */
3441 if (outer_code == COMPARE && GET_MODE (x) == DImode)
3442 *total = 1;
3443 else
3444 *total = 10;
3445 return true;
3446
3447 case CONST_VECTOR:
3448 /* FIXME: This looks broken. Only the last statement has any effect.
3449 Probably this could be folded with the PARALLEL case? */
3450 if (x == CONST0_RTX (GET_MODE (x)))
3451 *total = 0;
3452 else if (sh_1el_vec (x, VOIDmode))
3453 *total = outer_code != SET;
3454 if (sh_rep_vec (x, VOIDmode))
3455 *total = ((GET_MODE_UNIT_SIZE (GET_MODE (x)) + 3) / 4
3456 + (outer_code != SET));
3457 *total = COSTS_N_INSNS (3) + (outer_code != SET);
3458 return true;
3459
3460 case PLUS:
3461 case MINUS:
3462 *total = COSTS_N_INSNS (addsubcosts (x));
3463 return true;
3464
3465 case AND:
3466 /* Check for (and (not (reg)) (const_int 1)) which is a tst insn. */
3467 if (GET_CODE (XEXP (x, 0)) == NOT && XEXP (x, 1) == const1_rtx)
3468 {
3469 *total = COSTS_N_INSNS (1);
3470 return true;
3471 }
3472 /* Fall through. */
3473
3474 case XOR:
3475 case IOR:
3476 *total = COSTS_N_INSNS (and_xor_ior_costs (x, code));
3477 return true;
3478
3479 case MULT:
3480 *total = COSTS_N_INSNS (multcosts (x));
3481 return true;
3482
3483 case LT:
3484 case GE:
3485 /* div0s sign comparison. */
3486 if (GET_CODE (XEXP (x, 0)) == XOR
3487 && REG_P ((XEXP (XEXP (x, 0), 0)))
3488 && REG_P ((XEXP (XEXP (x, 0), 1)))
3489 && satisfies_constraint_Z (XEXP (x, 1)))
3490 {
3491 *total = COSTS_N_INSNS (1);
3492 return true;
3493 }
3494 else
3495 return false;
3496
3497 case LSHIFTRT:
3498 /* div0s sign comparison. */
3499 if (GET_CODE (XEXP (x, 0)) == XOR
3500 && REG_P ((XEXP (XEXP (x, 0), 0)))
3501 && REG_P ((XEXP (XEXP (x, 0), 1)))
3502 && CONST_INT_P (XEXP (x, 1)) && INTVAL (XEXP (x, 1)) == 31)
3503 {
3504 *total = COSTS_N_INSNS (1);
3505 return true;
3506 }
3507 /* FALLTHRU */
3508 case ASHIFT:
3509 case ASHIFTRT:
3510 {
3511 int cost = shiftcosts (x);
3512 if (cost < 0)
3513 return false;
3514 *total = COSTS_N_INSNS (cost);
3515 return true;
3516 }
3517
3518 case DIV:
3519 case UDIV:
3520 case MOD:
3521 case UMOD:
3522 *total = COSTS_N_INSNS (20);
3523 return true;
3524
3525 case FLOAT:
3526 case FIX:
3527 *total = 100;
3528 return true;
3529
3530 default:
3531 return false;
3532 }
3533 }
3534
3535 /* Determine the size of the fundamental move insn that will be used
3536 for the specified mode. */
3537 static inline int
3538 mov_insn_size (machine_mode mode, bool consider_sh2a)
3539 {
3540 const int mode_sz = GET_MODE_SIZE (mode);
3541
3542 if ((consider_sh2a && TARGET_SH2A_DOUBLE && mode == DFmode)
3543 || (TARGET_FMOVD && mode == DFmode))
3544 return mode_sz;
3545 else
3546 {
3547 /* The max. available mode for actual move insns is SImode.
3548 Larger accesses will be split into multiple loads/stores. */
3549 const int max_mov_sz = GET_MODE_SIZE (SImode);
3550 return mode_sz >= max_mov_sz ? max_mov_sz : mode_sz;
3551 }
3552 }
3553
3554 /* Determine the maximum possible displacement for a move insn for the
3555 specified mode. */
3556 int
3557 sh_max_mov_insn_displacement (machine_mode mode, bool consider_sh2a)
3558 {
3559 /* The 4 byte displacement move insns are the same as the 2 byte
3560 versions but take a 12 bit displacement. All we need to do is to
3561 scale the max. displacement value accordingly. */
3562 const int disp_scale = consider_sh2a ? (4095 / 15) : 1;
3563
3564 /* SH2A supports FPU move insns with 12 bit displacements.
3565 Other variants to do not support any kind of displacements for
3566 FPU move insns. */
3567 if (! consider_sh2a && TARGET_FPU_ANY && GET_MODE_CLASS (mode) == MODE_FLOAT)
3568 return 0;
3569 else
3570 {
3571 const int mov_insn_sz = mov_insn_size (mode, consider_sh2a);
3572 const int mode_sz = GET_MODE_SIZE (mode);
3573 int r = 15 * mov_insn_sz * disp_scale;
3574
3575 /* If the mov insn will be split into multiple loads/stores, the
3576 maximum possible displacement is a bit smaller. */
3577 if (mode_sz > mov_insn_sz)
3578 r -= mode_sz - mov_insn_sz;
3579 return r;
3580 }
3581 }
3582
3583 /* Determine the alignment mask for a move insn of the
3584 specified mode. */
3585 static inline int
3586 mov_insn_alignment_mask (machine_mode mode, bool consider_sh2a)
3587 {
3588 const int mov_insn_sz = mov_insn_size (mode, consider_sh2a);
3589 return mov_insn_sz > 0 ? (mov_insn_sz - 1) : 0;
3590 }
3591
3592 /* Return the displacement value of a displacement address. */
3593 HOST_WIDE_INT
3594 sh_disp_addr_displacement (rtx x)
3595 {
3596 gcc_assert (satisfies_constraint_Sdd (x));
3597 return INTVAL (XEXP (XEXP (x, 0), 1));
3598 }
3599
3600 /* Compute the cost of an address. */
3601 static int
3602 sh_address_cost (rtx x, machine_mode mode,
3603 addr_space_t as ATTRIBUTE_UNUSED, bool speed ATTRIBUTE_UNUSED)
3604 {
3605 /* 'GBR + 0'. Account one more because of R0 restriction. */
3606 if (REG_P (x) && REGNO (x) == GBR_REG)
3607 return 2;
3608
3609 /* Simple reg, post-inc, pre-dec addressing. */
3610 if (REG_P (x) || GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_DEC)
3611 return 1;
3612
3613 /* 'reg + disp' addressing. */
3614 if (GET_CODE (x) == PLUS
3615 && REG_P (XEXP (x, 0)) && CONST_INT_P (XEXP (x, 1)))
3616 {
3617 /* 'GBR + disp'. Account one more because of R0 restriction. */
3618 if (REGNO (XEXP (x, 0)) == GBR_REG
3619 && gbr_displacement (XEXP (x, 1), mode))
3620 return 2;
3621
3622 const HOST_WIDE_INT offset = INTVAL (XEXP (x, 1));
3623
3624 if (offset == 0)
3625 return 1;
3626
3627 /* The displacement would fit into a 2 byte move insn.
3628 HImode and QImode loads/stores with displacement put pressure on
3629 R0 which will most likely require another reg copy. Thus account
3630 a higher cost for that. */
3631 if (offset > 0 && offset <= sh_max_mov_insn_displacement (mode, false))
3632 return (mode == HImode || mode == QImode) ? 2 : 1;
3633
3634 /* The displacement would fit into a 4 byte move insn (SH2A). */
3635 if (TARGET_SH2A
3636 && offset > 0 && offset <= sh_max_mov_insn_displacement (mode, true))
3637 return 2;
3638
3639 /* The displacement is probably out of range and will require extra
3640 calculations. */
3641 return 3;
3642 }
3643
3644 /* 'reg + reg' addressing. Account a slightly higher cost because of
3645 increased pressure on R0. */
3646 if (GET_CODE (x) == PLUS && ! CONSTANT_P (XEXP (x, 1)))
3647 return 3;
3648
3649 /* Not sure what it is - probably expensive. */
3650 return 10;
3651 }
3652
3653 /* Code to expand a shift. */
3654 static void
3655 gen_ashift (int type, int n, rtx reg)
3656 {
3657 rtx n_rtx;
3658
3659 /* Negative values here come from the shift_amounts array. */
3660 if (n < 0)
3661 {
3662 if (type == ASHIFT)
3663 type = LSHIFTRT;
3664 else
3665 type = ASHIFT;
3666 n = -n;
3667 }
3668
3669 n_rtx = GEN_INT (n);
3670 gcc_assert (satisfies_constraint_P27 (n_rtx));
3671
3672 switch (type)
3673 {
3674 case ASHIFTRT:
3675 emit_insn (gen_ashrsi3_k (reg, reg, n_rtx));
3676 break;
3677 case LSHIFTRT:
3678 if (n == 1)
3679 emit_insn (gen_shlr (reg, reg));
3680 else
3681 emit_insn (gen_lshrsi3_k (reg, reg, n_rtx));
3682 break;
3683 case ASHIFT:
3684 emit_insn (gen_ashlsi3_k (reg, reg, n_rtx));
3685 break;
3686 default:
3687 gcc_unreachable ();
3688 }
3689 }
3690
3691 /* Code to expand a HImode shift. */
3692 static void
3693 gen_ashift_hi (int type, int n, rtx reg)
3694 {
3695 /* Negative values here come from the shift_amounts array. */
3696 if (n < 0)
3697 {
3698 if (type == ASHIFT)
3699 type = LSHIFTRT;
3700 else
3701 type = ASHIFT;
3702 n = -n;
3703 }
3704
3705 switch (type)
3706 {
3707 case ASHIFTRT:
3708 case LSHIFTRT:
3709 /* We don't have HImode right shift operations because using the
3710 ordinary 32 bit shift instructions for that doesn't generate proper
3711 zero/sign extension.
3712 gen_ashift_hi is only called in contexts where we know that the
3713 sign extension works out correctly. */
3714 {
3715 int offset = 0;
3716 if (GET_CODE (reg) == SUBREG)
3717 {
3718 offset = SUBREG_BYTE (reg);
3719 reg = SUBREG_REG (reg);
3720 }
3721 gen_ashift (type, n, gen_rtx_SUBREG (SImode, reg, offset));
3722 break;
3723 }
3724 case ASHIFT:
3725 emit_insn (gen_ashlhi3_k (reg, reg, GEN_INT (n)));
3726 break;
3727 }
3728 }
3729
3730 /* Output RTL to split a constant shift into its component SH constant
3731 shift instructions. */
3732 void
3733 gen_shifty_op (int code, rtx *operands)
3734 {
3735 int value = INTVAL (operands[2]);
3736 int max, i;
3737
3738 /* Truncate the shift count in case it is out of bounds. */
3739 value = value & 31;
3740
3741 if (value == 31)
3742 {
3743 if (code == LSHIFTRT)
3744 {
3745 emit_insn (gen_rotlsi3_1 (operands[0], operands[0]));
3746 emit_insn (gen_movt (operands[0], get_t_reg_rtx ()));
3747 return;
3748 }
3749 else if (code == ASHIFT)
3750 {
3751 /* There is a two instruction sequence for 31 bit left shifts,
3752 but it requires r0. */
3753 if (REG_P (operands[0]) && REGNO (operands[0]) == 0)
3754 {
3755 emit_insn (gen_andsi3 (operands[0], operands[0], const1_rtx));
3756 emit_insn (gen_rotlsi3_31 (operands[0], operands[0]));
3757 return;
3758 }
3759 }
3760 }
3761 else if (value == 0)
3762 {
3763 /* This can happen even when optimizing, if there were subregs before
3764 reload. Don't output a nop here, as this is never optimized away;
3765 use a no-op move instead. */
3766 emit_insn (gen_rtx_SET (operands[0], operands[0]));
3767 return;
3768 }
3769
3770 max = ashl_lshr_seq[value].insn_count;
3771 for (i = 0; i < max; i++)
3772 gen_ashift (code, ashl_lshr_seq[value].amount[i], operands[0]);
3773 }
3774
3775 /* Same as gen_shifty_op, but optimized for values where the topmost bits
3776 don't matter. */
3777 void
3778 gen_shifty_hi_op (int code, rtx *operands)
3779 {
3780 int value = INTVAL (operands[2]);
3781 int max, i;
3782 void (*gen_fun) (int, int, rtx);
3783
3784 /* This operation is used by and_shl for SImode values with a few
3785 high bits known to be cleared. */
3786 value &= 31;
3787 if (value == 0)
3788 {
3789 emit_insn (gen_nop ());
3790 return;
3791 }
3792
3793 gen_fun = GET_MODE (operands[0]) == HImode ? gen_ashift_hi : gen_ashift;
3794 if (code == ASHIFT)
3795 {
3796 max = ext_ashl_lshr_seq[value].insn_count;
3797 for (i = 0; i < max; i++)
3798 gen_fun (code, ext_ashl_lshr_seq[value].amount[i], operands[0]);
3799 }
3800 else
3801 /* When shifting right, emit the shifts in reverse order, so that
3802 solitary negative values come first. */
3803 for (i = ext_ashl_lshr_seq[value].insn_count - 1; i >= 0; i--)
3804 gen_fun (code, ext_ashl_lshr_seq[value].amount[i], operands[0]);
3805 }
3806
3807 /* Output RTL for an arithmetic right shift.
3808 ??? Rewrite to use super-optimizer sequences. */
3809 bool
3810 expand_ashiftrt (rtx *operands)
3811 {
3812 rtx wrk;
3813 char func[18];
3814 int value;
3815
3816 if (TARGET_DYNSHIFT)
3817 {
3818 if (!CONST_INT_P (operands[2]))
3819 {
3820 rtx count = copy_to_mode_reg (SImode, operands[2]);
3821 emit_insn (gen_negsi2 (count, count));
3822 emit_insn (gen_ashrsi3_d (operands[0], operands[1], count));
3823 return true;
3824 }
3825 else if (ashiftrt_insns[INTVAL (operands[2]) & 31]
3826 > 1 + SH_DYNAMIC_SHIFT_COST)
3827 {
3828 rtx count
3829 = force_reg (SImode, GEN_INT (- (INTVAL (operands[2]) & 31)));
3830 emit_insn (gen_ashrsi3_d (operands[0], operands[1], count));
3831 return true;
3832 }
3833 }
3834 if (!CONST_INT_P (operands[2]))
3835 return false;
3836
3837 value = INTVAL (operands[2]) & 31;
3838
3839 if (value == 31)
3840 {
3841 /* If we are called from abs expansion, arrange things so that we
3842 we can use a single MT instruction that doesn't clobber the source,
3843 if LICM can hoist out the load of the constant zero. */
3844 if (currently_expanding_to_rtl)
3845 {
3846 emit_insn (gen_cmpgtsi_t (force_reg (SImode, CONST0_RTX (SImode)),
3847 operands[1]));
3848 emit_insn (gen_mov_neg_si_t (operands[0], get_t_reg_rtx ()));
3849 return true;
3850 }
3851 emit_insn (gen_ashrsi2_31 (operands[0], operands[1]));
3852 return true;
3853 }
3854 else if (value >= 16 && value <= 19)
3855 {
3856 wrk = gen_reg_rtx (SImode);
3857 emit_insn (gen_ashrsi2_16 (wrk, operands[1]));
3858 value -= 16;
3859 while (value--)
3860 gen_ashift (ASHIFTRT, 1, wrk);
3861 emit_move_insn (operands[0], wrk);
3862 return true;
3863 }
3864 /* Expand a short sequence inline, longer call a magic routine. */
3865 else if (value <= 5)
3866 {
3867 wrk = gen_reg_rtx (SImode);
3868 emit_move_insn (wrk, operands[1]);
3869 while (value--)
3870 gen_ashift (ASHIFTRT, 1, wrk);
3871 emit_move_insn (operands[0], wrk);
3872 return true;
3873 }
3874
3875 wrk = gen_reg_rtx (Pmode);
3876
3877 /* Load the value into an arg reg and call a helper. */
3878 emit_move_insn (gen_rtx_REG (SImode, 4), operands[1]);
3879 sprintf (func, "__ashiftrt_r4_%d", value);
3880 rtx lab = function_symbol (wrk, func, SFUNC_STATIC).lab;
3881 emit_insn (gen_ashrsi3_n (GEN_INT (value), wrk, lab));
3882 emit_move_insn (operands[0], gen_rtx_REG (SImode, 4));
3883 return true;
3884 }
3885
3886 /* Try to find a good way to implement the combiner pattern
3887 [(set (match_operand:SI 0 "register_operand" "r")
3888 (and:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
3889 (match_operand:SI 2 "const_int_operand" "n"))
3890 (match_operand:SI 3 "const_int_operand" "n"))) .
3891 LEFT_RTX is operand 2 in the above pattern, and MASK_RTX is operand 3.
3892 return 0 for simple right / left or left/right shift combination.
3893 return 1 for a combination of shifts with zero_extend.
3894 return 2 for a combination of shifts with an AND that needs r0.
3895 return 3 for a combination of shifts with an AND that needs an extra
3896 scratch register, when the three highmost bits of the AND mask are clear.
3897 return 4 for a combination of shifts with an AND that needs an extra
3898 scratch register, when any of the three highmost bits of the AND mask
3899 is set.
3900 If ATTRP is set, store an initial right shift width in ATTRP[0],
3901 and the instruction length in ATTRP[1] . These values are not valid
3902 when returning 0.
3903 When ATTRP is set and returning 1, ATTRP[2] gets set to the index into
3904 shift_amounts for the last shift value that is to be used before the
3905 sign extend. */
3906 int
3907 shl_and_kind (rtx left_rtx, rtx mask_rtx, int *attrp)
3908 {
3909 unsigned HOST_WIDE_INT mask, lsb, mask2, lsb2;
3910 int left = INTVAL (left_rtx), right;
3911 int best = 0;
3912 int cost, best_cost = 10000;
3913 int best_right = 0, best_len = 0;
3914 int i;
3915 int can_ext;
3916
3917 if (left < 0 || left > 31)
3918 return 0;
3919 if (CONST_INT_P (mask_rtx))
3920 mask = (unsigned HOST_WIDE_INT) INTVAL (mask_rtx) >> left;
3921 else
3922 mask = (unsigned HOST_WIDE_INT) GET_MODE_MASK (SImode) >> left;
3923 /* Can this be expressed as a right shift / left shift pair? */
3924 lsb = ((mask ^ (mask - 1)) >> 1) + 1;
3925 right = exact_log2 (lsb);
3926 mask2 = ~(mask + lsb - 1);
3927 lsb2 = ((mask2 ^ (mask2 - 1)) >> 1) + 1;
3928 /* mask has no zeroes but trailing zeroes <==> ! mask2 */
3929 if (! mask2)
3930 best_cost = ashl_lshr_seq[right].insn_count
3931 + ashl_lshr_seq[right + left].insn_count;
3932 /* mask has no trailing zeroes <==> ! right */
3933 else if (! right && mask2 == ~(lsb2 - 1))
3934 {
3935 int late_right = exact_log2 (lsb2);
3936 best_cost = ashl_lshr_seq[left + late_right].insn_count
3937 + ashl_lshr_seq[late_right].insn_count;
3938 }
3939 /* Try to use zero extend. */
3940 if (mask2 == ~(lsb2 - 1))
3941 {
3942 int width, first;
3943
3944 for (width = 8; width <= 16; width += 8)
3945 {
3946 /* Can we zero-extend right away? */
3947 if (lsb2 == (unsigned HOST_WIDE_INT) 1 << width)
3948 {
3949 cost = 1 + ext_ashl_lshr_seq[right].insn_count
3950 + ext_ashl_lshr_seq[left + right].insn_count;
3951 if (cost < best_cost)
3952 {
3953 best = 1;
3954 best_cost = cost;
3955 best_right = right;
3956 best_len = cost;
3957 if (attrp)
3958 attrp[2] = -1;
3959 }
3960 continue;
3961 }
3962 /* ??? Could try to put zero extend into initial right shift,
3963 or even shift a bit left before the right shift. */
3964 /* Determine value of first part of left shift, to get to the
3965 zero extend cut-off point. */
3966 first = width - exact_log2 (lsb2) + right;
3967 if (first >= 0 && right + left - first >= 0)
3968 {
3969 cost = ext_ashl_lshr_seq[right].insn_count
3970 + ext_ashl_lshr_seq[first].insn_count + 1
3971 + ext_ashl_lshr_seq[right + left - first].insn_count;
3972
3973 if (cost < best_cost)
3974 {
3975 best = 1;
3976 best_cost = cost;
3977 best_right = right;
3978 best_len = cost;
3979 if (attrp)
3980 attrp[2] = first;
3981 }
3982 }
3983 }
3984 }
3985 /* Try to use r0 AND pattern */
3986 for (i = 0; i <= 2; i++)
3987 {
3988 if (i > right)
3989 break;
3990 if (! CONST_OK_FOR_K08 (mask >> i))
3991 continue;
3992 cost = (i != 0) + 2 + ext_ashl_lshr_seq[left + i].insn_count;
3993 if (cost < best_cost)
3994 {
3995 best = 2;
3996 best_cost = cost;
3997 best_right = i;
3998 best_len = cost - 1;
3999 }
4000 }
4001 /* Try to use a scratch register to hold the AND operand. */
4002 can_ext = ((mask << left) & ((unsigned HOST_WIDE_INT) 3 << 30)) == 0;
4003 for (i = 0; i <= 2; i++)
4004 {
4005 if (i > right)
4006 break;
4007 cost = (i != 0) + (CONST_OK_FOR_I08 (mask >> i) ? 2 : 3)
4008 + (can_ext
4009 ? ext_ashl_lshr_seq
4010 : ashl_lshr_seq)[left + i].insn_count;
4011 if (cost < best_cost)
4012 {
4013 best = 4 - can_ext;
4014 best_cost = cost;
4015 best_right = i;
4016 best_len = cost - 1 - ! CONST_OK_FOR_I08 (mask >> i);
4017 }
4018 }
4019
4020 if (attrp)
4021 {
4022 attrp[0] = best_right;
4023 attrp[1] = best_len;
4024 }
4025 return best;
4026 }
4027
4028 /* This is used in length attributes of the unnamed instructions
4029 corresponding to shl_and_kind return values of 1 and 2. */
4030 int
4031 shl_and_length (rtx insn)
4032 {
4033 rtx set_src, left_rtx, mask_rtx;
4034 int attributes[3];
4035
4036 set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
4037 left_rtx = XEXP (XEXP (set_src, 0), 1);
4038 mask_rtx = XEXP (set_src, 1);
4039 shl_and_kind (left_rtx, mask_rtx, attributes);
4040 return attributes[1];
4041 }
4042
4043 /* This is used in length attribute of the and_shl_scratch instruction. */
4044 int
4045 shl_and_scr_length (rtx insn)
4046 {
4047 rtx set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
4048 int len = ashl_lshr_seq[INTVAL (XEXP (set_src, 1)) & 31].insn_count;
4049 rtx op = XEXP (set_src, 0);
4050 len += ashl_lshr_seq[INTVAL (XEXP (op, 1)) & 31].insn_count + 1;
4051 op = XEXP (XEXP (op, 0), 0);
4052 return len + ashl_lshr_seq[INTVAL (XEXP (op, 1)) & 31].insn_count;
4053 }
4054
4055 /* Generate rtl for instructions for which shl_and_kind advised a particular
4056 method of generating them, i.e. returned zero. */
4057 bool
4058 gen_shl_and (rtx dest, rtx left_rtx, rtx mask_rtx, rtx source)
4059 {
4060 int attributes[3];
4061 unsigned HOST_WIDE_INT mask;
4062 int kind = shl_and_kind (left_rtx, mask_rtx, attributes);
4063 int right, total_shift;
4064 void (*shift_gen_fun) (int, rtx *) = gen_shifty_hi_op;
4065
4066 right = attributes[0];
4067 total_shift = INTVAL (left_rtx) + right;
4068 mask = (unsigned HOST_WIDE_INT) INTVAL (mask_rtx) >> total_shift;
4069 switch (kind)
4070 {
4071 default:
4072 return true;
4073 case 1:
4074 {
4075 int first = attributes[2];
4076 rtx operands[3];
4077
4078 if (first < 0)
4079 {
4080 emit_insn ((mask << right) <= 0xff
4081 ? gen_zero_extendqisi2 (dest,
4082 gen_lowpart (QImode, source))
4083 : gen_zero_extendhisi2 (dest,
4084 gen_lowpart (HImode, source)));
4085 source = dest;
4086 }
4087 if (source != dest)
4088 emit_insn (gen_movsi (dest, source));
4089 operands[0] = dest;
4090 if (right)
4091 {
4092 operands[2] = GEN_INT (right);
4093 gen_shifty_hi_op (LSHIFTRT, operands);
4094 }
4095 if (first > 0)
4096 {
4097 operands[2] = GEN_INT (first);
4098 gen_shifty_hi_op (ASHIFT, operands);
4099 total_shift -= first;
4100 mask <<= first;
4101 }
4102 if (first >= 0)
4103 emit_insn (mask <= 0xff
4104 ? gen_zero_extendqisi2 (dest, gen_lowpart (QImode, dest))
4105 : gen_zero_extendhisi2 (dest, gen_lowpart (HImode, dest)));
4106 if (total_shift > 0)
4107 {
4108 operands[2] = GEN_INT (total_shift);
4109 gen_shifty_hi_op (ASHIFT, operands);
4110 }
4111 break;
4112 }
4113 case 4:
4114 shift_gen_fun = gen_shifty_op;
4115 /* FALLTHRU */
4116 case 3:
4117 /* If the topmost bit that matters is set, set the topmost bits
4118 that don't matter. This way, we might be able to get a shorter
4119 signed constant. */
4120 if (mask & ((HOST_WIDE_INT) 1 << (31 - total_shift)))
4121 mask |= (HOST_WIDE_INT) ((HOST_WIDE_INT_M1U) << (31 - total_shift));
4122 /* FALLTHRU */
4123 case 2:
4124 /* Don't expand fine-grained when combining, because that will
4125 make the pattern fail. */
4126 if (currently_expanding_to_rtl
4127 || reload_in_progress || reload_completed)
4128 {
4129 rtx operands[3];
4130
4131 /* Cases 3 and 4 should be handled by this split
4132 only while combining */
4133 gcc_assert (kind <= 2);
4134 if (right)
4135 {
4136 emit_insn (gen_lshrsi3 (dest, source, GEN_INT (right)));
4137 source = dest;
4138 }
4139 emit_insn (gen_andsi3 (dest, source, GEN_INT (mask)));
4140 if (total_shift)
4141 {
4142 operands[0] = dest;
4143 operands[1] = dest;
4144 operands[2] = GEN_INT (total_shift);
4145 shift_gen_fun (ASHIFT, operands);
4146 }
4147 break;
4148 }
4149 else
4150 {
4151 int neg = 0;
4152 if (kind != 4 && total_shift < 16)
4153 {
4154 neg = -ext_ashl_lshr_seq[total_shift].amount[1];
4155 if (neg > 0)
4156 neg -= ext_ashl_lshr_seq[total_shift].amount[2];
4157 else
4158 neg = 0;
4159 }
4160 emit_insn (gen_and_shl_scratch (dest, source,
4161 GEN_INT (right),
4162 GEN_INT (mask),
4163 GEN_INT (total_shift + neg),
4164 GEN_INT (neg)));
4165 emit_insn (gen_movsi (dest, dest));
4166 break;
4167 }
4168 }
4169 return false;
4170 }
4171
4172 /* Try to find a good way to implement the combiner pattern
4173 [(set (match_operand:SI 0 "register_operand" "=r")
4174 (sign_extract:SI (ashift:SI (match_operand:SI 1 "register_operand" "r")
4175 (match_operand:SI 2 "const_int_operand" "n")
4176 (match_operand:SI 3 "const_int_operand" "n")
4177 (const_int 0)))
4178 (clobber (reg:SI T_REG))]
4179 LEFT_RTX is operand 2 in the above pattern, and SIZE_RTX is operand 3.
4180 return 0 for simple left / right shift combination.
4181 return 1 for left shift / 8 bit sign extend / left shift.
4182 return 2 for left shift / 16 bit sign extend / left shift.
4183 return 3 for left shift / 8 bit sign extend / shift / sign extend.
4184 return 4 for left shift / 16 bit sign extend / shift / sign extend.
4185 return 5 for left shift / 16 bit sign extend / right shift
4186 return 6 for < 8 bit sign extend / left shift.
4187 return 7 for < 8 bit sign extend / left shift / single right shift.
4188 If COSTP is nonzero, assign the calculated cost to *COSTP. */
4189 int
4190 shl_sext_kind (rtx left_rtx, rtx size_rtx, int *costp)
4191 {
4192 int left, size, insize, ext;
4193 int cost = 0, best_cost;
4194 int kind;
4195
4196 left = INTVAL (left_rtx);
4197 size = INTVAL (size_rtx);
4198 insize = size - left;
4199 gcc_assert (insize > 0);
4200 /* Default to left / right shift. */
4201 kind = 0;
4202 best_cost = ashl_lshr_seq[32 - insize].insn_count
4203 + ashl_lshr_seq[32 - size].insn_count;
4204 if (size <= 16)
4205 {
4206 /* 16 bit shift / sign extend / 16 bit shift */
4207 cost = ashl_lshr_seq[16 - insize].insn_count + 1
4208 + ashl_lshr_seq[16 - size].insn_count;
4209 /* If ashiftrt_insns[16 - size] is 8, this choice will be overridden
4210 below, by alternative 3 or something even better. */
4211 if (cost < best_cost)
4212 {
4213 kind = 5;
4214 best_cost = cost;
4215 }
4216 }
4217 /* Try a plain sign extend between two shifts. */
4218 for (ext = 16; ext >= insize; ext -= 8)
4219 {
4220 if (ext <= size)
4221 {
4222 cost = ext_ashl_lshr_seq[ext - insize].insn_count + 1
4223 + ashl_lshr_seq[size - ext].insn_count;
4224 if (cost < best_cost)
4225 {
4226 kind = ext / (unsigned) 8;
4227 best_cost = cost;
4228 }
4229 }
4230 /* Check if we can do a sloppy shift with a final signed shift
4231 restoring the sign. */
4232 if (EXT_SHIFT_SIGNED (size - ext))
4233 cost = ext_ashl_lshr_seq[ext - insize].insn_count
4234 + ext_ashl_lshr_seq[size - ext].insn_count + 1;
4235 /* If not, maybe it's still cheaper to do the second shift sloppy,
4236 and do a final sign extend? */
4237 else if (size <= 16)
4238 cost = ext_ashl_lshr_seq[ext - insize].insn_count + 1
4239 + ext_ashl_lshr_seq[size > ext ? size - ext : ext - size].insn_count
4240 + 1;
4241 else
4242 continue;
4243 if (cost < best_cost)
4244 {
4245 kind = ext / (unsigned) 8 + 2;
4246 best_cost = cost;
4247 }
4248 }
4249 /* Check if we can sign extend in r0 */
4250 if (insize < 8)
4251 {
4252 cost = 3 + ashl_lshr_seq[left].insn_count;
4253 if (cost < best_cost)
4254 {
4255 kind = 6;
4256 best_cost = cost;
4257 }
4258 /* Try the same with a final signed shift. */
4259 if (left < 31)
4260 {
4261 cost = 3 + ext_ashl_lshr_seq[left + 1].insn_count + 1;
4262 if (cost < best_cost)
4263 {
4264 kind = 7;
4265 best_cost = cost;
4266 }
4267 }
4268 }
4269 if (TARGET_DYNSHIFT)
4270 {
4271 /* Try to use a dynamic shift. */
4272 cost = ashl_lshr_seq[32 - insize].insn_count + 1 + SH_DYNAMIC_SHIFT_COST;
4273 if (cost < best_cost)
4274 {
4275 kind = 0;
4276 best_cost = cost;
4277 }
4278 }
4279 if (costp)
4280 *costp = cost;
4281 return kind;
4282 }
4283
4284 /* Function to be used in the length attribute of the instructions
4285 implementing this pattern. */
4286 int
4287 shl_sext_length (rtx insn)
4288 {
4289 rtx set_src, left_rtx, size_rtx;
4290 int cost;
4291
4292 set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0));
4293 left_rtx = XEXP (XEXP (set_src, 0), 1);
4294 size_rtx = XEXP (set_src, 1);
4295 shl_sext_kind (left_rtx, size_rtx, &cost);
4296 return cost;
4297 }
4298
4299 /* Generate rtl for this pattern */
4300 bool
4301 gen_shl_sext (rtx dest, rtx left_rtx, rtx size_rtx, rtx source)
4302 {
4303 int kind;
4304 int left, size, insize, cost;
4305 rtx operands[3];
4306
4307 kind = shl_sext_kind (left_rtx, size_rtx, &cost);
4308 left = INTVAL (left_rtx);
4309 size = INTVAL (size_rtx);
4310 insize = size - left;
4311 switch (kind)
4312 {
4313 case 1:
4314 case 2:
4315 case 3:
4316 case 4:
4317 {
4318 int ext = kind & 1 ? 8 : 16;
4319 int shift2 = size - ext;
4320
4321 /* Don't expand fine-grained when combining, because that will
4322 make the pattern fail. */
4323 if (! currently_expanding_to_rtl
4324 && ! reload_in_progress && ! reload_completed)
4325 {
4326 emit_insn (gen_shl_sext_ext (dest, source, left_rtx, size_rtx));
4327 emit_insn (gen_movsi (dest, source));
4328 break;
4329 }
4330 if (dest != source)
4331 emit_insn (gen_movsi (dest, source));
4332 operands[0] = dest;
4333 if (ext - insize)
4334 {
4335 operands[2] = GEN_INT (ext - insize);
4336 gen_shifty_hi_op (ASHIFT, operands);
4337 }
4338 emit_insn (kind & 1
4339 ? gen_extendqisi2 (dest, gen_lowpart (QImode, dest))
4340 : gen_extendhisi2 (dest, gen_lowpart (HImode, dest)));
4341 if (kind <= 2)
4342 {
4343 if (shift2)
4344 {
4345 operands[2] = GEN_INT (shift2);
4346 gen_shifty_op (ASHIFT, operands);
4347 }
4348 }
4349 else
4350 {
4351 if (shift2 > 0)
4352 {
4353 if (EXT_SHIFT_SIGNED (shift2))
4354 {
4355 operands[2] = GEN_INT (shift2 + 1);
4356 gen_shifty_op (ASHIFT, operands);
4357 operands[2] = const1_rtx;
4358 gen_shifty_op (ASHIFTRT, operands);
4359 break;
4360 }
4361 operands[2] = GEN_INT (shift2);
4362 gen_shifty_hi_op (ASHIFT, operands);
4363 }
4364 else if (shift2)
4365 {
4366 operands[2] = GEN_INT (-shift2);
4367 gen_shifty_hi_op (LSHIFTRT, operands);
4368 }
4369 emit_insn (size <= 8
4370 ? gen_extendqisi2 (dest, gen_lowpart (QImode, dest))
4371 : gen_extendhisi2 (dest, gen_lowpart (HImode, dest)));
4372 }
4373 break;
4374 }
4375 case 5:
4376 {
4377 int i = 16 - size;
4378 if (! currently_expanding_to_rtl
4379 && ! reload_in_progress && ! reload_completed)
4380 emit_insn (gen_shl_sext_ext (dest, source, left_rtx, size_rtx));
4381 else
4382 {
4383 operands[0] = dest;
4384 operands[2] = GEN_INT (16 - insize);
4385 gen_shifty_hi_op (ASHIFT, operands);
4386 emit_insn (gen_extendhisi2 (dest, gen_lowpart (HImode, dest)));
4387 }
4388 /* Don't use gen_ashrsi3 because it generates new pseudos. */
4389 while (--i >= 0)
4390 gen_ashift (ASHIFTRT, 1, dest);
4391 break;
4392 }
4393 case 6:
4394 case 7:
4395 /* Don't expand fine-grained when combining, because that will
4396 make the pattern fail. */
4397 if (! currently_expanding_to_rtl
4398 && ! reload_in_progress && ! reload_completed)
4399 {
4400 emit_insn (gen_shl_sext_ext (dest, source, left_rtx, size_rtx));
4401 emit_insn (gen_movsi (dest, source));
4402 break;
4403 }
4404 emit_insn (gen_andsi3 (dest, source, GEN_INT ((1 << insize) - 1)));
4405 emit_insn (gen_xorsi3 (dest, dest, GEN_INT (1 << (insize - 1))));
4406 emit_insn (gen_addsi3 (dest, dest, GEN_INT (HOST_WIDE_INT_M1U << (insize - 1))));
4407 operands[0] = dest;
4408 operands[2] = kind == 7 ? GEN_INT (left + 1) : left_rtx;
4409 gen_shifty_op (ASHIFT, operands);
4410 if (kind == 7)
4411 emit_insn (gen_ashrsi3_k (dest, dest, const1_rtx));
4412 break;
4413 default:
4414 return true;
4415 }
4416 return false;
4417 }
4418
4419 typedef struct label_ref_list_d
4420 {
4421 rtx_code_label *label;
4422 struct label_ref_list_d *next;
4423 } *label_ref_list_t;
4424
4425 static object_allocator<label_ref_list_d> label_ref_list_d_pool
4426 ("label references list");
4427
4428 /* The SH cannot load a large constant into a register, constants have to
4429 come from a pc relative load. The reference of a pc relative load
4430 instruction must be less than 1k in front of the instruction. This
4431 means that we often have to dump a constant inside a function, and
4432 generate code to branch around it.
4433
4434 It is important to minimize this, since the branches will slow things
4435 down and make things bigger.
4436
4437 Worst case code looks like:
4438
4439 mov.l L1,rn
4440 bra L2
4441 nop
4442 align
4443 L1: .long value
4444 L2:
4445 ..
4446
4447 mov.l L3,rn
4448 bra L4
4449 nop
4450 align
4451 L3: .long value
4452 L4:
4453 ..
4454
4455 We fix this by performing a scan before scheduling, which notices which
4456 instructions need to have their operands fetched from the constant table
4457 and builds the table.
4458
4459 The algorithm is:
4460
4461 scan, find an instruction which needs a pcrel move. Look forward, find the
4462 last barrier which is within MAX_COUNT bytes of the requirement.
4463 If there isn't one, make one. Process all the instructions between
4464 the find and the barrier.
4465
4466 In the above example, we can tell that L3 is within 1k of L1, so
4467 the first move can be shrunk from the 3 insn+constant sequence into
4468 just 1 insn, and the constant moved to L3 to make:
4469
4470 mov.l L1,rn
4471 ..
4472 mov.l L3,rn
4473 bra L4
4474 nop
4475 align
4476 L3:.long value
4477 L4:.long value
4478
4479 Then the second move becomes the target for the shortening process. */
4480
4481 typedef struct
4482 {
4483 rtx value; /* Value in table. */
4484 rtx_code_label *label; /* Label of value. */
4485 label_ref_list_t wend; /* End of window. */
4486 machine_mode mode; /* Mode of value. */
4487
4488 /* True if this constant is accessed as part of a post-increment
4489 sequence. Note that HImode constants are never accessed in this way. */
4490 bool part_of_sequence_p;
4491 } pool_node;
4492
4493 /* The maximum number of constants that can fit into one pool, since
4494 constants in the range 0..510 are at least 2 bytes long, and in the
4495 range from there to 1018 at least 4 bytes. */
4496
4497 #define MAX_POOL_SIZE 372
4498 static pool_node pool_vector[MAX_POOL_SIZE];
4499 static int pool_size;
4500 static rtx_code_label *pool_window_label;
4501 static int pool_window_last;
4502
4503 static int max_labelno_before_reorg;
4504
4505 /* ??? If we need a constant in HImode which is the truncated value of a
4506 constant we need in SImode, we could combine the two entries thus saving
4507 two bytes. Is this common enough to be worth the effort of implementing
4508 it? */
4509
4510 /* ??? This stuff should be done at the same time that we shorten branches.
4511 As it is now, we must assume that all branches are the maximum size, and
4512 this causes us to almost always output constant pools sooner than
4513 necessary. */
4514
4515 /* Add a constant to the pool and return its label. */
4516 static rtx_code_label *
4517 add_constant (rtx x, machine_mode mode, rtx last_value)
4518 {
4519 rtx_code_label *lab, *new_rtx;
4520 label_ref_list_t ref, newref;
4521
4522 /* First see if we've already got it. */
4523 for (int i = 0; i < pool_size; i++)
4524 {
4525 if (x->code == pool_vector[i].value->code
4526 && mode == pool_vector[i].mode)
4527 {
4528 if (x->code == CODE_LABEL)
4529 {
4530 if (XINT (x, 3) != XINT (pool_vector[i].value, 3))
4531 continue;
4532 }
4533 if (rtx_equal_p (x, pool_vector[i].value))
4534 {
4535 lab = new_rtx = 0;
4536 if (! last_value
4537 || ! i
4538 || ! rtx_equal_p (last_value, pool_vector[i-1].value))
4539 {
4540 new_rtx = gen_label_rtx ();
4541 LABEL_REFS (new_rtx) = pool_vector[i].label;
4542 pool_vector[i].label = lab = new_rtx;
4543 }
4544 if (lab && pool_window_label)
4545 {
4546 newref = label_ref_list_d_pool.allocate ();
4547 newref->label = pool_window_label;
4548 ref = pool_vector[pool_window_last].wend;
4549 newref->next = ref;
4550 pool_vector[pool_window_last].wend = newref;
4551 }
4552 if (new_rtx)
4553 pool_window_label = new_rtx;
4554 pool_window_last = i;
4555 return lab;
4556 }
4557 }
4558 }
4559
4560 /* Need a new one. */
4561 pool_vector[pool_size].value = x;
4562 if (last_value && rtx_equal_p (last_value, pool_vector[pool_size - 1].value))
4563 {
4564 lab = 0;
4565 pool_vector[pool_size - 1].part_of_sequence_p = true;
4566 }
4567 else
4568 lab = gen_label_rtx ();
4569 pool_vector[pool_size].mode = mode;
4570 pool_vector[pool_size].label = lab;
4571 pool_vector[pool_size].wend = NULL;
4572 pool_vector[pool_size].part_of_sequence_p = (lab == 0);
4573 if (lab && pool_window_label)
4574 {
4575 newref = label_ref_list_d_pool.allocate ();
4576 newref->label = pool_window_label;
4577 ref = pool_vector[pool_window_last].wend;
4578 newref->next = ref;
4579 pool_vector[pool_window_last].wend = newref;
4580 }
4581 if (lab)
4582 pool_window_label = lab;
4583 pool_window_last = pool_size;
4584 pool_size++;
4585 return lab;
4586 }
4587
4588 /* Output the literal table. START, if nonzero, is the first instruction
4589 this table is needed for, and also indicates that there is at least one
4590 casesi_worker_2 instruction; We have to emit the operand3 labels from
4591 these insns at a 4-byte aligned position. BARRIER is the barrier
4592 after which we are to place the table. */
4593 static void
4594 dump_table (rtx_insn *start, rtx_insn *barrier)
4595 {
4596 rtx_insn *scan = barrier;
4597 bool need_align = true;
4598 rtx_code_label *lab;
4599 label_ref_list_t ref;
4600 bool have_df = false;
4601
4602 /* Do two passes, first time dump out the HI sized constants. */
4603
4604 for (int i = 0; i < pool_size; i++)
4605 {
4606 pool_node *p = &pool_vector[i];
4607
4608 if (p->mode == HImode)
4609 {
4610 if (need_align)
4611 {
4612 scan = emit_insn_after (gen_align_2 (), scan);
4613 need_align = false;
4614 }
4615 for (lab = p->label; lab;
4616 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4617 scan = emit_label_after (lab, scan);
4618 scan = emit_insn_after (gen_consttable_2 (p->value, const0_rtx),
4619 scan);
4620 for (ref = p->wend; ref; ref = ref->next)
4621 {
4622 lab = ref->label;
4623 scan = emit_insn_after (gen_consttable_window_end (lab), scan);
4624 }
4625 }
4626 else if (p->mode == DFmode)
4627 have_df = true;
4628 }
4629
4630 need_align = true;
4631
4632 if (start)
4633 {
4634 scan = emit_insn_after (gen_align_4 (), scan);
4635 need_align = false;
4636 for (; start != barrier; start = NEXT_INSN (start))
4637 if (NONJUMP_INSN_P (start)
4638 && recog_memoized (start) == CODE_FOR_casesi_worker_2)
4639 {
4640 rtx src = SET_SRC (XVECEXP (PATTERN (start), 0, 0));
4641 rtx lab = XEXP (XVECEXP (src, 0, 3), 0);
4642
4643 scan = emit_label_after (as_a <rtx_insn *> (lab), scan);
4644 }
4645 }
4646 if (TARGET_FMOVD && TARGET_ALIGN_DOUBLE && have_df)
4647 {
4648 rtx_insn *align_insn = NULL;
4649
4650 scan = emit_label_after (gen_label_rtx (), scan);
4651 scan = emit_insn_after (gen_align_log (GEN_INT (3)), scan);
4652 need_align = false;
4653
4654 for (int i = 0; i < pool_size; i++)
4655 {
4656 pool_node *p = &pool_vector[i];
4657
4658 switch (p->mode)
4659 {
4660 case E_HImode:
4661 break;
4662 case E_SImode:
4663 case E_SFmode:
4664 if (align_insn && !p->part_of_sequence_p)
4665 {
4666 for (lab = p->label; lab;
4667 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4668 emit_label_before (lab, align_insn);
4669 emit_insn_before (gen_consttable_4 (p->value, const0_rtx),
4670 align_insn);
4671 for (ref = p->wend; ref; ref = ref->next)
4672 {
4673 lab = ref->label;
4674 emit_insn_before (gen_consttable_window_end (lab),
4675 align_insn);
4676 }
4677 delete_insn (align_insn);
4678 align_insn = NULL;
4679 continue;
4680 }
4681 else
4682 {
4683 for (lab = p->label; lab;
4684 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4685 scan = emit_label_after (lab, scan);
4686 scan = emit_insn_after (gen_consttable_4 (p->value,
4687 const0_rtx), scan);
4688 need_align = ! need_align;
4689 }
4690 break;
4691 case E_DFmode:
4692 if (need_align)
4693 {
4694 scan = emit_insn_after (gen_align_log (GEN_INT (3)), scan);
4695 align_insn = scan;
4696 need_align = false;
4697 }
4698 /* FALLTHRU */
4699 case E_DImode:
4700 for (lab = p->label; lab;
4701 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4702 scan = emit_label_after (lab, scan);
4703 scan = emit_insn_after (gen_consttable_8 (p->value, const0_rtx),
4704 scan);
4705 break;
4706 default:
4707 gcc_unreachable ();
4708 }
4709
4710 if (p->mode != HImode)
4711 {
4712 for (ref = p->wend; ref; ref = ref->next)
4713 {
4714 lab = ref->label;
4715 scan = emit_insn_after (gen_consttable_window_end (lab),
4716 scan);
4717 }
4718 }
4719 }
4720
4721 pool_size = 0;
4722 }
4723
4724 for (int i = 0; i < pool_size; i++)
4725 {
4726 pool_node *p = &pool_vector[i];
4727
4728 switch (p->mode)
4729 {
4730 case E_HImode:
4731 break;
4732 case E_SImode:
4733 case E_SFmode:
4734 if (need_align)
4735 {
4736 need_align = false;
4737 scan = emit_label_after (gen_label_rtx (), scan);
4738 scan = emit_insn_after (gen_align_4 (), scan);
4739 }
4740 for (lab = p->label; lab;
4741 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4742 scan = emit_label_after (lab, scan);
4743 scan = emit_insn_after (gen_consttable_4 (p->value, const0_rtx),
4744 scan);
4745 break;
4746 case E_DFmode:
4747 case E_DImode:
4748 if (need_align)
4749 {
4750 need_align = false;
4751 scan = emit_label_after (gen_label_rtx (), scan);
4752 scan = emit_insn_after (gen_align_4 (), scan);
4753 }
4754 for (lab = p->label; lab;
4755 lab = safe_as_a <rtx_code_label *> (LABEL_REFS (lab)))
4756 scan = emit_label_after (lab, scan);
4757 scan = emit_insn_after (gen_consttable_8 (p->value, const0_rtx),
4758 scan);
4759 break;
4760 default:
4761 gcc_unreachable ();
4762 }
4763
4764 if (p->mode != HImode)
4765 {
4766 for (ref = p->wend; ref; ref = ref->next)
4767 {
4768 lab = ref->label;
4769 scan = emit_insn_after (gen_consttable_window_end (lab), scan);
4770 }
4771 }
4772 }
4773
4774 scan = emit_insn_after (gen_consttable_end (), scan);
4775 scan = emit_barrier_after (scan);
4776 pool_size = 0;
4777 pool_window_label = NULL;
4778 pool_window_last = 0;
4779 }
4780
4781 #define MOVA_LABELREF(mova) XVECEXP (SET_SRC (PATTERN (mova)), 0, 0)
4782
4783 /* Nonzero if the insn is a move instruction which needs to be fixed. */
4784
4785 /* ??? For a DImode/DFmode moves, we don't need to fix it if each half of the
4786 CONST_DOUBLE input value is CONST_OK_FOR_I08. For a SFmode move, we don't
4787 need to fix it if the input value is CONST_OK_FOR_I08. */
4788 static bool
4789 broken_move (rtx_insn *insn)
4790 {
4791 if (NONJUMP_INSN_P (insn))
4792 {
4793 rtx pat = PATTERN (insn);
4794 if (GET_CODE (pat) == PARALLEL)
4795 pat = XVECEXP (pat, 0, 0);
4796 if (GET_CODE (pat) == SET
4797 /* We can load any 8-bit value if we don't care what the high
4798 order bits end up as. */
4799 && GET_MODE (SET_DEST (pat)) != QImode
4800 && (CONSTANT_P (SET_SRC (pat))
4801 || (GET_CODE (SET_SRC (pat)) == UNSPEC_VOLATILE
4802 && XINT (SET_SRC (pat), 1) == UNSPECV_SP_SWITCH_B)
4803 /* Match mova_const. */
4804 || (GET_CODE (SET_SRC (pat)) == UNSPEC
4805 && XINT (SET_SRC (pat), 1) == UNSPEC_MOVA
4806 && GET_CODE (XVECEXP (SET_SRC (pat), 0, 0)) == CONST))
4807 && ! (TARGET_SH2E
4808 && GET_CODE (SET_SRC (pat)) == CONST_DOUBLE
4809 && (fp_zero_operand (SET_SRC (pat))
4810 || fp_one_operand (SET_SRC (pat)))
4811 /* In general we don't know the current setting of fpscr, so
4812 disable fldi.
4813 There is an exception if this was a register-register move
4814 before reload - and hence it was ascertained that we have
4815 single precision setting - and in a post-reload optimization
4816 we changed this to do a constant load. In that case
4817 we don't have an r0 clobber, hence we must use fldi. */
4818 && (TARGET_FMOVD
4819 || (GET_CODE (XEXP (XVECEXP (PATTERN (insn), 0, 2), 0))
4820 == SCRATCH))
4821 && REG_P (SET_DEST (pat))
4822 && FP_REGISTER_P (REGNO (SET_DEST (pat))))
4823 && ! (TARGET_SH2A
4824 && GET_MODE (SET_DEST (pat)) == SImode
4825 && (satisfies_constraint_I20 (SET_SRC (pat))
4826 || satisfies_constraint_I28 (SET_SRC (pat))))
4827 && ! satisfies_constraint_I08 (SET_SRC (pat)))
4828 return true;
4829 }
4830
4831 return false;
4832 }
4833
4834 /* Return true if the specified insn is a mova insn. */
4835 static bool
4836 mova_p (rtx_insn *insn)
4837 {
4838 return (NONJUMP_INSN_P (insn)
4839 && GET_CODE (PATTERN (insn)) == SET
4840 && GET_CODE (SET_SRC (PATTERN (insn))) == UNSPEC
4841 && XINT (SET_SRC (PATTERN (insn)), 1) == UNSPEC_MOVA
4842 /* Don't match mova_const. */
4843 && GET_CODE (MOVA_LABELREF (insn)) == LABEL_REF);
4844 }
4845
4846 /* Fix up a mova from a switch that went out of range. */
4847 static void
4848 fixup_mova (rtx_insn *mova)
4849 {
4850 PUT_MODE (XEXP (MOVA_LABELREF (mova), 0), QImode);
4851 if (! flag_pic)
4852 {
4853 SET_SRC (PATTERN (mova)) = MOVA_LABELREF (mova);
4854 INSN_CODE (mova) = -1;
4855 }
4856 else
4857 {
4858 rtx_insn *worker = mova;
4859 rtx_code_label *lab = gen_label_rtx ();
4860 rtx wpat, wpat0, wpat1, wsrc, target, base, diff;
4861
4862 do
4863 {
4864 worker = NEXT_INSN (worker);
4865 gcc_assert (worker
4866 && !LABEL_P (worker)
4867 && !JUMP_P (worker));
4868 } while (NOTE_P (worker)
4869 || recog_memoized (worker) != CODE_FOR_casesi_worker_1);
4870 wpat = PATTERN (worker);
4871 wpat0 = XVECEXP (wpat, 0, 0);
4872 wpat1 = XVECEXP (wpat, 0, 1);
4873 wsrc = SET_SRC (wpat0);
4874 PATTERN (worker) = (gen_casesi_worker_2
4875 (SET_DEST (wpat0), XVECEXP (wsrc, 0, 1),
4876 XEXP (XVECEXP (wsrc, 0, 2), 0), lab,
4877 XEXP (wpat1, 0)));
4878 INSN_CODE (worker) = -1;
4879 target = XVECEXP (SET_SRC (PATTERN (mova)), 0, 0);
4880 base = gen_rtx_LABEL_REF (Pmode, lab);
4881 diff = gen_rtx_UNSPEC (Pmode, gen_rtvec (2, target, base), UNSPEC_SYMOFF);
4882 SET_SRC (PATTERN (mova)) = gen_rtx_CONST (Pmode, diff);
4883 INSN_CODE (mova) = -1;
4884 }
4885 }
4886
4887 /* NEW_MOVA is a mova we've just encountered while scanning forward. Update
4888 *num_mova, and check if the new mova is not nested within the first one.
4889 return 0 if *first_mova was replaced, 1 if new_mova was replaced,
4890 2 if new_mova has been assigned to *first_mova, -1 otherwise.. */
4891 static int
4892 untangle_mova (int *num_mova, rtx_insn **first_mova, rtx_insn *new_mova)
4893 {
4894 int n_addr = 0; /* Initialization to shut up spurious warning. */
4895 int f_target, n_target = 0; /* Likewise. */
4896
4897 if (optimize)
4898 {
4899 /* If NEW_MOVA has no address yet, it will be handled later. */
4900 if (INSN_ADDRESSES_SIZE() <= (unsigned) INSN_UID (new_mova))
4901 return -1;
4902
4903 n_addr = INSN_ADDRESSES (INSN_UID (new_mova));
4904 n_target = INSN_ADDRESSES (INSN_UID (XEXP (MOVA_LABELREF (new_mova), 0)));
4905 if (n_addr > n_target || n_addr + 1022 < n_target)
4906 {
4907 /* Change the mova into a load.
4908 broken_move will then return true for it. */
4909 fixup_mova (new_mova);
4910 return 1;
4911 }
4912 }
4913 if (!(*num_mova)++)
4914 {
4915 *first_mova = new_mova;
4916 return 2;
4917 }
4918 if (!optimize
4919 || ((f_target
4920 = INSN_ADDRESSES (INSN_UID (XEXP (MOVA_LABELREF (*first_mova), 0))))
4921 >= n_target))
4922 return -1;
4923
4924 (*num_mova)--;
4925 if (f_target - INSN_ADDRESSES (INSN_UID (*first_mova))
4926 > n_target - n_addr)
4927 {
4928 fixup_mova (*first_mova);
4929 return 0;
4930 }
4931 else
4932 {
4933 fixup_mova (new_mova);
4934 return 1;
4935 }
4936 }
4937
4938 /* Find the last barrier from insn FROM which is close enough to hold the
4939 constant pool. If we can't find one, then create one near the end of
4940 the range. */
4941 static rtx_insn *
4942 find_barrier (int num_mova, rtx_insn *mova, rtx_insn *from)
4943 {
4944 int count_si = 0;
4945 int count_hi = 0;
4946 int found_hi = 0;
4947 int found_si = 0;
4948 int hi_align = 2;
4949 int si_align = 2;
4950 int leading_mova = num_mova;
4951 rtx_insn *barrier_before_mova = NULL;
4952 rtx_insn *found_barrier = NULL;
4953 rtx_insn *good_barrier = NULL;
4954 int si_limit;
4955 int hi_limit;
4956 rtx_insn *orig = from;
4957 rtx_insn *last_got = NULL;
4958 rtx_insn *last_symoff = NULL;
4959
4960 /* For HImode: range is 510, add 4 because pc counts from address of
4961 second instruction after this one, subtract 2 for the jump instruction
4962 that we may need to emit before the table, subtract 2 for the instruction
4963 that fills the jump delay slot (in very rare cases, reorg will take an
4964 instruction from after the constant pool or will leave the delay slot
4965 empty). This gives 510.
4966 For SImode: range is 1020, add 4 because pc counts from address of
4967 second instruction after this one, subtract 2 in case pc is 2 byte
4968 aligned, subtract 2 for the jump instruction that we may need to emit
4969 before the table, subtract 2 for the instruction that fills the jump
4970 delay slot. This gives 1018. */
4971
4972 /* The branch will always be shortened now that the reference address for
4973 forward branches is the successor address, thus we need no longer make
4974 adjustments to the [sh]i_limit for -O0. */
4975
4976 si_limit = 1018;
4977 hi_limit = 510;
4978
4979 while (from && count_si < si_limit && count_hi < hi_limit)
4980 {
4981 int inc = get_attr_length (from);
4982 int new_align = 1;
4983
4984 /* If this is a label that existed at the time of the compute_alignments
4985 call, determine the alignment. N.B. When find_barrier recurses for
4986 an out-of-reach mova, we might see labels at the start of previously
4987 inserted constant tables. */
4988 if (LABEL_P (from)
4989 && CODE_LABEL_NUMBER (from) <= max_labelno_before_reorg)
4990 {
4991 if (optimize)
4992 new_align = 1 << label_to_alignment (from).levels[0].log;
4993 else if (BARRIER_P (prev_nonnote_insn (from)))
4994 new_align = 1 << barrier_align (from);
4995 else
4996 new_align = 1;
4997 inc = 0;
4998 }
4999 /* In case we are scanning a constant table because of recursion, check
5000 for explicit alignments. If the table is long, we might be forced
5001 to emit the new table in front of it; the length of the alignment
5002 might be the last straw. */
5003 else if (NONJUMP_INSN_P (from)
5004 && GET_CODE (PATTERN (from)) == UNSPEC_VOLATILE
5005 && XINT (PATTERN (from), 1) == UNSPECV_ALIGN)
5006 new_align = INTVAL (XVECEXP (PATTERN (from), 0, 0));
5007 /* When we find the end of a constant table, paste the new constant
5008 at the end. That is better than putting it in front because
5009 this way, we don't need extra alignment for adding a 4-byte-aligned
5010 mov(a) label to a 2/4 or 8/4 byte aligned table. */
5011 else if (NONJUMP_INSN_P (from)
5012 && GET_CODE (PATTERN (from)) == UNSPEC_VOLATILE
5013 && XINT (PATTERN (from), 1) == UNSPECV_CONST_END)
5014 return from;
5015
5016 if (BARRIER_P (from))
5017 {
5018 rtx_insn *next;
5019
5020 found_barrier = from;
5021
5022 /* If we are at the end of the function, or in front of an alignment
5023 instruction, we need not insert an extra alignment. We prefer
5024 this kind of barrier. */
5025 if (barrier_align (from) > 2)
5026 good_barrier = from;
5027
5028 /* If we are at the end of a hot/cold block, dump the constants
5029 here. */
5030 next = NEXT_INSN (from);
5031 if (next
5032 && NOTE_P (next)
5033 && NOTE_KIND (next) == NOTE_INSN_SWITCH_TEXT_SECTIONS)
5034 break;
5035 }
5036
5037 if (broken_move (from))
5038 {
5039 rtx pat, src, dst;
5040 machine_mode mode;
5041
5042 pat = PATTERN (from);
5043 if (GET_CODE (pat) == PARALLEL)
5044 pat = XVECEXP (pat, 0, 0);
5045 src = SET_SRC (pat);
5046 dst = SET_DEST (pat);
5047 mode = GET_MODE (dst);
5048
5049 /* GOT pcrelat setting comes in pair of
5050 mova .L8,r0
5051 mov.l .L8,r12
5052 instructions. (plus add r0,r12).
5053 Remember if we see one without the other. */
5054 if (GET_CODE (src) == UNSPEC && PIC_ADDR_P (XVECEXP (src, 0, 0)))
5055 last_got = last_got ? NULL : from;
5056 else if (PIC_ADDR_P (src))
5057 last_got = last_got ? NULL : from;
5058
5059 /* We must explicitly check the mode, because sometimes the
5060 front end will generate code to load unsigned constants into
5061 HImode targets without properly sign extending them. */
5062 if (mode == HImode
5063 || (mode == SImode && satisfies_constraint_I16 (src)
5064 && REGNO (dst) != FPUL_REG))
5065 {
5066 found_hi += 2;
5067 /* We put the short constants before the long constants, so
5068 we must count the length of short constants in the range
5069 for the long constants. */
5070 /* ??? This isn't optimal, but is easy to do. */
5071 si_limit -= 2;
5072 }
5073 else
5074 {
5075 /* We dump DF/DI constants before SF/SI ones, because
5076 the limit is the same, but the alignment requirements
5077 are higher. We may waste up to 4 additional bytes
5078 for alignment, and the DF/DI constant may have
5079 another SF/SI constant placed before it. */
5080 while (si_align > 2 && found_si + si_align - 2 > count_si)
5081 si_align >>= 1;
5082 if (found_si > count_si)
5083 count_si = found_si;
5084 found_si += GET_MODE_SIZE (mode);
5085 if (num_mova)
5086 si_limit -= GET_MODE_SIZE (mode);
5087 }
5088 }
5089
5090 if (mova_p (from))
5091 {
5092 switch (untangle_mova (&num_mova, &mova, from))
5093 {
5094 case 1:
5095 if (flag_pic)
5096 {
5097 rtx src = SET_SRC (PATTERN (from));
5098 if (GET_CODE (src) == CONST
5099 && GET_CODE (XEXP (src, 0)) == UNSPEC
5100 && XINT (XEXP (src, 0), 1) == UNSPEC_SYMOFF)
5101 last_symoff = from;
5102 }
5103 break;
5104 case 0: return find_barrier (0, 0, mova);
5105 case 2:
5106 {
5107 leading_mova = 0;
5108 barrier_before_mova
5109 = good_barrier ? good_barrier : found_barrier;
5110 }
5111 default: break;
5112 }
5113 if (found_si > count_si)
5114 count_si = found_si;
5115 }
5116 else if (JUMP_TABLE_DATA_P (from)
5117 && GET_CODE (PATTERN (from)) == ADDR_DIFF_VEC)
5118 {
5119 if ((num_mova > 1 && GET_MODE (prev_nonnote_insn (from)) == VOIDmode)
5120 || (num_mova
5121 && (prev_nonnote_insn (from)
5122 == XEXP (MOVA_LABELREF (mova), 0))))
5123 num_mova--;
5124 if (barrier_align (next_real_insn (from)) == align_jumps.levels[0].log)
5125 {
5126 /* We have just passed the barrier in front of the
5127 ADDR_DIFF_VEC, which is stored in found_barrier. Since
5128 the ADDR_DIFF_VEC is accessed as data, just like our pool
5129 constants, this is a good opportunity to accommodate what
5130 we have gathered so far.
5131 If we waited any longer, we could end up at a barrier in
5132 front of code, which gives worse cache usage for separated
5133 instruction / data caches. */
5134 good_barrier = found_barrier;
5135 break;
5136 }
5137 else
5138 {
5139 rtx body = PATTERN (from);
5140 inc = XVECLEN (body, 1) * GET_MODE_SIZE (GET_MODE (body));
5141 }
5142 }
5143 /* For the SH1, we generate alignments even after jumps-around-jumps. */
5144 else if (JUMP_P (from)
5145 && ! TARGET_SH2
5146 && ! optimize_size)
5147 new_align = 4;
5148
5149 /* There is a possibility that a bf is transformed into a bf/s by the
5150 delay slot scheduler. */
5151 if (JUMP_P (from)
5152 && get_attr_type (from) == TYPE_CBRANCH
5153 && ! sequence_insn_p (from))
5154 inc += 2;
5155
5156 if (found_si)
5157 {
5158 count_si += inc;
5159 if (new_align > si_align)
5160 {
5161 si_limit -= (count_si - 1) & (new_align - si_align);
5162 si_align = new_align;
5163 }
5164 count_si = (count_si + new_align - 1) & -new_align;
5165 }
5166 if (found_hi)
5167 {
5168 count_hi += inc;
5169 if (new_align > hi_align)
5170 {
5171 hi_limit -= (count_hi - 1) & (new_align - hi_align);
5172 hi_align = new_align;
5173 }
5174 count_hi = (count_hi + new_align - 1) & -new_align;
5175 }
5176 from = NEXT_INSN (from);
5177 }
5178
5179 if (num_mova)
5180 {
5181 if (leading_mova)
5182 {
5183 /* Try as we might, the leading mova is out of range. Change
5184 it into a load (which will become a pcload) and retry. */
5185 fixup_mova (mova);
5186 return find_barrier (0, 0, mova);
5187 }
5188 else
5189 {
5190 /* Insert the constant pool table before the mova instruction,
5191 to prevent the mova label reference from going out of range. */
5192 from = mova;
5193 good_barrier = found_barrier = barrier_before_mova;
5194 }
5195 }
5196
5197 if (found_barrier)
5198 {
5199 if (good_barrier && next_real_insn (found_barrier))
5200 found_barrier = good_barrier;
5201 }
5202 else
5203 {
5204 /* We didn't find a barrier in time to dump our stuff,
5205 so we'll make one. */
5206 rtx_code_label *label = gen_label_rtx ();
5207
5208 /* Don't emit a constant table in the middle of insns for
5209 casesi_worker_2. This is a bit overkill but is enough
5210 because casesi_worker_2 wouldn't appear so frequently. */
5211 if (last_symoff)
5212 from = last_symoff;
5213
5214 /* If we exceeded the range, then we must back up over the last
5215 instruction we looked at. Otherwise, we just need to undo the
5216 NEXT_INSN at the end of the loop. */
5217 if (PREV_INSN (from) != orig
5218 && (count_hi > hi_limit || count_si > si_limit))
5219 from = PREV_INSN (PREV_INSN (from));
5220 else
5221 from = PREV_INSN (from);
5222
5223 /* Don't emit a constant table int the middle of global pointer setting,
5224 since that that would move the addressing base GOT into another table.
5225 We need the first mov instruction before the _GLOBAL_OFFSET_TABLE_
5226 in the pool anyway, so just move up the whole constant pool.
5227
5228 However, avoid doing so when the last single GOT mov is the starting
5229 insn itself. Going past above the start insn would create a negative
5230 offset, causing errors. */
5231 if (last_got && last_got != orig)
5232 from = PREV_INSN (last_got);
5233
5234 /* Don't insert the constant pool table at the position which
5235 may be the landing pad. */
5236 if (flag_exceptions
5237 && CALL_P (from)
5238 && find_reg_note (from, REG_EH_REGION, NULL_RTX))
5239 from = PREV_INSN (from);
5240
5241 /* Walk back to be just before any jump or label.
5242 Putting it before a label reduces the number of times the branch
5243 around the constant pool table will be hit. Putting it before
5244 a jump makes it more likely that the bra delay slot will be
5245 filled. */
5246 while (NOTE_P (from) || JUMP_P (from) || LABEL_P (from))
5247 from = PREV_INSN (from);
5248
5249 if (CALL_P (from))
5250 {
5251 bool sibcall_p = SIBLING_CALL_P (from);
5252
5253 /* If FROM was a sibling call, then we know that control
5254 will not return. In fact, we were guaranteed to hit
5255 a barrier before another real insn.
5256
5257 The jump around the constant pool is unnecessary. It
5258 costs space, but more importantly it confuses dwarf2cfi
5259 generation. */
5260 if (sibcall_p)
5261 return emit_barrier_after (from);
5262 }
5263
5264 from = emit_jump_insn_after (gen_jump (label), from);
5265 JUMP_LABEL (from) = label;
5266 LABEL_NUSES (label) = 1;
5267 found_barrier = emit_barrier_after (from);
5268 emit_label_after (label, found_barrier);
5269 }
5270
5271 return found_barrier;
5272 }
5273
5274 /* If the instruction INSN is implemented by a special function, and we can
5275 positively find the register that is used to call the sfunc, and this
5276 register is not used anywhere else in this instruction - except as the
5277 destination of a set, return this register; else, return 0. */
5278 rtx
5279 sfunc_uses_reg (rtx_insn *insn)
5280 {
5281 int i;
5282 rtx pattern, part, reg_part, reg;
5283
5284 if (!NONJUMP_INSN_P (insn))
5285 return NULL_RTX;
5286 pattern = PATTERN (insn);
5287 if (GET_CODE (pattern) != PARALLEL || get_attr_type (insn) != TYPE_SFUNC)
5288 return NULL_RTX;
5289
5290 for (reg_part = NULL_RTX, i = XVECLEN (pattern, 0) - 1; i >= 1; i--)
5291 {
5292 part = XVECEXP (pattern, 0, i);
5293 if (GET_CODE (part) == USE && GET_MODE (XEXP (part, 0)) == SImode)
5294 reg_part = part;
5295 }
5296 if (! reg_part)
5297 return NULL_RTX;
5298 reg = XEXP (reg_part, 0);
5299 for (int i = XVECLEN (pattern, 0) - 1; i >= 0; i--)
5300 {
5301 part = XVECEXP (pattern, 0, i);
5302 if (part == reg_part || GET_CODE (part) == CLOBBER)
5303 continue;
5304 if (reg_mentioned_p (reg, ((GET_CODE (part) == SET
5305 && REG_P (SET_DEST (part)))
5306 ? SET_SRC (part) : part)))
5307 return NULL_RTX;
5308 }
5309 return reg;
5310 }
5311
5312 /* See if the only way in which INSN uses REG is by calling it, or by
5313 setting it while calling it. Set *SET to a SET rtx if the register
5314 is set by INSN. */
5315 static bool
5316 noncall_uses_reg (rtx reg, rtx_insn *insn, rtx *set)
5317 {
5318 *set = NULL_RTX;
5319
5320 rtx reg2 = sfunc_uses_reg (insn);
5321 if (reg2 && REGNO (reg2) == REGNO (reg))
5322 {
5323 rtx pattern = single_set (insn);
5324 if (pattern
5325 && REG_P (SET_DEST (pattern))
5326 && REGNO (reg) == REGNO (SET_DEST (pattern)))
5327 *set = pattern;
5328 return false;
5329 }
5330 if (!CALL_P (insn))
5331 {
5332 /* We don't use rtx_equal_p because we don't care if the mode is
5333 different. */
5334 rtx pattern = single_set (insn);
5335 if (pattern
5336 && REG_P (SET_DEST (pattern))
5337 && REGNO (reg) == REGNO (SET_DEST (pattern)))
5338 {
5339 rtx par, part;
5340 int i;
5341
5342 *set = pattern;
5343 par = PATTERN (insn);
5344 if (GET_CODE (par) == PARALLEL)
5345 for (i = XVECLEN (par, 0) - 1; i >= 0; i--)
5346 {
5347 part = XVECEXP (par, 0, i);
5348 if (GET_CODE (part) != SET && reg_mentioned_p (reg, part))
5349 return true;
5350 }
5351 return reg_mentioned_p (reg, SET_SRC (pattern));
5352 }
5353
5354 return true;
5355 }
5356
5357 rtx pattern = PATTERN (insn);
5358
5359 if (GET_CODE (pattern) == PARALLEL)
5360 {
5361 for (int i = XVECLEN (pattern, 0) - 1; i >= 1; i--)
5362 if (reg_mentioned_p (reg, XVECEXP (pattern, 0, i)))
5363 return true;
5364 pattern = XVECEXP (pattern, 0, 0);
5365 }
5366
5367 if (GET_CODE (pattern) == SET)
5368 {
5369 if (reg_mentioned_p (reg, SET_DEST (pattern)))
5370 {
5371 /* We don't use rtx_equal_p, because we don't care if the
5372 mode is different. */
5373 if (!REG_P (SET_DEST (pattern))
5374 || REGNO (reg) != REGNO (SET_DEST (pattern)))
5375 return true;
5376
5377 *set = pattern;
5378 }
5379
5380 pattern = SET_SRC (pattern);
5381 }
5382
5383 if (GET_CODE (pattern) != CALL
5384 || !MEM_P (XEXP (pattern, 0))
5385 || ! rtx_equal_p (reg, XEXP (XEXP (pattern, 0), 0)))
5386 return true;
5387
5388 return false;
5389 }
5390
5391 /* Given a X, a pattern of an insn or a part of it, return a mask of used
5392 general registers. Bits 0..15 mean that the respective registers
5393 are used as inputs in the instruction. Bits 16..31 mean that the
5394 registers 0..15, respectively, are used as outputs, or are clobbered.
5395 IS_DEST should be set to 16 if X is the destination of a SET, else to 0. */
5396 int
5397 regs_used (rtx x, int is_dest)
5398 {
5399 enum rtx_code code;
5400 const char *fmt;
5401 int used = 0;
5402
5403 if (! x)
5404 return used;
5405 code = GET_CODE (x);
5406 switch (code)
5407 {
5408 case REG:
5409 if (REGNO (x) < 16)
5410 return (((1 << hard_regno_nregs (0, GET_MODE (x))) - 1)
5411 << (REGNO (x) + is_dest));
5412 return 0;
5413 case SUBREG:
5414 {
5415 rtx y = SUBREG_REG (x);
5416
5417 if (!REG_P (y))
5418 break;
5419 if (REGNO (y) < 16)
5420 return (((1 << hard_regno_nregs (0, GET_MODE (x))) - 1)
5421 << (REGNO (y) +
5422 subreg_regno_offset (REGNO (y),
5423 GET_MODE (y),
5424 SUBREG_BYTE (x),
5425 GET_MODE (x)) + is_dest));
5426 return 0;
5427 }
5428 case SET:
5429 return regs_used (SET_SRC (x), 0) | regs_used (SET_DEST (x), 16);
5430 case RETURN:
5431 /* If there was a return value, it must have been indicated with USE. */
5432 return 0x00ffff00;
5433 case CLOBBER:
5434 is_dest = 1;
5435 break;
5436 case MEM:
5437 is_dest = 0;
5438 break;
5439 case CALL:
5440 used |= 0x00ff00f0;
5441 break;
5442 default:
5443 break;
5444 }
5445
5446 fmt = GET_RTX_FORMAT (code);
5447
5448 for (int i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
5449 {
5450 if (fmt[i] == 'E')
5451 {
5452 for (int j = XVECLEN (x, i) - 1; j >= 0; j--)
5453 used |= regs_used (XVECEXP (x, i, j), is_dest);
5454 }
5455 else if (fmt[i] == 'e')
5456 used |= regs_used (XEXP (x, i), is_dest);
5457 }
5458 return used;
5459 }
5460
5461 /* Create an instruction that prevents redirection of a conditional branch
5462 to the destination of the JUMP with address ADDR.
5463 If the branch needs to be implemented as an indirect jump, try to find
5464 a scratch register for it.
5465 If NEED_BLOCK is 0, don't do anything unless we need a scratch register.
5466 If any preceding insn that doesn't fit into a delay slot is good enough,
5467 pass 1. Pass 2 if a definite blocking insn is needed.
5468 -1 is used internally to avoid deep recursion.
5469 If a blocking instruction is made or recognized, return it. */
5470 static rtx_insn *
5471 gen_block_redirect (rtx_insn *jump, int addr, int need_block)
5472 {
5473 int dead = 0;
5474 rtx_insn *prev = prev_nonnote_insn (jump);
5475
5476 /* First, check if we already have an instruction that satisfies our need. */
5477 if (prev && NONJUMP_INSN_P (prev) && ! prev->deleted ())
5478 {
5479 if (INSN_CODE (prev) == CODE_FOR_indirect_jump_scratch)
5480 return prev;
5481 if (GET_CODE (PATTERN (prev)) == USE
5482 || GET_CODE (PATTERN (prev)) == CLOBBER
5483 || get_attr_in_delay_slot (prev) == IN_DELAY_SLOT_YES)
5484 prev = jump;
5485 else if ((need_block &= ~1) < 0)
5486 return prev;
5487 else if (recog_memoized (prev) == CODE_FOR_block_branch_redirect)
5488 need_block = 0;
5489 }
5490 if (GET_CODE (PATTERN (jump)) == RETURN)
5491 {
5492 if (! need_block)
5493 return prev;
5494 /* Reorg even does nasty things with return insns that cause branches
5495 to go out of range - see find_end_label and callers. */
5496 return emit_insn_before (gen_block_branch_redirect (const0_rtx) , jump);
5497 }
5498 /* We can't use JUMP_LABEL here because it might be undefined
5499 when not optimizing. */
5500 rtx dest = XEXP (SET_SRC (PATTERN (jump)), 0);
5501 /* If the branch is out of range, try to find a scratch register for it. */
5502 if (optimize
5503 && (INSN_ADDRESSES (INSN_UID (dest)) - addr + (unsigned) 4092
5504 > 4092 + 4098))
5505 {
5506 rtx_insn *scan;
5507 /* Don't look for the stack pointer as a scratch register,
5508 it would cause trouble if an interrupt occurred. */
5509 unsigned attempt = 0x7fff, used;
5510 int jump_left = flag_expensive_optimizations + 1;
5511
5512 /* It is likely that the most recent eligible instruction is wanted for
5513 the delay slot. Therefore, find out which registers it uses, and
5514 try to avoid using them. */
5515
5516 for (scan = jump; (scan = PREV_INSN (scan)); )
5517 {
5518 if (scan->deleted ())
5519 continue;
5520 rtx_code code = GET_CODE (scan);
5521 if (code == CODE_LABEL || code == JUMP_INSN)
5522 break;
5523 if (code == INSN
5524 && GET_CODE (PATTERN (scan)) != USE
5525 && GET_CODE (PATTERN (scan)) != CLOBBER
5526 && get_attr_in_delay_slot (scan) == IN_DELAY_SLOT_YES)
5527 {
5528 attempt &= ~regs_used (PATTERN (scan), 0);
5529 break;
5530 }
5531 }
5532 for (used = dead = 0, scan = JUMP_LABEL_AS_INSN (jump);
5533 (scan = NEXT_INSN (scan)); )
5534 {
5535 if (scan->deleted ())
5536 continue;
5537 rtx_code code = GET_CODE (scan);
5538 if (INSN_P (scan))
5539 {
5540 used |= regs_used (PATTERN (scan), 0);
5541 if (code == CALL_INSN)
5542 used |= regs_used (CALL_INSN_FUNCTION_USAGE (scan), 0);
5543 dead |= (used >> 16) & ~used;
5544 if (dead & attempt)
5545 {
5546 dead &= attempt;
5547 break;
5548 }
5549 if (code == JUMP_INSN)
5550 {
5551 if (jump_left-- && simplejump_p (scan))
5552 scan = JUMP_LABEL_AS_INSN (scan);
5553 else
5554 break;
5555 }
5556 }
5557 }
5558 /* Mask out the stack pointer again, in case it was
5559 the only 'free' register we have found. */
5560 dead &= 0x7fff;
5561 }
5562 /* If the immediate destination is still in range, check for possible
5563 threading with a jump beyond the delay slot insn.
5564 Don't check if we are called recursively; the jump has been or will be
5565 checked in a different invocation then. */
5566
5567 else if (optimize && need_block >= 0)
5568 {
5569 rtx_insn *next = next_active_insn (as_a<rtx_insn *> (dest));
5570 next = next_active_insn (next);
5571 if (next && JUMP_P (next)
5572 && GET_CODE (PATTERN (next)) == SET
5573 && recog_memoized (next) == CODE_FOR_jump_compact)
5574 {
5575 dest = JUMP_LABEL (next);
5576 if (dest
5577 && (INSN_ADDRESSES (INSN_UID (dest)) - addr + (unsigned) 4092
5578 > 4092 + 4098))
5579 gen_block_redirect (next, INSN_ADDRESSES (INSN_UID (next)), -1);
5580 }
5581 }
5582
5583 if (dead)
5584 {
5585 rtx reg = gen_rtx_REG (SImode, exact_log2 (dead & -dead));
5586
5587 /* It would be nice if we could convert the jump into an indirect
5588 jump / far branch right now, and thus exposing all constituent
5589 instructions to further optimization. However, reorg uses
5590 simplejump_p to determine if there is an unconditional jump where
5591 it should try to schedule instructions from the target of the
5592 branch; simplejump_p fails for indirect jumps even if they have
5593 a JUMP_LABEL. */
5594 rtx_insn *insn = emit_insn_before (gen_indirect_jump_scratch
5595 (reg, GEN_INT (unspec_bbr_uid++)),
5596 jump);
5597 /* ??? We would like this to have the scope of the jump, but that
5598 scope will change when a delay slot insn of an inner scope is added.
5599 Hence, after delay slot scheduling, we'll have to expect
5600 NOTE_INSN_BLOCK_END notes between the indirect_jump_scratch and
5601 the jump. */
5602
5603 INSN_LOCATION (insn) = INSN_LOCATION (jump);
5604 INSN_CODE (insn) = CODE_FOR_indirect_jump_scratch;
5605 return insn;
5606 }
5607 else if (need_block)
5608 /* We can't use JUMP_LABEL here because it might be undefined
5609 when not optimizing. */
5610 return emit_insn_before (gen_block_branch_redirect
5611 (GEN_INT (unspec_bbr_uid++)),
5612 jump);
5613 return prev;
5614 }
5615
5616 #define CONDJUMP_MIN -252
5617 #define CONDJUMP_MAX 262
5618 struct far_branch
5619 {
5620 /* A label (to be placed) in front of the jump
5621 that jumps to our ultimate destination. */
5622 rtx_insn *near_label;
5623 /* Where we are going to insert it if we cannot move the jump any farther,
5624 or the jump itself if we have picked up an existing jump. */
5625 rtx_insn *insert_place;
5626 /* The ultimate destination. */
5627 rtx_insn *far_label;
5628 struct far_branch *prev;
5629 /* If the branch has already been created, its address;
5630 else the address of its first prospective user. */
5631 int address;
5632 };
5633
5634 enum mdep_reorg_phase_e mdep_reorg_phase;
5635
5636 static void
5637 gen_far_branch (struct far_branch *bp)
5638 {
5639 rtx_insn *insn = bp->insert_place;
5640 rtx_jump_insn *jump;
5641 rtx_code_label *label = gen_label_rtx ();
5642
5643 emit_label_after (label, insn);
5644 if (bp->far_label)
5645 {
5646 jump = emit_jump_insn_after (gen_jump (bp->far_label), insn);
5647 LABEL_NUSES (bp->far_label)++;
5648 }
5649 else
5650 jump = emit_jump_insn_after (gen_return (), insn);
5651
5652 /* Emit a barrier so that reorg knows that any following instructions
5653 are not reachable via a fall-through path.
5654 But don't do this when not optimizing, since we wouldn't suppress the
5655 alignment for the barrier then, and could end up with out-of-range
5656 pc-relative loads. */
5657 if (optimize)
5658 emit_barrier_after (jump);
5659 emit_label_after (bp->near_label, insn);
5660
5661 if (bp->far_label)
5662 JUMP_LABEL (jump) = bp->far_label;
5663 else
5664 {
5665 rtx pat = PATTERN (jump);
5666 gcc_assert (ANY_RETURN_P (pat));
5667 JUMP_LABEL (jump) = pat;
5668 }
5669
5670 bool ok = invert_jump (as_a <rtx_jump_insn *> (insn), label, 1);
5671 gcc_assert (ok);
5672
5673 /* If we are branching around a jump (rather than a return), prevent
5674 reorg from using an insn from the jump target as the delay slot insn -
5675 when reorg did this, it pessimized code (we rather hide the delay slot)
5676 and it could cause branches to go out of range. */
5677 if (bp->far_label)
5678 (emit_insn_after
5679 (gen_stuff_delay_slot
5680 (GEN_INT (unspec_bbr_uid++),
5681 GEN_INT (recog_memoized (insn) == CODE_FOR_branch_false)),
5682 insn));
5683 /* Prevent reorg from undoing our splits. */
5684 gen_block_redirect (jump, bp->address += 2, 2);
5685 }
5686
5687 /* Fix up ADDR_DIFF_VECs. */
5688 void
5689 fixup_addr_diff_vecs (rtx_insn *first)
5690 {
5691 rtx_insn *insn;
5692
5693 for (insn = first; insn; insn = NEXT_INSN (insn))
5694 {
5695 rtx vec_lab, pat, prevpat, x, braf_label;
5696 rtx_insn *prev;
5697
5698 if (! JUMP_TABLE_DATA_P (insn)
5699 || GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
5700 continue;
5701 pat = PATTERN (insn);
5702 vec_lab = XEXP (XEXP (pat, 0), 0);
5703
5704 /* Search the matching casesi_jump_2. */
5705 for (prev = as_a <rtx_insn *> (vec_lab); ; prev = PREV_INSN (prev))
5706 {
5707 if (!JUMP_P (prev))
5708 continue;
5709 prevpat = PATTERN (prev);
5710 if (GET_CODE (prevpat) != PARALLEL || XVECLEN (prevpat, 0) != 2)
5711 continue;
5712 x = XVECEXP (prevpat, 0, 1);
5713 if (GET_CODE (x) != USE)
5714 continue;
5715 x = XEXP (x, 0);
5716 if (GET_CODE (x) == LABEL_REF && XEXP (x, 0) == vec_lab)
5717 break;
5718 }
5719 /* FIXME: This is a bug in the optimizer, but it seems harmless
5720 to just avoid panicing. */
5721 if (!prev)
5722 continue;
5723
5724 /* Emit the reference label of the braf where it belongs, right after
5725 the casesi_jump_2 (i.e. braf). */
5726 braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);
5727 emit_label_after (as_a <rtx_insn *> (braf_label), prev);
5728
5729 /* Fix up the ADDR_DIF_VEC to be relative
5730 to the reference address of the braf. */
5731 XEXP (XEXP (pat, 0), 0) = braf_label;
5732 }
5733 }
5734
5735 /* BARRIER_OR_LABEL is either a BARRIER or a CODE_LABEL immediately following
5736 a barrier. Return the base 2 logarithm of the desired alignment. */
5737 int
5738 barrier_align (rtx_insn *barrier_or_label)
5739 {
5740 if (! barrier_or_label)
5741 return 0;
5742
5743 if (LABEL_P (barrier_or_label)
5744 && NEXT_INSN (barrier_or_label)
5745 && JUMP_TABLE_DATA_P (NEXT_INSN (barrier_or_label)))
5746 return 2;
5747
5748 if (BARRIER_P (barrier_or_label)
5749 && PREV_INSN (barrier_or_label)
5750 && JUMP_TABLE_DATA_P (PREV_INSN (barrier_or_label)))
5751 {
5752 rtx pat = PATTERN (PREV_INSN (barrier_or_label));
5753 /* If this is a very small table, we want to keep the alignment after
5754 the table to the minimum for proper code alignment. */
5755 return ((optimize_size
5756 || ((unsigned) XVECLEN (pat, 1) * GET_MODE_SIZE (GET_MODE (pat))
5757 <= (unsigned) 1 << (CACHE_LOG - 2)))
5758 ? 1 : align_jumps.levels[0].log);
5759 }
5760
5761 rtx_insn *next = next_active_insn (barrier_or_label);
5762
5763 if (! next)
5764 return 0;
5765
5766 rtx pat = PATTERN (next);
5767
5768 if (GET_CODE (pat) == UNSPEC_VOLATILE && XINT (pat, 1) == UNSPECV_ALIGN)
5769 /* This is a barrier in front of a constant table. */
5770 return 0;
5771
5772 if (optimize_size)
5773 return 0;
5774
5775 if (! TARGET_SH2 || ! optimize)
5776 return align_jumps.levels[0].log;
5777
5778 /* When fixing up pcloads, a constant table might be inserted just before
5779 the basic block that ends with the barrier. Thus, we can't trust the
5780 instruction lengths before that. */
5781 if (mdep_reorg_phase > SH_FIXUP_PCLOAD)
5782 {
5783 /* Check if there is an immediately preceding branch to the insn beyond
5784 the barrier. We must weight the cost of discarding useful information
5785 from the current cache line when executing this branch and there is
5786 an alignment, against that of fetching unneeded insn in front of the
5787 branch target when there is no alignment. */
5788
5789 /* There are two delay_slot cases to consider. One is the simple case
5790 where the preceding branch is to the insn beyond the barrier (simple
5791 delay slot filling), and the other is where the preceding branch has
5792 a delay slot that is a duplicate of the insn after the barrier
5793 (fill_eager_delay_slots) and the branch is to the insn after the insn
5794 after the barrier. */
5795
5796 int slot, credit;
5797 bool jump_to_next = false;
5798
5799 /* Skip to the insn before the JUMP_INSN before the barrier under
5800 investigation. */
5801 rtx_insn *prev = prev_real_insn (prev_active_insn (barrier_or_label));
5802
5803 for (slot = 2, credit = (1 << (CACHE_LOG - 2)) + 2;
5804 credit >= 0 && prev && NONJUMP_INSN_P (prev);
5805 prev = prev_real_insn (prev))
5806 {
5807 jump_to_next = false;
5808 if (GET_CODE (PATTERN (prev)) == USE
5809 || GET_CODE (PATTERN (prev)) == CLOBBER)
5810 continue;
5811 if (rtx_sequence *prev_seq = dyn_cast <rtx_sequence *> (PATTERN (prev)))
5812 {
5813 prev = prev_seq->insn (1);
5814 if (INSN_UID (prev) == INSN_UID (next))
5815 {
5816 /* Delay slot was filled with insn at jump target. */
5817 jump_to_next = true;
5818 continue;
5819 }
5820 }
5821
5822 if (slot &&
5823 get_attr_in_delay_slot (prev) == IN_DELAY_SLOT_YES)
5824 slot = 0;
5825 credit -= get_attr_length (prev);
5826 }
5827 if (prev && jump_to_label_p (prev))
5828 {
5829 rtx_insn *x;
5830 if (jump_to_next
5831 || next_real_insn (JUMP_LABEL_AS_INSN (prev)) == next
5832 /* If relax_delay_slots() decides NEXT was redundant
5833 with some previous instruction, it will have
5834 redirected PREV's jump to the following insn. */
5835 || JUMP_LABEL (prev) == next_nonnote_insn (next)
5836 /* There is no upper bound on redundant instructions
5837 that might have been skipped, but we must not put an
5838 alignment where none had been before. */
5839 || (x = (NEXT_INSN (NEXT_INSN (PREV_INSN (prev)))),
5840 (INSN_P (x)
5841 && (INSN_CODE (x) == CODE_FOR_block_branch_redirect
5842 || INSN_CODE (x) == CODE_FOR_indirect_jump_scratch
5843 || INSN_CODE (x) == CODE_FOR_stuff_delay_slot))))
5844 {
5845 rtx pat = PATTERN (prev);
5846 if (GET_CODE (pat) == PARALLEL)
5847 pat = XVECEXP (pat, 0, 0);
5848 if (credit - slot >= (GET_CODE (SET_SRC (pat)) == PC ? 2 : 0))
5849 return 0;
5850 }
5851 }
5852 }
5853
5854 return align_jumps.levels[0].log;
5855 }
5856
5857 /* If we are inside a phony loop, almost any kind of label can turn up as the
5858 first one in the loop. Aligning a braf label causes incorrect switch
5859 destination addresses; we can detect braf labels because they are
5860 followed by a BARRIER.
5861 Applying loop alignment to small constant or switch tables is a waste
5862 of space, so we suppress this too. */
5863 int
5864 sh_loop_align (rtx_insn *label)
5865 {
5866 rtx_insn *next = label;
5867
5868 if (! optimize || optimize_size)
5869 return 0;
5870
5871 do
5872 next = next_nonnote_insn (next);
5873 while (next && LABEL_P (next));
5874
5875 if (! next
5876 || ! INSN_P (next)
5877 || recog_memoized (next) == CODE_FOR_consttable_2)
5878 return 0;
5879
5880 return align_loops.levels[0].log;
5881 }
5882
5883 /* Do a final pass over the function, just before delayed branch
5884 scheduling. */
5885 static void
5886 sh_reorg (void)
5887 {
5888 rtx_insn *first, *insn, *mova = NULL;
5889 int num_mova;
5890 rtx r0_rtx = gen_rtx_REG (Pmode, 0);
5891 rtx r0_inc_rtx = gen_rtx_POST_INC (Pmode, r0_rtx);
5892
5893 first = get_insns ();
5894 max_labelno_before_reorg = max_label_num ();
5895
5896 /* We must split call insns before introducing `mova's. If we're
5897 optimizing, they'll have already been split. Otherwise, make
5898 sure we don't split them too late. */
5899 if (! optimize)
5900 split_all_insns_noflow ();
5901
5902 /* If relaxing, generate pseudo-ops to associate function calls with
5903 the symbols they call. It does no harm to not generate these
5904 pseudo-ops. However, when we can generate them, it enables the
5905 linker to potentially relax the jsr to a bsr, and eliminate the
5906 register load and, possibly, the constant pool entry. */
5907
5908 mdep_reorg_phase = SH_INSERT_USES_LABELS;
5909 if (TARGET_RELAX)
5910 {
5911 /* Remove all REG_LABEL_OPERAND notes. We want to use them for our
5912 own purposes. This works because none of the remaining passes
5913 need to look at them.
5914
5915 ??? But it may break in the future. We should use a machine
5916 dependent REG_NOTE, or some other approach entirely. */
5917 for (insn = first; insn; insn = NEXT_INSN (insn))
5918 {
5919 if (INSN_P (insn))
5920 {
5921 rtx note;
5922
5923 while ((note = find_reg_note (insn, REG_LABEL_OPERAND,
5924 NULL_RTX)) != 0)
5925 remove_note (insn, note);
5926 }
5927 }
5928
5929 for (insn = first; insn; insn = NEXT_INSN (insn))
5930 {
5931 rtx pattern, reg, set, dies;
5932 rtx_code_label *label;
5933 rtx_insn *link, *scan;
5934 int rescan = 0, foundinsn = 0;
5935
5936 if (CALL_P (insn))
5937 {
5938 pattern = PATTERN (insn);
5939
5940 if (GET_CODE (pattern) == PARALLEL)
5941 pattern = XVECEXP (pattern, 0, 0);
5942 if (GET_CODE (pattern) == SET)
5943 pattern = SET_SRC (pattern);
5944
5945 if (GET_CODE (pattern) != CALL
5946 || !MEM_P (XEXP (pattern, 0)))
5947 continue;
5948
5949 reg = XEXP (XEXP (pattern, 0), 0);
5950 }
5951 else
5952 {
5953 reg = sfunc_uses_reg (insn);
5954 if (! reg)
5955 continue;
5956 }
5957
5958 if (!REG_P (reg))
5959 continue;
5960
5961 /* Try scanning backward to find where the register is set. */
5962 link = NULL;
5963 for (scan = PREV_INSN (insn);
5964 scan && !LABEL_P (scan);
5965 scan = PREV_INSN (scan))
5966 {
5967 if (! INSN_P (scan))
5968 continue;
5969
5970 if (! reg_mentioned_p (reg, scan))
5971 continue;
5972
5973 if (noncall_uses_reg (reg, scan, &set))
5974 break;
5975
5976 if (set)
5977 {
5978 link = scan;
5979 break;
5980 }
5981 }
5982
5983 if (! link)
5984 continue;
5985
5986 /* The register is set at LINK. */
5987
5988 /* We can only optimize the function call if the register is
5989 being set to a symbol. In theory, we could sometimes
5990 optimize calls to a constant location, but the assembler
5991 and linker do not support that at present. */
5992 if (GET_CODE (SET_SRC (set)) != SYMBOL_REF
5993 && GET_CODE (SET_SRC (set)) != LABEL_REF)
5994 continue;
5995
5996 /* Scan forward from LINK to the place where REG dies, and
5997 make sure that the only insns which use REG are
5998 themselves function calls. */
5999
6000 /* ??? This doesn't work for call targets that were allocated
6001 by reload, since there may not be a REG_DEAD note for the
6002 register. */
6003
6004 dies = NULL_RTX;
6005 for (scan = NEXT_INSN (link); scan; scan = NEXT_INSN (scan))
6006 {
6007 rtx scanset;
6008
6009 /* Don't try to trace forward past a CODE_LABEL if we haven't
6010 seen INSN yet. Ordinarily, we will only find the setting insn
6011 if it is in the same basic block. However,
6012 cross-jumping can insert code labels in between the load and
6013 the call, and can result in situations where a single call
6014 insn may have two targets depending on where we came from. */
6015
6016 if (LABEL_P (scan) && ! foundinsn)
6017 break;
6018
6019 if (! INSN_P (scan))
6020 continue;
6021
6022 /* Don't try to trace forward past a JUMP. To optimize
6023 safely, we would have to check that all the
6024 instructions at the jump destination did not use REG. */
6025
6026 if (JUMP_P (scan))
6027 break;
6028
6029 if (! reg_mentioned_p (reg, scan))
6030 continue;
6031
6032 if (noncall_uses_reg (reg, scan, &scanset))
6033 break;
6034
6035 if (scan == insn)
6036 foundinsn = 1;
6037
6038 if (scan != insn
6039 && (CALL_P (scan) || sfunc_uses_reg (scan)))
6040 {
6041 /* There is a function call to this register other
6042 than the one we are checking. If we optimize
6043 this call, we need to rescan again below. */
6044 rescan = 1;
6045 }
6046
6047 /* ??? We shouldn't have to worry about SCANSET here.
6048 We should just be able to check for a REG_DEAD note
6049 on a function call. However, the REG_DEAD notes are
6050 apparently not dependable around libcalls; c-torture
6051 execute/920501-2 is a test case. If SCANSET is set,
6052 then this insn sets the register, so it must have
6053 died earlier. Unfortunately, this will only handle
6054 the cases in which the register is, in fact, set in a
6055 later insn. */
6056
6057 /* ??? We shouldn't have to use FOUNDINSN here.
6058 This dates back to when we used LOG_LINKS to find
6059 the most recent insn which sets the register. */
6060
6061 if (foundinsn
6062 && (scanset
6063 || find_reg_note (scan, REG_DEAD, reg)))
6064 {
6065 dies = scan;
6066 break;
6067 }
6068 }
6069
6070 if (! dies)
6071 {
6072 /* Either there was a branch, or some insn used REG
6073 other than as a function call address. */
6074 continue;
6075 }
6076
6077 /* Create a code label, and put it in a REG_LABEL_OPERAND note
6078 on the insn which sets the register, and on each call insn
6079 which uses the register. In final_prescan_insn we look for
6080 the REG_LABEL_OPERAND notes, and output the appropriate label
6081 or pseudo-op. */
6082
6083 label = gen_label_rtx ();
6084 add_reg_note (link, REG_LABEL_OPERAND, label);
6085 add_reg_note (insn, REG_LABEL_OPERAND, label);
6086 if (rescan)
6087 {
6088 scan = link;
6089 do
6090 {
6091 rtx reg2;
6092
6093 scan = NEXT_INSN (scan);
6094 if (scan != insn
6095 && ((CALL_P (scan)
6096 && reg_mentioned_p (reg, scan))
6097 || ((reg2 = sfunc_uses_reg (scan))
6098 && REGNO (reg2) == REGNO (reg))))
6099 add_reg_note (scan, REG_LABEL_OPERAND, label);
6100 }
6101 while (scan != dies);
6102 }
6103 }
6104 }
6105
6106 if (TARGET_SH2)
6107 fixup_addr_diff_vecs (first);
6108
6109 if (optimize)
6110 {
6111 mdep_reorg_phase = SH_SHORTEN_BRANCHES0;
6112 shorten_branches (first);
6113 }
6114
6115 /* Scan the function looking for move instructions which have to be
6116 changed to pc-relative loads and insert the literal tables. */
6117 mdep_reorg_phase = SH_FIXUP_PCLOAD;
6118 for (insn = first, num_mova = 0; insn; insn = NEXT_INSN (insn))
6119 {
6120 if (mova_p (insn))
6121 {
6122 /* ??? basic block reordering can move a switch table dispatch
6123 below the switch table. Check if that has happened.
6124 We only have the addresses available when optimizing; but then,
6125 this check shouldn't be needed when not optimizing. */
6126 if (!untangle_mova (&num_mova, &mova, insn))
6127 {
6128 insn = mova;
6129 num_mova = 0;
6130 }
6131 }
6132 else if (JUMP_TABLE_DATA_P (insn)
6133 && GET_CODE (PATTERN (insn)) == ADDR_DIFF_VEC
6134 && num_mova
6135 /* ??? loop invariant motion can also move a mova out of a
6136 loop. Since loop does this code motion anyway, maybe we
6137 should wrap UNSPEC_MOVA into a CONST, so that reload can
6138 move it back. */
6139 && ((num_mova > 1
6140 && GET_MODE (prev_nonnote_insn (insn)) == VOIDmode)
6141 || (prev_nonnote_insn (insn)
6142 == XEXP (MOVA_LABELREF (mova), 0))))
6143 {
6144 rtx_insn *scan;
6145 int total;
6146
6147 num_mova--;
6148
6149 /* Some code might have been inserted between the mova and
6150 its ADDR_DIFF_VEC. Check if the mova is still in range. */
6151 for (scan = mova, total = 0; scan != insn; scan = NEXT_INSN (scan))
6152 total += get_attr_length (scan);
6153
6154 /* range of mova is 1020, add 4 because pc counts from address of
6155 second instruction after this one, subtract 2 in case pc is 2
6156 byte aligned. Possible alignment needed for the ADDR_DIFF_VEC
6157 cancels out with alignment effects of the mova itself. */
6158 if (total > 1022)
6159 {
6160 /* Change the mova into a load, and restart scanning
6161 there. broken_move will then return true for mova. */
6162 fixup_mova (mova);
6163 insn = mova;
6164 }
6165 }
6166 if (broken_move (insn)
6167 || (NONJUMP_INSN_P (insn)
6168 && recog_memoized (insn) == CODE_FOR_casesi_worker_2))
6169 {
6170 rtx_insn *scan;
6171 /* Scan ahead looking for a barrier to stick the constant table
6172 behind. */
6173 rtx_insn *barrier = find_barrier (num_mova, mova, insn);
6174 rtx_insn *last_float_move = NULL;
6175 rtx last_float = 0, *last_float_addr = NULL;
6176 int need_aligned_label = 0;
6177
6178 if (num_mova && ! mova_p (mova))
6179 {
6180 /* find_barrier had to change the first mova into a
6181 pcload; thus, we have to start with this new pcload. */
6182 insn = mova;
6183 num_mova = 0;
6184 }
6185 /* Now find all the moves between the points and modify them. */
6186 for (scan = insn; scan != barrier; scan = NEXT_INSN (scan))
6187 {
6188 if (LABEL_P (scan))
6189 last_float = 0;
6190 if (NONJUMP_INSN_P (scan)
6191 && recog_memoized (scan) == CODE_FOR_casesi_worker_2)
6192 need_aligned_label = 1;
6193 if (broken_move (scan))
6194 {
6195 rtx *patp = &PATTERN (scan), pat = *patp;
6196 rtx src, dst;
6197 rtx lab;
6198 rtx newsrc;
6199 machine_mode mode;
6200
6201 if (GET_CODE (pat) == PARALLEL)
6202 patp = &XVECEXP (pat, 0, 0), pat = *patp;
6203 src = SET_SRC (pat);
6204 dst = SET_DEST (pat);
6205 mode = GET_MODE (dst);
6206
6207 if (mode == SImode && satisfies_constraint_I16 (src)
6208 && REGNO (dst) != FPUL_REG)
6209 {
6210 int offset = 0;
6211
6212 mode = HImode;
6213 while (GET_CODE (dst) == SUBREG)
6214 {
6215 offset += subreg_regno_offset (REGNO (SUBREG_REG (dst)),
6216 GET_MODE (SUBREG_REG (dst)),
6217 SUBREG_BYTE (dst),
6218 GET_MODE (dst));
6219 dst = SUBREG_REG (dst);
6220 }
6221 dst = gen_rtx_REG (HImode, REGNO (dst) + offset);
6222 }
6223 if (REG_P (dst) && FP_ANY_REGISTER_P (REGNO (dst)))
6224 {
6225 /* This must be an insn that clobbers r0. */
6226 rtx *clobberp = &XVECEXP (PATTERN (scan), 0,
6227 XVECLEN (PATTERN (scan), 0)
6228 - 1);
6229 rtx clobber = *clobberp;
6230
6231 gcc_assert (GET_CODE (clobber) == CLOBBER
6232 && rtx_equal_p (XEXP (clobber, 0), r0_rtx));
6233
6234 if (last_float
6235 && reg_set_between_p (r0_rtx, last_float_move, scan))
6236 last_float = 0;
6237 lab = add_constant (src, mode, last_float);
6238 if (lab)
6239 emit_insn_before (gen_mova (lab), scan);
6240 else
6241 {
6242 /* There will be a REG_UNUSED note for r0 on
6243 LAST_FLOAT_MOVE; we have to change it to REG_INC,
6244 lest reorg:mark_target_live_regs will not
6245 consider r0 to be used, and we end up with delay
6246 slot insn in front of SCAN that clobbers r0. */
6247 rtx note
6248 = find_regno_note (last_float_move, REG_UNUSED, 0);
6249
6250 /* If we are not optimizing, then there may not be
6251 a note. */
6252 if (note)
6253 PUT_REG_NOTE_KIND (note, REG_INC);
6254
6255 *last_float_addr = r0_inc_rtx;
6256 }
6257 last_float_move = scan;
6258 last_float = src;
6259 newsrc = gen_const_mem (mode,
6260 (((TARGET_SH4 && ! TARGET_FMOVD)
6261 || REGNO (dst) == FPUL_REG)
6262 ? r0_inc_rtx
6263 : r0_rtx));
6264 last_float_addr = &XEXP (newsrc, 0);
6265
6266 /* Remove the clobber of r0. */
6267 *clobberp = gen_rtx_CLOBBER (GET_MODE (clobber),
6268 gen_rtx_SCRATCH (Pmode));
6269 }
6270 /* This is a mova needing a label. Create it. */
6271 else if (GET_CODE (src) == UNSPEC
6272 && XINT (src, 1) == UNSPEC_MOVA
6273 && GET_CODE (XVECEXP (src, 0, 0)) == CONST)
6274 {
6275 lab = add_constant (XVECEXP (src, 0, 0), mode, 0);
6276 newsrc = gen_rtx_LABEL_REF (VOIDmode, lab);
6277 newsrc = gen_rtx_UNSPEC (SImode,
6278 gen_rtvec (1, newsrc),
6279 UNSPEC_MOVA);
6280 }
6281 else if (GET_CODE (src) == UNSPEC_VOLATILE
6282 && XINT (src, 1) == UNSPECV_SP_SWITCH_B)
6283 {
6284 newsrc = XVECEXP (src, 0, 0);
6285 XVECEXP (src, 0, 0) = gen_const_mem (mode, newsrc);
6286 INSN_CODE (scan) = -1;
6287 continue;
6288 }
6289 else
6290 {
6291 lab = add_constant (src, mode, 0);
6292 newsrc = gen_rtx_LABEL_REF (VOIDmode, lab);
6293 newsrc = gen_const_mem (mode, newsrc);
6294 }
6295 *patp = gen_rtx_SET (dst, newsrc);
6296 INSN_CODE (scan) = -1;
6297 }
6298 }
6299 dump_table (need_aligned_label ? insn : 0, barrier);
6300 insn = barrier;
6301 }
6302 }
6303 label_ref_list_d_pool.release ();
6304 for (insn = first; insn; insn = NEXT_INSN (insn))
6305 PUT_MODE (insn, VOIDmode);
6306
6307 mdep_reorg_phase = SH_SHORTEN_BRANCHES1;
6308 INSN_ADDRESSES_FREE ();
6309 split_branches (first);
6310
6311 /* The INSN_REFERENCES_ARE_DELAYED in sh.h is problematic because it
6312 also has an effect on the register that holds the address of the sfunc.
6313 Insert an extra dummy insn in front of each sfunc that pretends to
6314 use this register. */
6315 if (flag_delayed_branch)
6316 {
6317 for (insn = first; insn; insn = NEXT_INSN (insn))
6318 {
6319 rtx reg = sfunc_uses_reg (insn);
6320
6321 if (! reg)
6322 continue;
6323 emit_insn_before (gen_use_sfunc_addr (reg), insn);
6324 }
6325 }
6326 mdep_reorg_phase = SH_AFTER_MDEP_REORG;
6327 }
6328
6329 /* Return the UID of the insn that follows the specified label. */
6330 int
6331 get_dest_uid (rtx_insn *label, int max_uid)
6332 {
6333 rtx_insn *dest = next_real_insn (label);
6334
6335 if (! dest)
6336 /* This can happen for an undefined label. */
6337 return 0;
6338 int dest_uid = INSN_UID (dest);
6339 /* If this is a newly created branch redirection blocking instruction,
6340 we cannot index the branch_uid or insn_addresses arrays with its
6341 uid. But then, we won't need to, because the actual destination is
6342 the following branch. */
6343 while (dest_uid >= max_uid)
6344 {
6345 dest = NEXT_INSN (dest);
6346 dest_uid = INSN_UID (dest);
6347 }
6348 if (JUMP_P (dest) && GET_CODE (PATTERN (dest)) == RETURN)
6349 return 0;
6350 return dest_uid;
6351 }
6352
6353 /* Split condbranches that are out of range. Also add clobbers for
6354 scratch registers that are needed in far jumps.
6355 We do this before delay slot scheduling, so that it can take our
6356 newly created instructions into account. It also allows us to
6357 find branches with common targets more easily. */
6358 static void
6359 split_branches (rtx_insn *first)
6360 {
6361 rtx_insn *insn;
6362 struct far_branch **uid_branch, *far_branch_list = 0;
6363 int max_uid = get_max_uid ();
6364 int ok;
6365
6366 /* Find out which branches are out of range. */
6367 shorten_branches (first);
6368
6369 uid_branch = (struct far_branch **) alloca (max_uid * sizeof *uid_branch);
6370 memset ((char *) uid_branch, 0, max_uid * sizeof *uid_branch);
6371
6372 for (insn = first; insn; insn = NEXT_INSN (insn))
6373 if (! INSN_P (insn))
6374 continue;
6375 else if (insn->deleted ())
6376 {
6377 /* Shorten_branches would split this instruction again,
6378 so transform it into a note. */
6379 SET_INSN_DELETED (insn);
6380 }
6381 else if (JUMP_P (insn))
6382 {
6383 enum attr_type type = get_attr_type (insn);
6384 if (type == TYPE_CBRANCH)
6385 {
6386 rtx_insn *next, *beyond;
6387
6388 if (get_attr_length (insn) > 4)
6389 {
6390 rtx src = SET_SRC (PATTERN (insn));
6391 rtx_insn *olabel = safe_as_a <rtx_insn *> (XEXP (XEXP (src, 1), 0));
6392 int addr = INSN_ADDRESSES (INSN_UID (insn));
6393 rtx_insn *label = 0;
6394 int dest_uid = get_dest_uid (olabel, max_uid);
6395 struct far_branch *bp = uid_branch[dest_uid];
6396
6397 /* redirect_jump needs a valid JUMP_LABEL, and it might delete
6398 the label if the LABEL_NUSES count drops to zero. There is
6399 always a jump_optimize pass that sets these values, but it
6400 proceeds to delete unreferenced code, and then if not
6401 optimizing, to un-delete the deleted instructions, thus
6402 leaving labels with too low uses counts. */
6403 if (! optimize)
6404 {
6405 JUMP_LABEL (insn) = olabel;
6406 LABEL_NUSES (olabel)++;
6407 }
6408 if (! bp)
6409 {
6410 bp = (struct far_branch *) alloca (sizeof *bp);
6411 uid_branch[dest_uid] = bp;
6412 bp->prev = far_branch_list;
6413 far_branch_list = bp;
6414 bp->far_label = as_a <rtx_insn *> (
6415 XEXP (XEXP (SET_SRC (PATTERN (insn)), 1),
6416 0));
6417 LABEL_NUSES (bp->far_label)++;
6418 }
6419 else
6420 {
6421 label = bp->near_label;
6422 if (! label && bp->address - addr >= CONDJUMP_MIN)
6423 {
6424 rtx_insn *block = bp->insert_place;
6425
6426 if (GET_CODE (PATTERN (block)) == RETURN)
6427 block = PREV_INSN (block);
6428 else
6429 block = gen_block_redirect (block,
6430 bp->address, 2);
6431 label = emit_label_after (gen_label_rtx (),
6432 PREV_INSN (block));
6433 bp->near_label = label;
6434 }
6435 else if (label && ! NEXT_INSN (label))
6436 {
6437 if (addr + 2 - bp->address <= CONDJUMP_MAX)
6438 bp->insert_place = insn;
6439 else
6440 gen_far_branch (bp);
6441 }
6442 }
6443 if (! label
6444 || (NEXT_INSN (label) && bp->address - addr < CONDJUMP_MIN))
6445 {
6446 bp->near_label = label = gen_label_rtx ();
6447 bp->insert_place = insn;
6448 bp->address = addr;
6449 }
6450 ok = redirect_jump (as_a <rtx_jump_insn *> (insn), label, 0);
6451 gcc_assert (ok);
6452 }
6453 else
6454 {
6455 /* get_attr_length (insn) == 2 */
6456 /* Check if we have a pattern where reorg wants to redirect
6457 the branch to a label from an unconditional branch that
6458 is too far away. */
6459 /* We can't use JUMP_LABEL here because it might be undefined
6460 when not optimizing. */
6461 /* A syntax error might cause beyond to be NULL_RTX. */
6462 rtx temp = XEXP (XEXP (SET_SRC (PATTERN (insn)), 1), 0);
6463 beyond = next_active_insn (as_a<rtx_insn *> (temp));
6464
6465 if (beyond
6466 && (JUMP_P (beyond)
6467 || ((beyond = next_active_insn (beyond))
6468 && JUMP_P (beyond)))
6469 && GET_CODE (PATTERN (beyond)) == SET
6470 && recog_memoized (beyond) == CODE_FOR_jump_compact
6471 && ((INSN_ADDRESSES
6472 (INSN_UID (XEXP (SET_SRC (PATTERN (beyond)), 0)))
6473 - INSN_ADDRESSES (INSN_UID (insn)) + (unsigned) 252)
6474 > 252 + 258 + 2))
6475 gen_block_redirect (beyond,
6476 INSN_ADDRESSES (INSN_UID (beyond)), 1);
6477 }
6478
6479 next = next_active_insn (insn);
6480
6481 if (next
6482 && (JUMP_P (next)
6483 || ((next = next_active_insn (next))
6484 && JUMP_P (next)))
6485 && GET_CODE (PATTERN (next)) == SET
6486 && recog_memoized (next) == CODE_FOR_jump_compact
6487 && ((INSN_ADDRESSES
6488 (INSN_UID (XEXP (SET_SRC (PATTERN (next)), 0)))
6489 - INSN_ADDRESSES (INSN_UID (insn)) + (unsigned) 252)
6490 > 252 + 258 + 2))
6491 gen_block_redirect (next, INSN_ADDRESSES (INSN_UID (next)), 1);
6492 }
6493 else if (type == TYPE_JUMP || type == TYPE_RETURN)
6494 {
6495 int addr = INSN_ADDRESSES (INSN_UID (insn));
6496 rtx_insn *far_label = 0;
6497 int dest_uid = 0;
6498 struct far_branch *bp;
6499
6500 if (type == TYPE_JUMP)
6501 {
6502 if (CROSSING_JUMP_P (insn))
6503 {
6504 emit_insn_before (gen_block_branch_redirect (const0_rtx),
6505 insn);
6506 continue;
6507 }
6508
6509 far_label = as_a <rtx_insn *> (
6510 XEXP (SET_SRC (PATTERN (insn)), 0));
6511 dest_uid = get_dest_uid (far_label, max_uid);
6512 if (! dest_uid)
6513 {
6514 /* Parse errors can lead to labels outside
6515 the insn stream. */
6516 if (! NEXT_INSN (far_label))
6517 continue;
6518
6519 if (! optimize)
6520 {
6521 JUMP_LABEL (insn) = far_label;
6522 LABEL_NUSES (far_label)++;
6523 }
6524 redirect_jump (as_a <rtx_jump_insn *> (insn), ret_rtx, 1);
6525 far_label = 0;
6526 }
6527 }
6528 bp = uid_branch[dest_uid];
6529 if (! bp)
6530 {
6531 bp = (struct far_branch *) alloca (sizeof *bp);
6532 uid_branch[dest_uid] = bp;
6533 bp->prev = far_branch_list;
6534 far_branch_list = bp;
6535 bp->near_label = 0;
6536 bp->far_label = far_label;
6537 if (far_label)
6538 LABEL_NUSES (far_label)++;
6539 }
6540 else if (bp->near_label && ! NEXT_INSN (bp->near_label))
6541 if (addr - bp->address <= CONDJUMP_MAX)
6542 emit_label_after (bp->near_label, PREV_INSN (insn));
6543 else
6544 {
6545 gen_far_branch (bp);
6546 bp->near_label = 0;
6547 }
6548 else
6549 bp->near_label = 0;
6550 bp->address = addr;
6551 bp->insert_place = insn;
6552 if (! far_label)
6553 emit_insn_before (gen_block_branch_redirect (const0_rtx), insn);
6554 else
6555 gen_block_redirect (insn, addr, bp->near_label ? 2 : 0);
6556 }
6557 }
6558 /* Generate all pending far branches,
6559 and free our references to the far labels. */
6560 while (far_branch_list)
6561 {
6562 if (far_branch_list->near_label
6563 && ! NEXT_INSN (far_branch_list->near_label))
6564 gen_far_branch (far_branch_list);
6565 if (optimize
6566 && far_branch_list->far_label
6567 && ! --LABEL_NUSES (far_branch_list->far_label))
6568 delete_insn (far_branch_list->far_label);
6569 far_branch_list = far_branch_list->prev;
6570 }
6571
6572 /* Instruction length information is no longer valid due to the new
6573 instructions that have been generated. */
6574 init_insn_lengths ();
6575 }
6576
6577 /* Dump out instruction addresses, which is useful for debugging the
6578 constant pool table stuff.
6579
6580 If relaxing, output the label and pseudo-ops used to link together
6581 calls and the instruction which set the registers.
6582
6583 ??? The addresses printed by this routine for insns are nonsense for
6584 insns which are inside of a sequence where none of the inner insns have
6585 variable length. This is because the second pass of shorten_branches
6586 does not bother to update them. */
6587 void
6588 final_prescan_insn (rtx_insn *insn, rtx *opvec ATTRIBUTE_UNUSED,
6589 int noperands ATTRIBUTE_UNUSED)
6590 {
6591 if (TARGET_DUMPISIZE)
6592 fprintf (asm_out_file, "\n! at %04x\n", INSN_ADDRESSES (INSN_UID (insn)));
6593
6594 if (TARGET_RELAX)
6595 {
6596 if (rtx note = find_reg_note (insn, REG_LABEL_OPERAND, NULL_RTX))
6597 {
6598 rtx pattern = PATTERN (insn);
6599 if (GET_CODE (pattern) == PARALLEL)
6600 pattern = XVECEXP (pattern, 0, 0);
6601 switch (GET_CODE (pattern))
6602 {
6603 case SET:
6604 if (GET_CODE (SET_SRC (pattern)) != CALL
6605 && get_attr_type (insn) != TYPE_SFUNC)
6606 {
6607 targetm.asm_out.internal_label
6608 (asm_out_file, "L", CODE_LABEL_NUMBER (XEXP (note, 0)));
6609 break;
6610 }
6611 /* FALLTHROUGH */
6612 case CALL:
6613 asm_fprintf (asm_out_file, "\t.uses %LL%d\n",
6614 CODE_LABEL_NUMBER (XEXP (note, 0)));
6615 break;
6616
6617 default:
6618 gcc_unreachable ();
6619 }
6620 }
6621 }
6622 }
6623
6624 /* Dump out any constants accumulated in the final pass. These will
6625 only be labels. */
6626 const char *
6627 output_jump_label_table (void)
6628 {
6629 if (pool_size)
6630 {
6631 fprintf (asm_out_file, "\t.align 2\n");
6632 for (int i = 0; i < pool_size; i++)
6633 {
6634 pool_node *p = &pool_vector[i];
6635
6636 (*targetm.asm_out.internal_label) (asm_out_file, "L",
6637 CODE_LABEL_NUMBER (p->label));
6638 output_asm_insn (".long %O0", &p->value);
6639 }
6640 pool_size = 0;
6641 }
6642
6643 return "";
6644 }
6645 \f
6646 /* A full frame looks like:
6647
6648 arg-5
6649 arg-4
6650 [ if current_function_anonymous_args
6651 arg-3
6652 arg-2
6653 arg-1
6654 arg-0 ]
6655 saved-fp
6656 saved-r10
6657 saved-r11
6658 saved-r12
6659 saved-pr
6660 local-n
6661 ..
6662 local-1
6663 local-0 <- fp points here.
6664
6665 Number of bytes pushed for anonymous args, used to pass information
6666 between expand_prologue and expand_epilogue.
6667
6668 Adjust the stack by SIZE bytes. REG holds the rtl of the register to be
6669 adjusted. If epilogue_p is zero, this is for a prologue; otherwise, it's
6670 for an epilogue and a negative value means that it's for a sibcall
6671 epilogue. If LIVE_REGS_MASK is nonzero, it points to a HARD_REG_SET of
6672 all the registers that are about to be restored, and hence dead. */
6673 static void
6674 output_stack_adjust (int size, rtx reg, int epilogue_p,
6675 HARD_REG_SET *live_regs_mask, bool frame_p)
6676 {
6677 rtx_insn *(*emit_fn) (rtx) = frame_p ? &emit_frame_insn : &emit_insn;
6678 if (size)
6679 {
6680 HOST_WIDE_INT align = STACK_BOUNDARY / BITS_PER_UNIT;
6681
6682 /* This test is bogus, as output_stack_adjust is used to re-align the
6683 stack. */
6684 #if 0
6685 gcc_assert (!(size % align));
6686 #endif
6687
6688 if (CONST_OK_FOR_ADD (size))
6689 emit_fn (GEN_ADD3 (reg, reg, GEN_INT (size)));
6690 /* Try to do it with two partial adjustments; however, we must make
6691 sure that the stack is properly aligned at all times, in case
6692 an interrupt occurs between the two partial adjustments. */
6693 else if (CONST_OK_FOR_ADD (size / 2 & -align)
6694 && CONST_OK_FOR_ADD (size - (size / 2 & -align)))
6695 {
6696 emit_fn (GEN_ADD3 (reg, reg, GEN_INT (size / 2 & -align)));
6697 emit_fn (GEN_ADD3 (reg, reg, GEN_INT (size - (size / 2 & -align))));
6698 }
6699 else
6700 {
6701 rtx const_reg;
6702 rtx insn;
6703 int temp = epilogue_p ? 7 : 1;
6704 int i;
6705
6706 /* If TEMP is invalid, we could temporarily save a general
6707 register to MACL. However, there is currently no need
6708 to handle this case, so just die when we see it. */
6709 if (epilogue_p < 0
6710 || current_function_interrupt
6711 || ! call_used_regs[temp] || fixed_regs[temp])
6712 temp = -1;
6713 if (temp < 0 && ! current_function_interrupt && epilogue_p >= 0)
6714 {
6715 HARD_REG_SET temps = (regs_invalidated_by_call
6716 & ~fixed_reg_set
6717 & savable_regs);
6718 if (epilogue_p > 0)
6719 {
6720 int nreg = 0;
6721 if (crtl->return_rtx)
6722 {
6723 machine_mode mode;
6724 mode = GET_MODE (crtl->return_rtx);
6725 if (BASE_RETURN_VALUE_REG (mode) == FIRST_RET_REG)
6726 nreg = hard_regno_nregs (FIRST_RET_REG, mode);
6727 }
6728 for (i = 0; i < nreg; i++)
6729 CLEAR_HARD_REG_BIT (temps, FIRST_RET_REG + i);
6730 if (crtl->calls_eh_return)
6731 {
6732 CLEAR_HARD_REG_BIT (temps, EH_RETURN_STACKADJ_REGNO);
6733 for (i = 0; i <= 3; i++)
6734 CLEAR_HARD_REG_BIT (temps, EH_RETURN_DATA_REGNO (i));
6735 }
6736 }
6737 if (epilogue_p <= 0)
6738 {
6739 for (i = FIRST_PARM_REG;
6740 i < FIRST_PARM_REG + NPARM_REGS (SImode); i++)
6741 CLEAR_HARD_REG_BIT (temps, i);
6742 if (cfun->static_chain_decl != NULL)
6743 CLEAR_HARD_REG_BIT (temps, STATIC_CHAIN_REGNUM);
6744 }
6745 temp = scavenge_reg (&temps);
6746 }
6747 if (temp < 0 && live_regs_mask)
6748 {
6749 HARD_REG_SET temps;
6750
6751 temps = *live_regs_mask;
6752 CLEAR_HARD_REG_BIT (temps, REGNO (reg));
6753 temp = scavenge_reg (&temps);
6754 }
6755 if (temp < 0)
6756 {
6757 rtx adj_reg, tmp_reg, mem;
6758
6759 /* If we reached here, the most likely case is the (sibcall)
6760 epilogue. Put a special push/pop sequence for such case as
6761 the last resort. This looks lengthy but would not be problem
6762 because it seems to be very rare. */
6763 gcc_assert (epilogue_p);
6764
6765 /* ??? There is still the slight possibility that r4 or
6766 r5 have been reserved as fixed registers or assigned
6767 as global registers, and they change during an
6768 interrupt. There are possible ways to handle this:
6769
6770 - If we are adjusting the frame pointer (r14), we can do
6771 with a single temp register and an ordinary push / pop
6772 on the stack.
6773 - Grab any call-used or call-saved registers (i.e. not
6774 fixed or globals) for the temps we need. We might
6775 also grab r14 if we are adjusting the stack pointer.
6776 If we can't find enough available registers, issue
6777 a diagnostic and die - the user must have reserved
6778 way too many registers.
6779 But since all this is rather unlikely to happen and
6780 would require extra testing, we just die if r4 / r5
6781 are not available. */
6782 gcc_assert (!fixed_regs[4] && !fixed_regs[5]
6783 && !global_regs[4] && !global_regs[5]);
6784
6785 adj_reg = gen_rtx_REG (GET_MODE (reg), 4);
6786 tmp_reg = gen_rtx_REG (GET_MODE (reg), 5);
6787 emit_move_insn (gen_tmp_stack_mem (Pmode, reg), adj_reg);
6788 emit_insn (GEN_MOV (adj_reg, GEN_INT (size)));
6789 emit_insn (GEN_ADD3 (adj_reg, adj_reg, reg));
6790 mem = gen_tmp_stack_mem (Pmode, gen_rtx_PRE_DEC (Pmode, adj_reg));
6791 emit_move_insn (mem, tmp_reg);
6792 emit_move_insn (tmp_reg, gen_tmp_stack_mem (Pmode, reg));
6793 mem = gen_tmp_stack_mem (Pmode, gen_rtx_PRE_DEC (Pmode, adj_reg));
6794 emit_move_insn (mem, tmp_reg);
6795 emit_move_insn (reg, adj_reg);
6796 mem = gen_tmp_stack_mem (Pmode, gen_rtx_POST_INC (Pmode, reg));
6797 emit_move_insn (adj_reg, mem);
6798 mem = gen_tmp_stack_mem (Pmode, gen_rtx_POST_INC (Pmode, reg));
6799 emit_move_insn (tmp_reg, mem);
6800 /* Tell flow the insns that pop r4/r5 aren't dead. */
6801 emit_use (tmp_reg);
6802 emit_use (adj_reg);
6803 return;
6804 }
6805 const_reg = gen_rtx_REG (GET_MODE (reg), temp);
6806
6807 /* If SIZE is negative, subtract the positive value.
6808 This sometimes allows a constant pool entry to be shared
6809 between prologue and epilogue code. */
6810 if (size < 0)
6811 {
6812 emit_insn (GEN_MOV (const_reg, GEN_INT (-size)));
6813 insn = emit_fn (GEN_SUB3 (reg, reg, const_reg));
6814 }
6815 else
6816 {
6817 emit_insn (GEN_MOV (const_reg, GEN_INT (size)));
6818 insn = emit_fn (GEN_ADD3 (reg, reg, const_reg));
6819 }
6820 add_reg_note (insn, REG_FRAME_RELATED_EXPR,
6821 gen_rtx_SET (reg, gen_rtx_PLUS (SImode, reg,
6822 GEN_INT (size))));
6823 }
6824 }
6825 }
6826
6827 /* Emit the specified insn and mark it as frame related. */
6828 static rtx_insn *
6829 emit_frame_insn (rtx x)
6830 {
6831 rtx_insn *insn = emit_insn (x);
6832 RTX_FRAME_RELATED_P (insn) = 1;
6833 return insn;
6834 }
6835
6836 /* Output RTL to push register RN onto the stack. */
6837 static rtx
6838 push (int rn)
6839 {
6840 rtx x;
6841 if (rn == FPUL_REG)
6842 x = gen_push_fpul ();
6843 else if (rn == FPSCR_REG)
6844 x = gen_push_fpscr ();
6845 else if (TARGET_FPU_DOUBLE && TARGET_FMOVD
6846 && ! TARGET_FPU_SINGLE && FP_OR_XD_REGISTER_P (rn))
6847 {
6848 if (FP_REGISTER_P (rn) && (rn - FIRST_FP_REG) & 1)
6849 return NULL_RTX;
6850 x = gen_push_4 (gen_rtx_REG (DFmode, rn));
6851 }
6852 else if (TARGET_SH2E && FP_REGISTER_P (rn))
6853 x = gen_push_e (gen_rtx_REG (SFmode, rn));
6854 else
6855 x = gen_push (gen_rtx_REG (SImode, rn));
6856
6857 x = emit_frame_insn (x);
6858 add_reg_note (x, REG_INC, gen_rtx_REG (SImode, STACK_POINTER_REGNUM));
6859 return x;
6860 }
6861
6862 /* Output RTL to pop register RN from the stack. */
6863 static void
6864 pop (int rn)
6865 {
6866 rtx x, sp_reg, reg;
6867 if (rn == FPUL_REG)
6868 x = gen_pop_fpul ();
6869 else if (rn == FPSCR_REG)
6870 x = gen_pop_fpscr ();
6871 else if (TARGET_FPU_DOUBLE && TARGET_FMOVD
6872 && ! TARGET_FPU_SINGLE && FP_OR_XD_REGISTER_P (rn))
6873 {
6874 if (FP_REGISTER_P (rn) && (rn - FIRST_FP_REG) & 1)
6875 return;
6876 x = gen_pop_4 (gen_rtx_REG (DFmode, rn));
6877 }
6878 else if (TARGET_SH2E && FP_REGISTER_P (rn))
6879 x = gen_pop_e (gen_rtx_REG (SFmode, rn));
6880 else
6881 x = gen_pop (gen_rtx_REG (SImode, rn));
6882
6883 x = emit_insn (x);
6884
6885 sp_reg = gen_rtx_REG (SImode, STACK_POINTER_REGNUM);
6886 reg = copy_rtx (GET_CODE (PATTERN (x)) == PARALLEL
6887 ? SET_DEST (XVECEXP (PATTERN (x), 0, 0))
6888 : SET_DEST (PATTERN (x)));
6889 add_reg_note (x, REG_CFA_RESTORE, reg);
6890 add_reg_note (x, REG_CFA_ADJUST_CFA,
6891 gen_rtx_SET (sp_reg,
6892 plus_constant (SImode, sp_reg,
6893 GET_MODE_SIZE (GET_MODE (reg)))));
6894 add_reg_note (x, REG_INC, gen_rtx_REG (SImode, STACK_POINTER_REGNUM));
6895 RTX_FRAME_RELATED_P (x) = 1;
6896 }
6897
6898 /* Generate code to push the regs specified in the mask. */
6899 static void
6900 push_regs (HARD_REG_SET *mask, bool interrupt_handler)
6901 {
6902 bool skip_fpscr = false;
6903
6904 /* Push PR last; this gives better latencies after the prologue, and
6905 candidates for the return delay slot when there are no general
6906 registers pushed. */
6907 for (int i = interrupt_handler ? LAST_BANKED_REG + 1 : 0;
6908 i < FIRST_PSEUDO_REGISTER; i++)
6909 {
6910 /* If this is an interrupt handler, and the SZ bit varies,
6911 and we have to push any floating point register, we need
6912 to switch to the correct precision first. */
6913 if (i == FIRST_FP_REG && interrupt_handler && TARGET_FMOVD
6914 && hard_reg_set_intersect_p (*mask, reg_class_contents[DF_REGS]))
6915 {
6916 push (FPSCR_REG);
6917 fpscr_set_from_mem (NORMAL_MODE (FP_MODE), ~*mask);
6918 skip_fpscr = true;
6919 }
6920 if (i != PR_REG
6921 && (i != FPSCR_REG || ! skip_fpscr)
6922 && TEST_HARD_REG_BIT (*mask, i))
6923 {
6924 /* If the ISR has RESBANK attribute assigned, don't push any of
6925 the following registers - R0-R14, MACH, MACL and GBR. */
6926 if (! (sh_cfun_resbank_handler_p ()
6927 && ((i >= FIRST_GENERAL_REG && i < LAST_GENERAL_REG)
6928 || i == MACH_REG
6929 || i == MACL_REG
6930 || i == GBR_REG)))
6931 push (i);
6932 }
6933 }
6934
6935 /* Push banked registers last to improve delay slot opportunities. */
6936 if (interrupt_handler)
6937 {
6938 bool use_movml = false;
6939
6940 if (TARGET_SH2A)
6941 {
6942 unsigned int count = 0;
6943
6944 for (int i = FIRST_BANKED_REG; i <= LAST_BANKED_REG; i++)
6945 if (TEST_HARD_REG_BIT (*mask, i))
6946 count++;
6947 else
6948 break;
6949
6950 /* Use movml when all banked registers are pushed. */
6951 if (count == LAST_BANKED_REG - FIRST_BANKED_REG + 1)
6952 use_movml = true;
6953 }
6954
6955 if (sh_cfun_resbank_handler_p ())
6956 ; /* Do nothing. */
6957 else if (use_movml)
6958 {
6959 rtx x, mem, reg, set;
6960 rtx sp_reg = gen_rtx_REG (SImode, STACK_POINTER_REGNUM);
6961
6962 /* We must avoid scheduling multiple store insn with another
6963 insns. */
6964 emit_insn (gen_blockage ());
6965 x = gen_movml_push_banked (sp_reg);
6966 x = emit_frame_insn (x);
6967 for (int i = FIRST_BANKED_REG; i <= LAST_BANKED_REG; i++)
6968 {
6969 mem = gen_rtx_MEM (SImode, plus_constant (Pmode, sp_reg, i * 4));
6970 reg = gen_rtx_REG (SImode, i);
6971 add_reg_note (x, REG_CFA_OFFSET, gen_rtx_SET (mem, reg));
6972 }
6973
6974 set = gen_rtx_SET (sp_reg, plus_constant (Pmode, sp_reg, - 32));
6975 add_reg_note (x, REG_CFA_ADJUST_CFA, set);
6976 emit_insn (gen_blockage ());
6977 }
6978 else
6979 for (int i = FIRST_BANKED_REG; i <= LAST_BANKED_REG; i++)
6980 if (TEST_HARD_REG_BIT (*mask, i))
6981 push (i);
6982 }
6983
6984 /* Don't push PR register for an ISR with RESBANK attribute assigned. */
6985 if (TEST_HARD_REG_BIT (*mask, PR_REG) && !sh_cfun_resbank_handler_p ())
6986 push (PR_REG);
6987 }
6988
6989 /* Work out the registers which need to be saved, both as a mask and a
6990 count of saved words. Return the count.
6991
6992 If doing a pragma interrupt function, then push all regs used by the
6993 function, and if we call another function (we can tell by looking at PR),
6994 make sure that all the regs it clobbers are safe too. */
6995 static int
6996 calc_live_regs (HARD_REG_SET *live_regs_mask)
6997 {
6998 unsigned int reg;
6999 tree attrs;
7000 bool interrupt_or_trapa_handler, trapa_handler, interrupt_handler;
7001 bool nosave_low_regs;
7002
7003 attrs = DECL_ATTRIBUTES (current_function_decl);
7004 interrupt_or_trapa_handler = sh_cfun_interrupt_handler_p ();
7005 trapa_handler = lookup_attribute ("trapa_handler", attrs) != NULL_TREE;
7006 interrupt_handler = interrupt_or_trapa_handler && ! trapa_handler;
7007 nosave_low_regs = lookup_attribute ("nosave_low_regs", attrs) != NULL_TREE;
7008
7009 CLEAR_HARD_REG_SET (*live_regs_mask);
7010 if (TARGET_FPU_DOUBLE && TARGET_FMOVD && interrupt_handler
7011 && df_regs_ever_live_p (FPSCR_REG))
7012 target_flags &= ~MASK_FPU_SINGLE;
7013 /* If we can save a lot of saves by switching to double mode, do that. */
7014 else if (TARGET_FPU_DOUBLE && TARGET_FMOVD && TARGET_FPU_SINGLE)
7015 for (int count = 0, reg = FIRST_FP_REG; reg <= LAST_FP_REG; reg += 2)
7016 if (df_regs_ever_live_p (reg) && df_regs_ever_live_p (reg+1)
7017 && (! call_used_regs[reg]
7018 || interrupt_handler)
7019 && ++count > 2)
7020 {
7021 target_flags &= ~MASK_FPU_SINGLE;
7022 break;
7023 }
7024
7025
7026 rtx pr_initial = has_hard_reg_initial_val (Pmode, PR_REG);
7027 bool pr_live = (pr_initial
7028 ? (!REG_P (pr_initial)
7029 || REGNO (pr_initial) != (PR_REG))
7030 : df_regs_ever_live_p (PR_REG));
7031 /* For Shcompact, if not optimizing, we end up with a memory reference
7032 using the return address pointer for __builtin_return_address even
7033 though there is no actual need to put the PR register on the stack. */
7034 pr_live |= df_regs_ever_live_p (RETURN_ADDRESS_POINTER_REGNUM);
7035
7036 /* Force PR to be live if the prologue has to call the SHmedia
7037 argument decoder or register saver. */
7038 bool has_call = pr_live;
7039
7040 int count;
7041 for (count = 0, reg = FIRST_PSEUDO_REGISTER; reg-- != 0; )
7042 {
7043 if (reg == PR_REG
7044 ? pr_live
7045 : interrupt_handler
7046 ? (/* Need to save all the regs ever live. */
7047 (df_regs_ever_live_p (reg)
7048 || (call_used_regs[reg]
7049 && (! fixed_regs[reg] || reg == MACH_REG || reg == MACL_REG
7050 || reg == PIC_OFFSET_TABLE_REGNUM)
7051 && has_call))
7052 && reg != STACK_POINTER_REGNUM && reg != ARG_POINTER_REGNUM
7053 && reg != RETURN_ADDRESS_POINTER_REGNUM
7054 && reg != T_REG && reg != GBR_REG
7055 && reg != FPSCR_MODES_REG && reg != FPSCR_STAT_REG
7056 /* Push fpscr only on targets which have FPU */
7057 && (reg != FPSCR_REG || TARGET_FPU_ANY))
7058 : (/* Only push those regs which are used and need to be saved. */
7059 (false)
7060 || (df_regs_ever_live_p (reg)
7061 && ((!call_used_regs[reg]
7062 && !(reg != PIC_OFFSET_TABLE_REGNUM
7063 && fixed_regs[reg]
7064 && call_used_or_fixed_reg_p (reg)))
7065 || (trapa_handler && reg == FPSCR_REG && TARGET_FPU_ANY)))
7066 || (crtl->calls_eh_return
7067 && (reg == EH_RETURN_DATA_REGNO (0)
7068 || reg == EH_RETURN_DATA_REGNO (1)
7069 || reg == EH_RETURN_DATA_REGNO (2)
7070 || reg == EH_RETURN_DATA_REGNO (3)))
7071 || ((reg == MACL_REG || reg == MACH_REG)
7072 && df_regs_ever_live_p (reg)
7073 && sh_cfun_attr_renesas_p ())
7074 ))
7075 {
7076 SET_HARD_REG_BIT (*live_regs_mask, reg);
7077 count += GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg));
7078
7079 if (TARGET_FPU_DOUBLE && TARGET_FMOVD
7080 && GET_MODE_CLASS (REGISTER_NATURAL_MODE (reg)) == MODE_FLOAT)
7081 {
7082 if (FP_REGISTER_P (reg))
7083 {
7084 if (! TARGET_FPU_SINGLE && ! df_regs_ever_live_p (reg ^ 1))
7085 {
7086 SET_HARD_REG_BIT (*live_regs_mask, (reg ^ 1));
7087 count += GET_MODE_SIZE (REGISTER_NATURAL_MODE (reg ^ 1));
7088 }
7089 }
7090 else if (XD_REGISTER_P (reg))
7091 {
7092 /* Must switch to double mode to access these registers. */
7093 target_flags &= ~MASK_FPU_SINGLE;
7094 }
7095 }
7096 }
7097 if (nosave_low_regs && reg == R8_REG)
7098 break;
7099 }
7100
7101 return count;
7102 }
7103
7104 /* Code to generate prologue and epilogue sequences */
7105
7106 /* PUSHED is the number of bytes that are being pushed on the
7107 stack for register saves. Return the frame size, padded
7108 appropriately so that the stack stays properly aligned. */
7109 static HOST_WIDE_INT
7110 rounded_frame_size (int pushed)
7111 {
7112 HOST_WIDE_INT size = get_frame_size ();
7113 HOST_WIDE_INT align = STACK_BOUNDARY / BITS_PER_UNIT;
7114
7115 if (ACCUMULATE_OUTGOING_ARGS)
7116 size += crtl->outgoing_args_size;
7117
7118 return ((size + pushed + align - 1) & -align) - pushed;
7119 }
7120
7121 /* Expand code for the function prologue. */
7122 void
7123 sh_expand_prologue (void)
7124 {
7125 int save_flags = target_flags;
7126 tree sp_switch_attr
7127 = lookup_attribute ("sp_switch", DECL_ATTRIBUTES (current_function_decl));
7128
7129 current_function_interrupt = sh_cfun_interrupt_handler_p ();
7130
7131 /* We have pretend args if we had an object sent partially in registers
7132 and partially on the stack, e.g. a large structure. */
7133 int pretend_args = crtl->args.pretend_args_size;
7134 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl)
7135 && (NPARM_REGS(SImode)
7136 > crtl->args.info.arg_count[(int) SH_ARG_INT]))
7137 pretend_args = 0;
7138
7139 output_stack_adjust (-pretend_args, stack_pointer_rtx, 0, NULL, true);
7140 int stack_usage = pretend_args;
7141
7142 /* Emit the code for SETUP_VARARGS. */
7143 if (cfun->stdarg)
7144 {
7145 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl))
7146 {
7147 /* Push arg regs as if they'd been provided by caller in stack. */
7148 for (int i = 0; i < NPARM_REGS(SImode); i++)
7149 {
7150 int rn = NPARM_REGS(SImode) + FIRST_PARM_REG - i - 1;
7151
7152 if (i >= (NPARM_REGS(SImode)
7153 - crtl->args.info.arg_count[(int) SH_ARG_INT]
7154 ))
7155 break;
7156 push (rn);
7157 stack_usage += GET_MODE_SIZE (SImode);
7158 }
7159 }
7160 }
7161
7162 /* If we're supposed to switch stacks at function entry, do so now. */
7163 if (sp_switch_attr)
7164 {
7165 rtx lab, newsrc;
7166 /* The argument specifies a variable holding the address of the
7167 stack the interrupt function should switch to/from at entry/exit. */
7168 tree arg = TREE_VALUE ( TREE_VALUE (sp_switch_attr));
7169 const char* s = ggc_strdup (TREE_STRING_POINTER (arg));
7170 rtx sp_switch = gen_rtx_SYMBOL_REF (Pmode, s);
7171
7172 lab = add_constant (sp_switch, SImode, 0);
7173 newsrc = gen_rtx_LABEL_REF (VOIDmode, lab);
7174
7175 emit_insn (gen_sp_switch_1 (newsrc));
7176 }
7177
7178 HARD_REG_SET live_regs_mask;
7179 int d = calc_live_regs (&live_regs_mask);
7180 /* ??? Maybe we could save some switching if we can move a mode switch
7181 that already happens to be at the function start into the prologue. */
7182 if (target_flags != save_flags && ! current_function_interrupt)
7183 emit_insn (gen_toggle_sz ());
7184
7185 push_regs (&live_regs_mask, current_function_interrupt);
7186 stack_usage += d;
7187
7188 if (flag_pic && !TARGET_FDPIC
7189 && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
7190 emit_insn (gen_GOTaddr2picreg (const0_rtx));
7191
7192 if (target_flags != save_flags && ! current_function_interrupt)
7193 emit_insn (gen_toggle_sz ());
7194
7195 target_flags = save_flags;
7196
7197 output_stack_adjust (-rounded_frame_size (d),
7198 stack_pointer_rtx, 0, NULL, true);
7199 stack_usage += rounded_frame_size (d);
7200
7201 if (frame_pointer_needed)
7202 emit_frame_insn (GEN_MOV (hard_frame_pointer_rtx, stack_pointer_rtx));
7203
7204 /* If we are profiling, make sure no instructions are scheduled before
7205 the call to mcount. Similarly if some call instructions are swapped
7206 before frame related insns, it'll confuse the unwinder because
7207 currently SH has no unwind info for function epilogues. */
7208 if (crtl->profile || flag_exceptions || flag_unwind_tables)
7209 emit_insn (gen_blockage ());
7210
7211 if (flag_stack_usage_info)
7212 current_function_static_stack_size = stack_usage;
7213 }
7214
7215 /* Expand code for the function epilogue. */
7216 void
7217 sh_expand_epilogue (bool sibcall_p)
7218 {
7219 int save_flags = target_flags;
7220 bool fpscr_deferred = false;
7221 int e = sibcall_p ? -1 : 1;
7222
7223 HARD_REG_SET live_regs_mask;
7224 int d = calc_live_regs (&live_regs_mask);
7225
7226 int save_size = d;
7227 int frame_size = rounded_frame_size (d);
7228
7229 if (frame_pointer_needed)
7230 {
7231 /* We must avoid scheduling the epilogue with previous basic blocks.
7232 See PR/18032 and PR/40313. */
7233 emit_insn (gen_blockage ());
7234 output_stack_adjust (frame_size, hard_frame_pointer_rtx, e,
7235 &live_regs_mask, true);
7236
7237 /* We must avoid moving the stack pointer adjustment past code
7238 which reads from the local frame, else an interrupt could
7239 occur after the SP adjustment and clobber data in the local
7240 frame. */
7241 emit_insn (gen_blockage ());
7242 emit_frame_insn (GEN_MOV (stack_pointer_rtx, hard_frame_pointer_rtx));
7243 }
7244 else if (frame_size)
7245 {
7246 /* We must avoid moving the stack pointer adjustment past code
7247 which reads from the local frame, else an interrupt could
7248 occur after the SP adjustment and clobber data in the local
7249 frame. */
7250 emit_insn (gen_blockage ());
7251 output_stack_adjust (frame_size, stack_pointer_rtx, e,
7252 &live_regs_mask, true);
7253 }
7254
7255 /* Pop all the registers. */
7256
7257 if (target_flags != save_flags && ! current_function_interrupt)
7258 emit_insn (gen_toggle_sz ());
7259
7260 {
7261 int last_reg;
7262
7263 save_size = 0;
7264 /* For an ISR with RESBANK attribute assigned, don't pop PR
7265 register. */
7266 if (TEST_HARD_REG_BIT (live_regs_mask, PR_REG)
7267 && !sh_cfun_resbank_handler_p ())
7268 {
7269 if (!frame_pointer_needed)
7270 emit_insn (gen_blockage ());
7271 pop (PR_REG);
7272 }
7273
7274 /* Banked registers are popped first to avoid being scheduled in the
7275 delay slot. RTE switches banks before the ds instruction. */
7276 if (current_function_interrupt)
7277 {
7278 bool use_movml = false;
7279
7280 if (TARGET_SH2A)
7281 {
7282 unsigned int count = 0;
7283
7284 for (int i = FIRST_BANKED_REG; i <= LAST_BANKED_REG; i++)
7285 if (TEST_HARD_REG_BIT (live_regs_mask, i))
7286 count++;
7287 else
7288 break;
7289
7290 /* Use movml when all banked register are poped. */
7291 if (count == LAST_BANKED_REG - FIRST_BANKED_REG + 1)
7292 use_movml = true;
7293 }
7294
7295 if (sh_cfun_resbank_handler_p ())
7296 ; /* Do nothing. */
7297 else if (use_movml)
7298 {
7299 rtx sp_reg = gen_rtx_REG (SImode, STACK_POINTER_REGNUM);
7300
7301 /* We must avoid scheduling multiple load insn with another
7302 insns. */
7303 emit_insn (gen_blockage ());
7304 emit_insn (gen_movml_pop_banked (sp_reg));
7305 emit_insn (gen_blockage ());
7306 }
7307 else
7308 for (int i = LAST_BANKED_REG; i >= FIRST_BANKED_REG; i--)
7309 if (TEST_HARD_REG_BIT (live_regs_mask, i))
7310 pop (i);
7311
7312 last_reg = FIRST_PSEUDO_REGISTER - LAST_BANKED_REG - 1;
7313 }
7314 else
7315 last_reg = FIRST_PSEUDO_REGISTER;
7316
7317 for (int i = 0; i < last_reg; i++)
7318 {
7319 int j = (FIRST_PSEUDO_REGISTER - 1) - i;
7320
7321 if (j == FPSCR_REG && current_function_interrupt && TARGET_FMOVD
7322 && hard_reg_set_intersect_p (live_regs_mask,
7323 reg_class_contents[DF_REGS]))
7324 fpscr_deferred = true;
7325 /* For an ISR with RESBANK attribute assigned, don't pop
7326 following registers, R0-R14, MACH, MACL and GBR. */
7327 else if (j != PR_REG && TEST_HARD_REG_BIT (live_regs_mask, j)
7328 && ! (sh_cfun_resbank_handler_p ()
7329 && ((j >= FIRST_GENERAL_REG
7330 && j < LAST_GENERAL_REG)
7331 || j == MACH_REG
7332 || j == MACL_REG
7333 || j == GBR_REG)))
7334 pop (j);
7335
7336 if (j == FIRST_FP_REG && fpscr_deferred)
7337 pop (FPSCR_REG);
7338 }
7339 }
7340 if (target_flags != save_flags && ! current_function_interrupt)
7341 emit_insn (gen_toggle_sz ());
7342 target_flags = save_flags;
7343
7344 output_stack_adjust (crtl->args.pretend_args_size + save_size,
7345 stack_pointer_rtx, e, NULL, true);
7346
7347 if (crtl->calls_eh_return)
7348 emit_insn (GEN_ADD3 (stack_pointer_rtx, stack_pointer_rtx,
7349 EH_RETURN_STACKADJ_RTX));
7350
7351 /* Switch back to the normal stack if necessary. */
7352 if (lookup_attribute ("sp_switch", DECL_ATTRIBUTES (current_function_decl)))
7353 emit_insn (gen_sp_switch_2 ());
7354
7355 /* Tell flow the insn that pops PR isn't dead. */
7356 if (TEST_HARD_REG_BIT (live_regs_mask, PR_REG))
7357 emit_use (gen_rtx_REG (SImode, PR_REG));
7358 }
7359
7360 /* Emit code to change the current function's return address to RA.
7361 TEMP is available as a scratch register, if needed. */
7362 void
7363 sh_set_return_address (rtx ra, rtx tmp)
7364 {
7365 HARD_REG_SET live_regs_mask;
7366 int d = calc_live_regs (&live_regs_mask);
7367
7368 /* If pr_reg isn't life, we can set it directly. */
7369 if (! TEST_HARD_REG_BIT (live_regs_mask, PR_REG))
7370 {
7371 rtx rr = gen_rtx_REG (SImode, PR_REG);
7372 emit_insn (GEN_MOV (rr, ra));
7373 /* Tell flow the register for return isn't dead. */
7374 emit_use (rr);
7375 return;
7376 }
7377
7378 int pr_offset = rounded_frame_size (d);
7379
7380 emit_insn (GEN_MOV (tmp, GEN_INT (pr_offset)));
7381
7382 if (frame_pointer_needed)
7383 emit_insn (GEN_ADD3 (tmp, tmp, hard_frame_pointer_rtx));
7384 else
7385 emit_insn (GEN_ADD3 (tmp, tmp, stack_pointer_rtx));
7386
7387 tmp = gen_frame_mem (Pmode, tmp);
7388 emit_insn (GEN_MOV (tmp, ra));
7389 /* Tell this store isn't dead. */
7390 emit_use (tmp);
7391 }
7392
7393 /* Clear variables at function end. */
7394 static void
7395 sh_output_function_epilogue (FILE *)
7396 {
7397 }
7398
7399 static rtx
7400 sh_builtin_saveregs (void)
7401 {
7402 /* First unnamed integer register. */
7403 int first_intreg = crtl->args.info.arg_count[(int) SH_ARG_INT];
7404 /* Number of integer registers we need to save. */
7405 int n_intregs = MAX (0, NPARM_REGS (SImode) - first_intreg);
7406 /* First unnamed SFmode float reg */
7407 int first_floatreg = crtl->args.info.arg_count[(int) SH_ARG_FLOAT];
7408 /* Number of SFmode float regs to save. */
7409 int n_floatregs = MAX (0, NPARM_REGS (SFmode) - first_floatreg);
7410 rtx regbuf, fpregs;
7411 int bufsize, regno;
7412 alias_set_type alias_set;
7413
7414 if (!TARGET_FPU_ANY)
7415 {
7416 error ("%<__builtin_saveregs%> not supported by this subtarget");
7417 return const0_rtx;
7418 }
7419
7420 /* Allocate block of memory for the regs. */
7421 /* ??? If n_intregs + n_floatregs == 0, should we allocate at least 1 byte?
7422 Or can assign_stack_local accept a 0 SIZE argument? */
7423 bufsize = (n_intregs * UNITS_PER_WORD) + (n_floatregs * UNITS_PER_WORD);
7424
7425 if (n_floatregs & 1)
7426 {
7427 rtx addr;
7428
7429 regbuf = assign_stack_local (BLKmode, bufsize + UNITS_PER_WORD, 0);
7430 addr = copy_to_mode_reg (Pmode, XEXP (regbuf, 0));
7431 emit_insn (gen_iorsi3 (addr, addr, GEN_INT (UNITS_PER_WORD)));
7432 regbuf = change_address (regbuf, BLKmode, addr);
7433 }
7434 else if (STACK_BOUNDARY < 64 && TARGET_FPU_DOUBLE && n_floatregs)
7435 {
7436 rtx addr, mask;
7437
7438 regbuf = assign_stack_local (BLKmode, bufsize + UNITS_PER_WORD, 0);
7439 addr = copy_to_mode_reg (Pmode, plus_constant (Pmode,
7440 XEXP (regbuf, 0), 4));
7441 mask = copy_to_mode_reg (Pmode, GEN_INT (-8));
7442 emit_insn (gen_andsi3 (addr, addr, mask));
7443 regbuf = change_address (regbuf, BLKmode, addr);
7444 }
7445 else
7446 regbuf = assign_stack_local (BLKmode, bufsize, TARGET_FPU_DOUBLE ? 64 : 0);
7447 alias_set = get_varargs_alias_set ();
7448 set_mem_alias_set (regbuf, alias_set);
7449
7450 /* Save int args.
7451 This is optimized to only save the regs that are necessary. Explicitly
7452 named args need not be saved. */
7453 if (n_intregs > 0)
7454 move_block_from_reg (BASE_ARG_REG (SImode) + first_intreg,
7455 adjust_address (regbuf, BLKmode,
7456 n_floatregs * UNITS_PER_WORD),
7457 n_intregs);
7458
7459 /* Save float args.
7460 This is optimized to only save the regs that are necessary. Explicitly
7461 named args need not be saved.
7462 We explicitly build a pointer to the buffer because it halves the insn
7463 count when not optimizing (otherwise the pointer is built for each reg
7464 saved).
7465 We emit the moves in reverse order so that we can use predecrement. */
7466
7467 fpregs = copy_to_mode_reg (Pmode,
7468 plus_constant (Pmode, XEXP (regbuf, 0),
7469 n_floatregs * UNITS_PER_WORD));
7470 if (TARGET_FPU_DOUBLE)
7471 {
7472 rtx mem;
7473 for (regno = NPARM_REGS (DFmode) - 2; regno >= first_floatreg; regno -= 2)
7474 {
7475 emit_insn (gen_addsi3 (fpregs, fpregs,
7476 GEN_INT (-2 * UNITS_PER_WORD)));
7477 mem = change_address (regbuf, DFmode, fpregs);
7478 emit_move_insn (mem,
7479 gen_rtx_REG (DFmode, BASE_ARG_REG (DFmode) + regno));
7480 }
7481 regno = first_floatreg;
7482 if (regno & 1)
7483 {
7484 emit_insn (gen_addsi3 (fpregs, fpregs, GEN_INT (-UNITS_PER_WORD)));
7485 mem = change_address (regbuf, SFmode, fpregs);
7486 emit_move_insn (mem,
7487 gen_rtx_REG (SFmode, BASE_ARG_REG (SFmode)
7488 + regno - SH_REG_MSW_OFFSET));
7489 }
7490 }
7491 else
7492 for (regno = NPARM_REGS (SFmode) - 1; regno >= first_floatreg; regno--)
7493 {
7494 rtx mem;
7495
7496 emit_insn (gen_addsi3 (fpregs, fpregs, GEN_INT (-UNITS_PER_WORD)));
7497 mem = change_address (regbuf, SFmode, fpregs);
7498 emit_move_insn (mem,
7499 gen_rtx_REG (SFmode, BASE_ARG_REG (SFmode) + regno));
7500 }
7501
7502 /* Return the address of the regbuf. */
7503 return XEXP (regbuf, 0);
7504 }
7505
7506 /* Define the `__builtin_va_list' type for the ABI. */
7507 static tree
7508 sh_build_builtin_va_list (void)
7509 {
7510 tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
7511 tree record, type_decl;
7512
7513 if ((! TARGET_SH2E && ! TARGET_SH4)
7514 || TARGET_HITACHI || sh_cfun_attr_renesas_p ())
7515 return ptr_type_node;
7516
7517 record = (*lang_hooks.types.make_type) (RECORD_TYPE);
7518 type_decl = build_decl (BUILTINS_LOCATION,
7519 TYPE_DECL, get_identifier ("__va_list_tag"), record);
7520
7521 f_next_o = build_decl (BUILTINS_LOCATION,
7522 FIELD_DECL, get_identifier ("__va_next_o"),
7523 ptr_type_node);
7524 f_next_o_limit = build_decl (BUILTINS_LOCATION,
7525 FIELD_DECL,
7526 get_identifier ("__va_next_o_limit"),
7527 ptr_type_node);
7528 f_next_fp = build_decl (BUILTINS_LOCATION,
7529 FIELD_DECL, get_identifier ("__va_next_fp"),
7530 ptr_type_node);
7531 f_next_fp_limit = build_decl (BUILTINS_LOCATION,
7532 FIELD_DECL,
7533 get_identifier ("__va_next_fp_limit"),
7534 ptr_type_node);
7535 f_next_stack = build_decl (BUILTINS_LOCATION,
7536 FIELD_DECL, get_identifier ("__va_next_stack"),
7537 ptr_type_node);
7538
7539 DECL_FIELD_CONTEXT (f_next_o) = record;
7540 DECL_FIELD_CONTEXT (f_next_o_limit) = record;
7541 DECL_FIELD_CONTEXT (f_next_fp) = record;
7542 DECL_FIELD_CONTEXT (f_next_fp_limit) = record;
7543 DECL_FIELD_CONTEXT (f_next_stack) = record;
7544
7545 TYPE_STUB_DECL (record) = type_decl;
7546 TYPE_NAME (record) = type_decl;
7547 TYPE_FIELDS (record) = f_next_o;
7548 DECL_CHAIN (f_next_o) = f_next_o_limit;
7549 DECL_CHAIN (f_next_o_limit) = f_next_fp;
7550 DECL_CHAIN (f_next_fp) = f_next_fp_limit;
7551 DECL_CHAIN (f_next_fp_limit) = f_next_stack;
7552
7553 layout_type (record);
7554
7555 return record;
7556 }
7557
7558 /* Implement `va_start' for varargs and stdarg. */
7559 static void
7560 sh_va_start (tree valist, rtx nextarg)
7561 {
7562 tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
7563 tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack;
7564 tree t, u;
7565 int nfp, nint;
7566
7567 if ((! TARGET_SH2E && ! TARGET_SH4)
7568 || TARGET_HITACHI || sh_cfun_attr_renesas_p ())
7569 {
7570 std_expand_builtin_va_start (valist, nextarg);
7571 return;
7572 }
7573
7574 f_next_o = TYPE_FIELDS (va_list_type_node);
7575 f_next_o_limit = DECL_CHAIN (f_next_o);
7576 f_next_fp = DECL_CHAIN (f_next_o_limit);
7577 f_next_fp_limit = DECL_CHAIN (f_next_fp);
7578 f_next_stack = DECL_CHAIN (f_next_fp_limit);
7579
7580 next_o = build3 (COMPONENT_REF, TREE_TYPE (f_next_o), valist, f_next_o,
7581 NULL_TREE);
7582 next_o_limit = build3 (COMPONENT_REF, TREE_TYPE (f_next_o_limit),
7583 valist, f_next_o_limit, NULL_TREE);
7584 next_fp = build3 (COMPONENT_REF, TREE_TYPE (f_next_fp), valist, f_next_fp,
7585 NULL_TREE);
7586 next_fp_limit = build3 (COMPONENT_REF, TREE_TYPE (f_next_fp_limit),
7587 valist, f_next_fp_limit, NULL_TREE);
7588 next_stack = build3 (COMPONENT_REF, TREE_TYPE (f_next_stack),
7589 valist, f_next_stack, NULL_TREE);
7590
7591 /* Call __builtin_saveregs. */
7592 u = make_tree (sizetype, expand_builtin_saveregs ());
7593 u = fold_convert (ptr_type_node, u);
7594 t = build2 (MODIFY_EXPR, ptr_type_node, next_fp, u);
7595 TREE_SIDE_EFFECTS (t) = 1;
7596 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
7597
7598 nfp = crtl->args.info.arg_count[SH_ARG_FLOAT];
7599 if (nfp < 8)
7600 nfp = 8 - nfp;
7601 else
7602 nfp = 0;
7603 u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nfp);
7604 t = build2 (MODIFY_EXPR, ptr_type_node, next_fp_limit, u);
7605 TREE_SIDE_EFFECTS (t) = 1;
7606 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
7607
7608 t = build2 (MODIFY_EXPR, ptr_type_node, next_o, u);
7609 TREE_SIDE_EFFECTS (t) = 1;
7610 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
7611
7612 nint = crtl->args.info.arg_count[SH_ARG_INT];
7613 if (nint < 4)
7614 nint = 4 - nint;
7615 else
7616 nint = 0;
7617 u = fold_build_pointer_plus_hwi (u, UNITS_PER_WORD * nint);
7618 t = build2 (MODIFY_EXPR, ptr_type_node, next_o_limit, u);
7619 TREE_SIDE_EFFECTS (t) = 1;
7620 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
7621
7622 u = make_tree (ptr_type_node, nextarg);
7623 t = build2 (MODIFY_EXPR, ptr_type_node, next_stack, u);
7624 TREE_SIDE_EFFECTS (t) = 1;
7625 expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
7626 }
7627
7628 /* TYPE is a RECORD_TYPE. If there is only a single nonzero-sized
7629 member, return it. */
7630 static tree
7631 find_sole_member (tree type)
7632 {
7633 tree field, member = NULL_TREE;
7634
7635 for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
7636 {
7637 if (TREE_CODE (field) != FIELD_DECL)
7638 continue;
7639 if (!DECL_SIZE (field))
7640 return NULL_TREE;
7641 if (integer_zerop (DECL_SIZE (field)))
7642 continue;
7643 if (member)
7644 return NULL_TREE;
7645 member = field;
7646 }
7647 return member;
7648 }
7649
7650 /* Implement `va_arg'. */
7651 static tree
7652 sh_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
7653 gimple_seq *post_p ATTRIBUTE_UNUSED)
7654 {
7655 tree tmp;
7656 tree addr, lab_over = NULL, result = NULL;
7657 tree eff_type;
7658
7659 const bool pass_by_ref
7660 = !VOID_TYPE_P (type) && must_pass_va_arg_in_stack (type);
7661
7662 if (pass_by_ref)
7663 type = build_pointer_type (type);
7664
7665 HOST_WIDE_INT size = int_size_in_bytes (type);
7666 HOST_WIDE_INT rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD;
7667 tree pptr_type_node = build_pointer_type (ptr_type_node);
7668
7669 if ((TARGET_SH2E || TARGET_SH4)
7670 && ! (TARGET_HITACHI || sh_cfun_attr_renesas_p ()))
7671 {
7672 tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack;
7673 tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack;
7674 tree lab_false;
7675 tree member;
7676
7677 f_next_o = TYPE_FIELDS (va_list_type_node);
7678 f_next_o_limit = DECL_CHAIN (f_next_o);
7679 f_next_fp = DECL_CHAIN (f_next_o_limit);
7680 f_next_fp_limit = DECL_CHAIN (f_next_fp);
7681 f_next_stack = DECL_CHAIN (f_next_fp_limit);
7682
7683 next_o = build3 (COMPONENT_REF, TREE_TYPE (f_next_o), valist, f_next_o,
7684 NULL_TREE);
7685 next_o_limit = build3 (COMPONENT_REF, TREE_TYPE (f_next_o_limit),
7686 valist, f_next_o_limit, NULL_TREE);
7687 next_fp = build3 (COMPONENT_REF, TREE_TYPE (f_next_fp),
7688 valist, f_next_fp, NULL_TREE);
7689 next_fp_limit = build3 (COMPONENT_REF, TREE_TYPE (f_next_fp_limit),
7690 valist, f_next_fp_limit, NULL_TREE);
7691 next_stack = build3 (COMPONENT_REF, TREE_TYPE (f_next_stack),
7692 valist, f_next_stack, NULL_TREE);
7693
7694 /* Structures with a single member with a distinct mode are passed
7695 like their member. This is relevant if the latter has a REAL_TYPE
7696 or COMPLEX_TYPE type. */
7697 eff_type = type;
7698 while (TREE_CODE (eff_type) == RECORD_TYPE
7699 && (member = find_sole_member (eff_type))
7700 && (TREE_CODE (TREE_TYPE (member)) == REAL_TYPE
7701 || TREE_CODE (TREE_TYPE (member)) == COMPLEX_TYPE
7702 || TREE_CODE (TREE_TYPE (member)) == RECORD_TYPE))
7703 {
7704 tree field_type = TREE_TYPE (member);
7705
7706 if (TYPE_MODE (eff_type) == TYPE_MODE (field_type))
7707 eff_type = field_type;
7708 else
7709 {
7710 gcc_assert ((TYPE_ALIGN (eff_type)
7711 < GET_MODE_ALIGNMENT (TYPE_MODE (field_type)))
7712 || (TYPE_ALIGN (eff_type)
7713 > GET_MODE_BITSIZE (TYPE_MODE (field_type))));
7714 break;
7715 }
7716 }
7717
7718 bool pass_as_float;
7719 if (TARGET_FPU_DOUBLE)
7720 {
7721 pass_as_float = ((TREE_CODE (eff_type) == REAL_TYPE && size <= 8)
7722 || (TREE_CODE (eff_type) == COMPLEX_TYPE
7723 && TREE_CODE (TREE_TYPE (eff_type)) == REAL_TYPE
7724 && size <= 16));
7725 }
7726 else
7727 {
7728 pass_as_float = (TREE_CODE (eff_type) == REAL_TYPE && size == 4);
7729 }
7730
7731 addr = create_tmp_var (pptr_type_node);
7732 lab_false = create_artificial_label (UNKNOWN_LOCATION);
7733 lab_over = create_artificial_label (UNKNOWN_LOCATION);
7734
7735 valist = build_simple_mem_ref (addr);
7736
7737 if (pass_as_float)
7738 {
7739 tree next_fp_tmp = create_tmp_var (TREE_TYPE (f_next_fp));
7740 tree cmp;
7741 bool is_double = size == 8 && TREE_CODE (eff_type) == REAL_TYPE;
7742
7743 tmp = build1 (ADDR_EXPR, pptr_type_node, unshare_expr (next_fp));
7744 gimplify_assign (unshare_expr (addr), tmp, pre_p);
7745
7746 gimplify_assign (unshare_expr (next_fp_tmp), valist, pre_p);
7747 tmp = next_fp_limit;
7748 if (size > 4 && !is_double)
7749 tmp = fold_build_pointer_plus_hwi (unshare_expr (tmp), 4 - size);
7750 tmp = build2 (GE_EXPR, boolean_type_node,
7751 unshare_expr (next_fp_tmp), unshare_expr (tmp));
7752 cmp = build3 (COND_EXPR, void_type_node, tmp,
7753 build1 (GOTO_EXPR, void_type_node,
7754 unshare_expr (lab_false)), NULL_TREE);
7755 if (!is_double)
7756 gimplify_and_add (cmp, pre_p);
7757
7758 if (TYPE_ALIGN (eff_type) > BITS_PER_WORD
7759 || (is_double || size == 16))
7760 {
7761 tmp = fold_convert (sizetype, next_fp_tmp);
7762 tmp = build2 (BIT_AND_EXPR, sizetype, tmp,
7763 size_int (UNITS_PER_WORD));
7764 tmp = fold_build_pointer_plus (unshare_expr (next_fp_tmp), tmp);
7765 gimplify_assign (unshare_expr (next_fp_tmp), tmp, pre_p);
7766 }
7767 if (is_double)
7768 gimplify_and_add (cmp, pre_p);
7769
7770 #ifdef FUNCTION_ARG_SCmode_WART
7771 if (TYPE_MODE (eff_type) == SCmode
7772 && TARGET_SH4 && TARGET_LITTLE_ENDIAN)
7773 {
7774 tree subtype = TREE_TYPE (eff_type);
7775 tree real, imag;
7776
7777 imag
7778 = std_gimplify_va_arg_expr (next_fp_tmp, subtype, pre_p, NULL);
7779 imag = get_initialized_tmp_var (imag, pre_p, NULL);
7780
7781 real
7782 = std_gimplify_va_arg_expr (next_fp_tmp, subtype, pre_p, NULL);
7783 real = get_initialized_tmp_var (real, pre_p, NULL);
7784
7785 result = build2 (COMPLEX_EXPR, eff_type, real, imag);
7786 if (type != eff_type)
7787 result = build1 (VIEW_CONVERT_EXPR, type, result);
7788 result = get_initialized_tmp_var (result, pre_p, NULL);
7789 }
7790 #endif /* FUNCTION_ARG_SCmode_WART */
7791
7792 tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (lab_over));
7793 gimplify_and_add (tmp, pre_p);
7794
7795 tmp = build1 (LABEL_EXPR, void_type_node, unshare_expr (lab_false));
7796 gimplify_and_add (tmp, pre_p);
7797
7798 tmp = build1 (ADDR_EXPR, pptr_type_node, unshare_expr (next_stack));
7799 gimplify_assign (unshare_expr (addr), tmp, pre_p);
7800 gimplify_assign (unshare_expr (next_fp_tmp),
7801 unshare_expr (valist), pre_p);
7802
7803 gimplify_assign (unshare_expr (valist),
7804 unshare_expr (next_fp_tmp), post_p);
7805 valist = next_fp_tmp;
7806 }
7807 else
7808 {
7809 tmp = fold_build_pointer_plus_hwi (unshare_expr (next_o), rsize);
7810 tmp = build2 (GT_EXPR, boolean_type_node, tmp,
7811 unshare_expr (next_o_limit));
7812 tmp = build3 (COND_EXPR, void_type_node, tmp,
7813 build1 (GOTO_EXPR, void_type_node,
7814 unshare_expr (lab_false)),
7815 NULL_TREE);
7816 gimplify_and_add (tmp, pre_p);
7817
7818 tmp = build1 (ADDR_EXPR, pptr_type_node, unshare_expr (next_o));
7819 gimplify_assign (unshare_expr (addr), tmp, pre_p);
7820
7821 tmp = build1 (GOTO_EXPR, void_type_node, unshare_expr (lab_over));
7822 gimplify_and_add (tmp, pre_p);
7823
7824 tmp = build1 (LABEL_EXPR, void_type_node, unshare_expr (lab_false));
7825 gimplify_and_add (tmp, pre_p);
7826
7827 if (size > 4 && ! (TARGET_SH4 || TARGET_SH2A))
7828 gimplify_assign (unshare_expr (next_o),
7829 unshare_expr (next_o_limit), pre_p);
7830
7831 tmp = build1 (ADDR_EXPR, pptr_type_node, unshare_expr (next_stack));
7832 gimplify_assign (unshare_expr (addr), tmp, pre_p);
7833 }
7834
7835 if (!result)
7836 {
7837 tmp = build1 (LABEL_EXPR, void_type_node, unshare_expr (lab_over));
7838 gimplify_and_add (tmp, pre_p);
7839 }
7840 }
7841
7842 /* ??? In va-sh.h, there had been code to make values larger than
7843 size 8 indirect. This does not match the FUNCTION_ARG macros. */
7844
7845 tmp = std_gimplify_va_arg_expr (valist, type, pre_p, NULL);
7846 if (result)
7847 {
7848 gimplify_assign (result, tmp, pre_p);
7849 result = build1 (NOP_EXPR, TREE_TYPE (result), result);
7850 tmp = build1 (LABEL_EXPR, void_type_node, unshare_expr (lab_over));
7851 gimplify_and_add (tmp, pre_p);
7852 }
7853 else
7854 result = tmp;
7855
7856 if (pass_by_ref)
7857 result = build_va_arg_indirect_ref (result);
7858
7859 return result;
7860 }
7861
7862 /* 64 bit floating points memory transfers are paired single precision loads
7863 or store. So DWARF information needs fixing in little endian (unless
7864 PR=SZ=1 in FPSCR). */
7865 rtx
7866 sh_dwarf_register_span (rtx reg)
7867 {
7868 unsigned regno = REGNO (reg);
7869
7870 if (WORDS_BIG_ENDIAN || GET_MODE (reg) != DFmode)
7871 return NULL_RTX;
7872
7873 return
7874 gen_rtx_PARALLEL (VOIDmode,
7875 gen_rtvec (2,
7876 gen_rtx_REG (SFmode, regno + 1),
7877 gen_rtx_REG (SFmode, regno)));
7878 }
7879
7880 static machine_mode
7881 sh_promote_function_mode (const_tree type, machine_mode mode,
7882 int *punsignedp, const_tree funtype,
7883 int for_return)
7884 {
7885 if (sh_promote_prototypes (funtype))
7886 return promote_mode (type, mode, punsignedp);
7887 else
7888 return default_promote_function_mode (type, mode, punsignedp, funtype,
7889 for_return);
7890 }
7891
7892 static bool
7893 sh_promote_prototypes (const_tree type)
7894 {
7895 if (TARGET_HITACHI)
7896 return false;
7897 if (! type)
7898 return true;
7899 return ! sh_attr_renesas_p (type);
7900 }
7901
7902 static bool
7903 sh_pass_by_reference (cumulative_args_t cum_v, const function_arg_info &arg)
7904 {
7905 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
7906
7907 if (targetm.calls.must_pass_in_stack (arg))
7908 return true;
7909
7910 /* ??? std_gimplify_va_arg_expr passes NULL for cum. That function
7911 wants to know about pass-by-reference semantics for incoming
7912 arguments. */
7913 if (! cum)
7914 return false;
7915
7916 return false;
7917 }
7918
7919 static bool
7920 sh_callee_copies (cumulative_args_t cum, const function_arg_info &arg)
7921 {
7922 /* ??? How can it possibly be correct to return true only on the
7923 caller side of the equation? Is there someplace else in the
7924 sh backend that's magically producing the copies? */
7925 return (get_cumulative_args (cum)->outgoing
7926 && ((arg.mode == BLKmode
7927 ? TYPE_ALIGN (arg.type)
7928 : GET_MODE_ALIGNMENT (arg.mode))
7929 % SH_MIN_ALIGN_FOR_CALLEE_COPY == 0));
7930 }
7931
7932 static sh_arg_class
7933 get_sh_arg_class (machine_mode mode)
7934 {
7935 if (TARGET_FPU_ANY && mode == SFmode)
7936 return SH_ARG_FLOAT;
7937
7938 if (TARGET_FPU_DOUBLE
7939 && (GET_MODE_CLASS (mode) == MODE_FLOAT
7940 || GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT))
7941 return SH_ARG_FLOAT;
7942
7943 return SH_ARG_INT;
7944 }
7945
7946 /* Round a register number up to a proper boundary for an arg of mode
7947 MODE.
7948 The SH doesn't care about double alignment, so we only
7949 round doubles to even regs when asked to explicitly. */
7950 static int
7951 sh_round_reg (const CUMULATIVE_ARGS& cum, machine_mode mode)
7952 {
7953 /* FIXME: This used to be a macro and has been copy pasted into this
7954 function as is. Make this more readable. */
7955 return
7956 (((TARGET_ALIGN_DOUBLE
7957 || (TARGET_FPU_DOUBLE
7958 && (mode == DFmode || mode == DCmode)
7959 && cum.arg_count[(int) SH_ARG_FLOAT] < NPARM_REGS (mode)))
7960 && GET_MODE_UNIT_SIZE (mode) > UNITS_PER_WORD)
7961 ? (cum.arg_count[(int) get_sh_arg_class (mode)]
7962 + (cum.arg_count[(int) get_sh_arg_class (mode)] & 1))
7963 : cum.arg_count[(int) get_sh_arg_class (mode)]);
7964 }
7965
7966 /* Return true if arg of the specified mode should be passed in a register
7967 or false otherwise. */
7968 static bool
7969 sh_pass_in_reg_p (const CUMULATIVE_ARGS& cum, machine_mode mode,
7970 const_tree type)
7971 {
7972 /* FIXME: This used to be a macro and has been copy pasted into this
7973 function as is. Make this more readable. */
7974 return
7975 ((type == 0
7976 || (! TREE_ADDRESSABLE (type)
7977 && (! (TARGET_HITACHI || cum.renesas_abi)
7978 || ! (AGGREGATE_TYPE_P (type)
7979 || (!TARGET_FPU_ANY
7980 && (GET_MODE_CLASS (mode) == MODE_FLOAT
7981 && GET_MODE_SIZE (mode) > GET_MODE_SIZE (SFmode)))))))
7982 && ! cum.force_mem
7983 && (TARGET_SH2E
7984 ? ((mode) == BLKmode
7985 ? ((cum.arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD
7986 + int_size_in_bytes (type))
7987 <= NPARM_REGS (SImode) * UNITS_PER_WORD)
7988 : ((sh_round_reg (cum, mode)
7989 + sh_hard_regno_nregs (BASE_ARG_REG (mode), mode))
7990 <= NPARM_REGS (mode)))
7991 : sh_round_reg (cum, mode) < NPARM_REGS (mode)));
7992 }
7993
7994 static int
7995 sh_arg_partial_bytes (cumulative_args_t cum_v, const function_arg_info &arg)
7996 {
7997 CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
7998 int words = 0;
7999
8000 if (sh_pass_in_reg_p (*cum, arg.mode, arg.type)
8001 && !TARGET_FPU_DOUBLE
8002 && (sh_round_reg (*cum, arg.mode)
8003 + CEIL (arg.promoted_size_in_bytes (), UNITS_PER_WORD)
8004 > NPARM_REGS (arg.mode)))
8005 words = NPARM_REGS (arg.mode) - sh_round_reg (*cum, arg.mode);
8006
8007 return words * UNITS_PER_WORD;
8008 }
8009
8010
8011 /* Define where to put the arguments to a function.
8012 Value is zero to push the argument on the stack,
8013 or a hard register in which to store the argument.
8014
8015 CUM is a variable of type CUMULATIVE_ARGS which gives info about
8016 the preceding args and about the function being called.
8017 ARG is a description of the argument.
8018
8019 On SH the first args are normally in registers
8020 and the rest are pushed. Any arg that starts within the first
8021 NPARM_REGS words is at least partially passed in a register unless
8022 its data type forbids. */
8023 static rtx
8024 sh_function_arg (cumulative_args_t ca_v, const function_arg_info &arg)
8025 {
8026 CUMULATIVE_ARGS *ca = get_cumulative_args (ca_v);
8027 machine_mode mode = arg.mode;
8028
8029 if (arg.end_marker_p ())
8030 return ca->renesas_abi ? const1_rtx : const0_rtx;
8031
8032 if (sh_pass_in_reg_p (*ca, mode, arg.type)
8033 && (arg.named || ! (TARGET_HITACHI || ca->renesas_abi)))
8034 {
8035 int regno;
8036
8037 if (mode == SCmode && TARGET_SH4 && TARGET_LITTLE_ENDIAN
8038 && (! FUNCTION_ARG_SCmode_WART || (sh_round_reg (*ca, mode) & 1)))
8039 {
8040 rtx r1 = gen_rtx_EXPR_LIST (VOIDmode,
8041 gen_rtx_REG (SFmode,
8042 BASE_ARG_REG (mode)
8043 + (sh_round_reg (*ca, mode) ^ 1)),
8044 const0_rtx);
8045 rtx r2 = gen_rtx_EXPR_LIST (VOIDmode,
8046 gen_rtx_REG (SFmode,
8047 BASE_ARG_REG (mode)
8048 + ((sh_round_reg (*ca, mode) + 1) ^ 1)),
8049 GEN_INT (4));
8050 return gen_rtx_PARALLEL(SCmode, gen_rtvec(2, r1, r2));
8051 }
8052
8053 /* If the alignment of a DF value causes an SF register to be
8054 skipped, we will use that skipped register for the next SF
8055 value. */
8056 if ((TARGET_HITACHI || ca->renesas_abi)
8057 && ca->free_single_fp_reg
8058 && mode == SFmode)
8059 return gen_rtx_REG (mode, ca->free_single_fp_reg);
8060
8061 regno = (BASE_ARG_REG (mode) + sh_round_reg (*ca, mode))
8062 ^ (mode == SFmode && TARGET_SH4
8063 && TARGET_LITTLE_ENDIAN
8064 && ! TARGET_HITACHI && ! ca->renesas_abi);
8065 return gen_rtx_REG (mode, regno);
8066
8067 }
8068
8069 return NULL_RTX;
8070 }
8071
8072 /* Update the data in CUM to advance over argument ARG. */
8073 static void
8074 sh_function_arg_advance (cumulative_args_t ca_v,
8075 const function_arg_info &arg)
8076 {
8077 CUMULATIVE_ARGS *ca = get_cumulative_args (ca_v);
8078
8079 if (ca->force_mem)
8080 ca->force_mem = false;
8081
8082 if ((TARGET_HITACHI || ca->renesas_abi) && TARGET_FPU_DOUBLE)
8083 {
8084 /* Note that we've used the skipped register. */
8085 if (arg.mode == SFmode && ca->free_single_fp_reg)
8086 {
8087 ca->free_single_fp_reg = 0;
8088 return;
8089 }
8090 /* When we have a DF after an SF, there's an SF register that get
8091 skipped in order to align the DF value. We note this skipped
8092 register, because the next SF value will use it, and not the
8093 SF that follows the DF. */
8094 if (arg.mode == DFmode
8095 && sh_round_reg (*ca, DFmode) != sh_round_reg (*ca, SFmode))
8096 {
8097 ca->free_single_fp_reg = (sh_round_reg (*ca, SFmode)
8098 + BASE_ARG_REG (arg.mode));
8099 }
8100 }
8101
8102 if (! ((TARGET_SH4 || TARGET_SH2A) || ca->renesas_abi)
8103 || sh_pass_in_reg_p (*ca, arg.mode, arg.type))
8104 (ca->arg_count[(int) get_sh_arg_class (arg.mode)]
8105 = (sh_round_reg (*ca, arg.mode)
8106 + CEIL (arg.promoted_size_in_bytes (), UNITS_PER_WORD)));
8107 }
8108
8109 /* The Renesas calling convention doesn't quite fit into this scheme since
8110 the address is passed like an invisible argument, but one that is always
8111 passed in memory. */
8112 static rtx
8113 sh_struct_value_rtx (tree fndecl, int incoming ATTRIBUTE_UNUSED)
8114 {
8115 if (TARGET_HITACHI || sh_attr_renesas_p (fndecl))
8116 return NULL_RTX;
8117 return gen_rtx_REG (Pmode, 2);
8118 }
8119
8120 /* Worker function for TARGET_FUNCTION_VALUE.
8121
8122 For the SH, this is like LIBCALL_VALUE, except that we must change the
8123 mode like PROMOTE_MODE does.
8124 ??? PROMOTE_MODE is ignored for non-scalar types. The set of types
8125 tested here has to be kept in sync with the one in
8126 explow.c:promote_mode. */
8127 static rtx
8128 sh_function_value (const_tree valtype,
8129 const_tree fn_decl_or_type,
8130 bool outgoing ATTRIBUTE_UNUSED)
8131 {
8132 if (fn_decl_or_type
8133 && !DECL_P (fn_decl_or_type))
8134 fn_decl_or_type = NULL;
8135
8136 return gen_rtx_REG (
8137 ((GET_MODE_CLASS (TYPE_MODE (valtype)) == MODE_INT
8138 && GET_MODE_SIZE (TYPE_MODE (valtype)) < 4
8139 && (TREE_CODE (valtype) == INTEGER_TYPE
8140 || TREE_CODE (valtype) == ENUMERAL_TYPE
8141 || TREE_CODE (valtype) == BOOLEAN_TYPE
8142 || TREE_CODE (valtype) == REAL_TYPE
8143 || TREE_CODE (valtype) == OFFSET_TYPE))
8144 && sh_promote_prototypes (fn_decl_or_type)
8145 ? SImode : TYPE_MODE (valtype)),
8146 BASE_RETURN_VALUE_REG (TYPE_MODE (valtype)));
8147 }
8148
8149 /* Worker function for TARGET_LIBCALL_VALUE. */
8150 static rtx
8151 sh_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED)
8152 {
8153 return gen_rtx_REG (mode, BASE_RETURN_VALUE_REG (mode));
8154 }
8155
8156 /* Return true if N is a possible register number of function value. */
8157 static bool
8158 sh_function_value_regno_p (const unsigned int regno)
8159 {
8160 return regno == FIRST_RET_REG || (TARGET_SH2E && regno == FIRST_FP_RET_REG);
8161 }
8162
8163 /* Worker function for TARGET_RETURN_IN_MEMORY. */
8164 static bool
8165 sh_return_in_memory (const_tree type, const_tree fndecl)
8166 {
8167 return TYPE_MODE (type) == BLKmode
8168 || ((TARGET_HITACHI || sh_attr_renesas_p (fndecl))
8169 && TREE_CODE (type) == RECORD_TYPE);
8170 }
8171
8172 /* We actually emit the code in sh_expand_prologue. We used to use
8173 a static variable to flag that we need to emit this code, but that
8174 doesn't when inlining, when functions are deferred and then emitted
8175 later. Fortunately, we already have two flags that are part of struct
8176 function that tell if a function uses varargs or stdarg. */
8177 static void
8178 sh_setup_incoming_varargs (cumulative_args_t ca,
8179 const function_arg_info &arg,
8180 int *pretend_arg_size,
8181 int second_time ATTRIBUTE_UNUSED)
8182 {
8183 gcc_assert (cfun->stdarg);
8184 if (TARGET_VARARGS_PRETEND_ARGS (current_function_decl))
8185 {
8186 int named_parm_regs, anon_parm_regs;
8187
8188 named_parm_regs = (sh_round_reg (*get_cumulative_args (ca), arg.mode)
8189 + CEIL (arg.promoted_size_in_bytes (),
8190 UNITS_PER_WORD));
8191 anon_parm_regs = NPARM_REGS (SImode) - named_parm_regs;
8192 if (anon_parm_regs > 0)
8193 *pretend_arg_size = anon_parm_regs * 4;
8194 }
8195 }
8196
8197 static bool
8198 sh_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
8199 {
8200 return false;
8201 }
8202
8203 static bool
8204 sh_pretend_outgoing_varargs_named (cumulative_args_t ca_v)
8205 {
8206 CUMULATIVE_ARGS *ca = get_cumulative_args (ca_v);
8207
8208 return ! (TARGET_HITACHI || ca->renesas_abi);
8209 }
8210
8211
8212 /* Define the offset between two registers, one to be eliminated, and
8213 the other its replacement, at the start of a routine. */
8214 int
8215 initial_elimination_offset (int from, int to)
8216 {
8217 const int regs_saved_rounding = 0;
8218 int save_flags = target_flags;
8219 HARD_REG_SET live_regs_mask;
8220
8221 int regs_saved = calc_live_regs (&live_regs_mask);
8222
8223 int total_auto_space = rounded_frame_size (regs_saved) - regs_saved_rounding;
8224 target_flags = save_flags;
8225
8226 int total_saved_regs_space = regs_saved + regs_saved_rounding;
8227
8228 if (from == ARG_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
8229 return total_saved_regs_space + total_auto_space;
8230
8231 if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
8232 return total_saved_regs_space + total_auto_space;
8233
8234 /* Initial gap between fp and sp is 0. */
8235 if (from == HARD_FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
8236 return 0;
8237
8238 if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
8239 return rounded_frame_size (0);
8240
8241 if (from == FRAME_POINTER_REGNUM && to == HARD_FRAME_POINTER_REGNUM)
8242 return rounded_frame_size (0);
8243
8244 gcc_assert (from == RETURN_ADDRESS_POINTER_REGNUM
8245 && (to == HARD_FRAME_POINTER_REGNUM
8246 || to == STACK_POINTER_REGNUM));
8247 return total_auto_space;
8248 }
8249
8250 /* Parse the -mfixed-range= option string. */
8251 void
8252 sh_fix_range (const char *const_str)
8253 {
8254 /* str must be of the form REG1'-'REG2{,REG1'-'REG} where REG1 and
8255 REG2 are either register names or register numbers. The effect
8256 of this option is to mark the registers in the range from REG1 to
8257 REG2 as ``fixed'' so they won't be used by the compiler. */
8258
8259 char* str = strcpy ((char*)alloca (strlen (const_str) + 1), const_str);
8260
8261 while (1)
8262 {
8263 char* dash = strchr (str, '-');
8264 if (!dash)
8265 {
8266 warning (0, "value of %<-mfixed-range%> must have form REG1-REG2");
8267 return;
8268 }
8269 *dash = '\0';
8270 char* comma = strchr (dash + 1, ',');
8271 if (comma)
8272 *comma = '\0';
8273
8274 int first = decode_reg_name (str);
8275 if (first < 0)
8276 {
8277 warning (0, "unknown register name: %s", str);
8278 return;
8279 }
8280
8281 int last = decode_reg_name (dash + 1);
8282 if (last < 0)
8283 {
8284 warning (0, "unknown register name: %s", dash + 1);
8285 return;
8286 }
8287
8288 *dash = '-';
8289
8290 if (first > last)
8291 {
8292 warning (0, "%s-%s is an empty range", str, dash + 1);
8293 return;
8294 }
8295
8296 for (int i = first; i <= last; ++i)
8297 fixed_regs[i] = 1;
8298
8299 if (!comma)
8300 break;
8301
8302 *comma = ',';
8303 str = comma + 1;
8304 }
8305 }
8306 \f
8307 /* Insert any deferred function attributes from earlier pragmas. */
8308 static void
8309 sh_insert_attributes (tree node, tree *attributes)
8310 {
8311 if (TREE_CODE (node) != FUNCTION_DECL)
8312 return;
8313
8314 /* We are only interested in fields. */
8315 if (!DECL_P (node))
8316 return;
8317
8318 /* Append the attributes to the deferred attributes. */
8319 *sh_deferred_function_attributes_tail = *attributes;
8320 tree attrs = sh_deferred_function_attributes;
8321 if (!attrs)
8322 return;
8323
8324 /* Some attributes imply or require the interrupt attribute. */
8325 if (!lookup_attribute ("interrupt_handler", attrs)
8326 && !lookup_attribute ("interrupt_handler", DECL_ATTRIBUTES (node)))
8327 {
8328 /* If we have a trapa_handler, but no interrupt_handler attribute,
8329 insert an interrupt_handler attribute. */
8330 if (lookup_attribute ("trapa_handler", attrs) != NULL_TREE)
8331 /* We can't use sh_pr_interrupt here because that's not in the
8332 java frontend. */
8333 attrs
8334 = tree_cons (get_identifier("interrupt_handler"), NULL_TREE, attrs);
8335 /* However, for sp_switch, trap_exit, nosave_low_regs and resbank,
8336 if the interrupt attribute is missing, we ignore the attribute
8337 and warn. */
8338 else if (lookup_attribute ("sp_switch", attrs)
8339 || lookup_attribute ("trap_exit", attrs)
8340 || lookup_attribute ("nosave_low_regs", attrs)
8341 || lookup_attribute ("resbank", attrs))
8342 {
8343 tree *tail;
8344
8345 for (tail = attributes; attrs; attrs = TREE_CHAIN (attrs))
8346 {
8347 if (is_attribute_p ("sp_switch", TREE_PURPOSE (attrs))
8348 || is_attribute_p ("trap_exit", TREE_PURPOSE (attrs))
8349 || is_attribute_p ("nosave_low_regs", TREE_PURPOSE (attrs))
8350 || is_attribute_p ("resbank", TREE_PURPOSE (attrs)))
8351 warning (OPT_Wattributes,
8352 "%qE attribute only applies to interrupt functions",
8353 TREE_PURPOSE (attrs));
8354 else
8355 {
8356 *tail = tree_cons (TREE_PURPOSE (attrs), NULL_TREE,
8357 NULL_TREE);
8358 tail = &TREE_CHAIN (*tail);
8359 }
8360 }
8361 attrs = *attributes;
8362 }
8363 }
8364
8365 /* Install the processed list. */
8366 *attributes = attrs;
8367
8368 /* Clear deferred attributes. */
8369 sh_deferred_function_attributes = NULL_TREE;
8370 sh_deferred_function_attributes_tail = &sh_deferred_function_attributes;
8371
8372 return;
8373 }
8374
8375 /*------------------------------------------------------------------------------
8376 Target specific attributes
8377 Supported attributes are:
8378
8379 * interrupt_handler
8380 Specifies this function is an interrupt handler.
8381
8382 * trapa_handler
8383 Like interrupt_handler, but don't save all registers.
8384
8385 * sp_switch
8386 Specifies an alternate stack for an interrupt handler to run on.
8387
8388 * trap_exit
8389 Use a trapa to exit an interrupt function instead of rte.
8390
8391 * nosave_low_regs
8392 Don't save r0..r7 in an interrupt handler function.
8393 This is useful on SH3* and SH4*, which have a separate set of low
8394 regs for user and privileged modes.
8395 This is mainly to be used for non-reentrant interrupt handlers (i.e.
8396 those that run with interrupts disabled and thus can't be
8397 interrupted thenselves).
8398
8399 * renesas
8400 Use Renesas calling/layout conventions (functions and structures).
8401
8402 * resbank
8403 In case of an interrupt handler function, use a register bank to
8404 save registers R0-R14, MACH, MACL, GBR and PR.
8405 This is available only on SH2A targets.
8406
8407 * function_vector
8408 Declares a function to be called using the TBR relative addressing
8409 mode. Takes an argument that specifies the slot number in the table
8410 where this function can be looked up by the JSR/N @@(disp8,TBR) insn.
8411 */
8412
8413 /* Handle a 'resbank' attribute. */
8414 static tree
8415 sh_handle_resbank_handler_attribute (tree * node, tree name,
8416 tree args ATTRIBUTE_UNUSED,
8417 int flags ATTRIBUTE_UNUSED,
8418 bool * no_add_attrs)
8419 {
8420 if (!TARGET_SH2A)
8421 {
8422 warning (OPT_Wattributes, "%qE attribute is supported only for SH2A",
8423 name);
8424 *no_add_attrs = true;
8425 }
8426 if (TREE_CODE (*node) != FUNCTION_DECL)
8427 {
8428 warning (OPT_Wattributes, "%qE attribute only applies to functions",
8429 name);
8430 *no_add_attrs = true;
8431 }
8432
8433 return NULL_TREE;
8434 }
8435
8436 /* Handle an "interrupt_handler" attribute; arguments as in
8437 struct attribute_spec.handler. */
8438 static tree
8439 sh_handle_interrupt_handler_attribute (tree *node, tree name,
8440 tree args ATTRIBUTE_UNUSED,
8441 int flags ATTRIBUTE_UNUSED,
8442 bool *no_add_attrs)
8443 {
8444 if (TREE_CODE (*node) != FUNCTION_DECL)
8445 {
8446 warning (OPT_Wattributes, "%qE attribute only applies to functions",
8447 name);
8448 *no_add_attrs = true;
8449 }
8450
8451 return NULL_TREE;
8452 }
8453
8454 /* Handle an 'function_vector' attribute; arguments as in
8455 struct attribute_spec.handler. */
8456 static tree
8457 sh2a_handle_function_vector_handler_attribute (tree * node, tree name,
8458 tree args ATTRIBUTE_UNUSED,
8459 int flags ATTRIBUTE_UNUSED,
8460 bool * no_add_attrs)
8461 {
8462 if (!TARGET_SH2A)
8463 {
8464 warning (OPT_Wattributes, "%qE attribute only applies to SH2A",
8465 name);
8466 *no_add_attrs = true;
8467 }
8468 else if (TREE_CODE (*node) != FUNCTION_DECL)
8469 {
8470 warning (OPT_Wattributes, "%qE attribute only applies to functions",
8471 name);
8472 *no_add_attrs = true;
8473 }
8474 else if (TREE_CODE (TREE_VALUE (args)) != INTEGER_CST)
8475 {
8476 /* The argument must be a constant integer. */
8477 warning (OPT_Wattributes,
8478 "%qE attribute argument not an integer constant",
8479 name);
8480 *no_add_attrs = true;
8481 }
8482 else if (TREE_INT_CST_LOW (TREE_VALUE (args)) > 255)
8483 {
8484 /* The argument value must be between 0 to 255. */
8485 warning (OPT_Wattributes,
8486 "%qE attribute argument should be between 0 to 255",
8487 name);
8488 *no_add_attrs = true;
8489 }
8490 return NULL_TREE;
8491 }
8492
8493 /* Returns true if current function has been assigned the attribute
8494 'function_vector'. */
8495 bool
8496 sh2a_is_function_vector_call (rtx x)
8497 {
8498 if (GET_CODE (x) == SYMBOL_REF
8499 && (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_FUNCVEC_FUNCTION))
8500 {
8501 tree tr = SYMBOL_REF_DECL (x);
8502
8503 if (sh2a_function_vector_p (tr))
8504 return true;
8505 }
8506
8507 return false;
8508 }
8509
8510 /* Returns the function vector number, if the attribute
8511 'function_vector' is assigned, otherwise returns zero. */
8512 int
8513 sh2a_get_function_vector_number (rtx x)
8514 {
8515 if ((GET_CODE (x) == SYMBOL_REF)
8516 && (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_FUNCVEC_FUNCTION))
8517 {
8518 tree t = SYMBOL_REF_DECL (x);
8519
8520 if (TREE_CODE (t) != FUNCTION_DECL)
8521 return 0;
8522
8523 for (tree list = SH_ATTRIBUTES (t); list; list = TREE_CHAIN (list))
8524 if (is_attribute_p ("function_vector", TREE_PURPOSE (list)))
8525 return TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (list)));
8526
8527 return 0;
8528 }
8529 else
8530 return 0;
8531 }
8532
8533 /* Handle an "sp_switch" attribute; arguments as in
8534 struct attribute_spec.handler. */
8535 static tree
8536 sh_handle_sp_switch_attribute (tree *node, tree name, tree args,
8537 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
8538 {
8539 if (TREE_CODE (*node) != FUNCTION_DECL)
8540 {
8541 warning (OPT_Wattributes, "%qE attribute only applies to functions",
8542 name);
8543 *no_add_attrs = true;
8544 }
8545 else if (TREE_CODE (TREE_VALUE (args)) != STRING_CST)
8546 {
8547 /* The argument must be a constant string. */
8548 warning (OPT_Wattributes, "%qE attribute argument not a string constant",
8549 name);
8550 *no_add_attrs = true;
8551 }
8552
8553 return NULL_TREE;
8554 }
8555
8556 /* Handle an "trap_exit" attribute; arguments as in
8557 struct attribute_spec.handler. */
8558 static tree
8559 sh_handle_trap_exit_attribute (tree *node, tree name, tree args,
8560 int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
8561 {
8562 if (TREE_CODE (*node) != FUNCTION_DECL)
8563 {
8564 warning (OPT_Wattributes, "%qE attribute only applies to functions",
8565 name);
8566 *no_add_attrs = true;
8567 }
8568 /* The argument specifies a trap number to be used in a trapa instruction
8569 at function exit (instead of an rte instruction). */
8570 else if (TREE_CODE (TREE_VALUE (args)) != INTEGER_CST)
8571 {
8572 /* The argument must be a constant integer. */
8573 warning (OPT_Wattributes, "%qE attribute argument not an "
8574 "integer constant", name);
8575 *no_add_attrs = true;
8576 }
8577
8578 return NULL_TREE;
8579 }
8580
8581 static tree
8582 sh_handle_renesas_attribute (tree *node ATTRIBUTE_UNUSED,
8583 tree name ATTRIBUTE_UNUSED,
8584 tree args ATTRIBUTE_UNUSED,
8585 int flags ATTRIBUTE_UNUSED,
8586 bool *no_add_attrs ATTRIBUTE_UNUSED)
8587 {
8588 return NULL_TREE;
8589 }
8590
8591 /* True if __attribute__((renesas)) or -mrenesas. */
8592 bool
8593 sh_attr_renesas_p (const_tree td)
8594 {
8595 if (TARGET_HITACHI)
8596 return true;
8597 if (td == NULL_TREE)
8598 return false;
8599 if (DECL_P (td))
8600 td = TREE_TYPE (td);
8601 if (td == error_mark_node)
8602 return false;
8603 return lookup_attribute ("renesas", TYPE_ATTRIBUTES (td)) != NULL_TREE;
8604 }
8605
8606 /* True if __attribute__((renesas)) or -mrenesas, for the current
8607 function. */
8608 bool
8609 sh_cfun_attr_renesas_p (void)
8610 {
8611 return sh_attr_renesas_p (current_function_decl);
8612 }
8613
8614 /* Returns true if the current function has the "interrupt_handler"
8615 attribute set. */
8616 bool
8617 sh_cfun_interrupt_handler_p (void)
8618 {
8619 return (lookup_attribute ("interrupt_handler",
8620 DECL_ATTRIBUTES (current_function_decl))
8621 != NULL_TREE);
8622 }
8623
8624 /* Returns true if FUNC has been assigned the attribute
8625 "function_vector". */
8626 bool
8627 sh2a_function_vector_p (tree func)
8628 {
8629 if (TREE_CODE (func) != FUNCTION_DECL)
8630 return false;
8631
8632 for (tree list = SH_ATTRIBUTES (func); list; list = TREE_CHAIN (list))
8633 if (is_attribute_p ("function_vector", get_attribute_name (list)))
8634 return true;
8635
8636 return false;
8637 }
8638
8639 /* Returns true if given tree has the "resbank" attribute set. */
8640 bool
8641 sh_cfun_resbank_handler_p (void)
8642 {
8643 return ((lookup_attribute ("resbank",
8644 DECL_ATTRIBUTES (current_function_decl))
8645 != NULL_TREE)
8646 && (lookup_attribute ("interrupt_handler",
8647 DECL_ATTRIBUTES (current_function_decl))
8648 != NULL_TREE) && TARGET_SH2A);
8649 }
8650
8651 /* Returns true if the current function has a "trap_exit" attribute set. */
8652 bool
8653 sh_cfun_trap_exit_p (void)
8654 {
8655 return lookup_attribute ("trap_exit", DECL_ATTRIBUTES (current_function_decl))
8656 != NULL_TREE;
8657 }
8658
8659 /* Implement TARGET_CHECK_PCH_TARGET_FLAGS. */
8660 static const char *
8661 sh_check_pch_target_flags (int old_flags)
8662 {
8663 if ((old_flags ^ target_flags) & (MASK_SH1 | MASK_SH2 | MASK_SH3
8664 | MASK_SH_E | MASK_HARD_SH4
8665 | MASK_FPU_SINGLE | MASK_SH4))
8666 return _("created and used with different architectures / ABIs");
8667 if ((old_flags ^ target_flags) & MASK_HITACHI)
8668 return _("created and used with different ABIs");
8669 if ((old_flags ^ target_flags) & MASK_LITTLE_ENDIAN)
8670 return _("created and used with different endianness");
8671 return NULL;
8672 }
8673 \f
8674 /* Predicates used by the templates. */
8675
8676 /* Returns true if OP is MACL, MACH or PR. The input must be a REG rtx.
8677 Used only in general_movsrc_operand. */
8678 bool
8679 system_reg_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
8680 {
8681 switch (REGNO (op))
8682 {
8683 case PR_REG:
8684 case MACL_REG:
8685 case MACH_REG:
8686 return true;
8687 }
8688 return false;
8689 }
8690
8691 /* Returns true if OP is a floating point value with value 0.0. */
8692 bool
8693 fp_zero_operand (rtx op)
8694 {
8695 if (GET_MODE (op) != SFmode)
8696 return false;
8697
8698 const REAL_VALUE_TYPE* r = CONST_DOUBLE_REAL_VALUE (op);
8699 return real_equal (r, &dconst0) && ! REAL_VALUE_MINUS_ZERO (*r);
8700 }
8701
8702 /* Returns true if OP is a floating point value with value 1.0. */
8703 bool
8704 fp_one_operand (rtx op)
8705 {
8706 if (GET_MODE (op) != SFmode)
8707 return false;
8708
8709 return real_equal (CONST_DOUBLE_REAL_VALUE (op), &dconst1);
8710 }
8711
8712 /* Return the TLS type for TLS symbols. */
8713 enum tls_model
8714 tls_symbolic_operand (rtx op, machine_mode mode ATTRIBUTE_UNUSED)
8715 {
8716 if (GET_CODE (op) != SYMBOL_REF)
8717 return TLS_MODEL_NONE;
8718 return SYMBOL_REF_TLS_MODEL (op);
8719 }
8720 \f
8721 /* Return the destination address of a branch. */
8722 static int
8723 branch_dest (rtx branch)
8724 {
8725 rtx dest = SET_SRC (PATTERN (branch));
8726
8727 if (GET_CODE (dest) == IF_THEN_ELSE)
8728 dest = XEXP (dest, 1);
8729
8730 return INSN_ADDRESSES (INSN_UID (XEXP (dest, 0)));
8731 }
8732 \f
8733 /* Return nonzero if REG is not used after INSN.
8734 We assume REG is a reload reg, and therefore does
8735 not live past labels. It may live past calls or jumps though. */
8736 bool
8737 reg_unused_after (rtx reg, rtx_insn *insn)
8738 {
8739 /* If the reg is set by this instruction, then it is safe for our
8740 case. Disregard the case where this is a store to memory, since
8741 we are checking a register used in the store address. */
8742 rtx set = single_set (insn);
8743 if (set && !MEM_P (SET_DEST (set))
8744 && reg_overlap_mentioned_p (reg, SET_DEST (set)))
8745 return true;
8746
8747 while ((insn = NEXT_INSN (insn)))
8748 {
8749 if (!INSN_P (insn))
8750 continue;
8751
8752 rtx_code code = GET_CODE (insn);
8753
8754 #if 0
8755 /* If this is a label that existed before reload, then the register
8756 is dead here. However, if this is a label added by reorg, then
8757 the register may still be live here. We can't tell the difference,
8758 so we just ignore labels completely. */
8759 if (code == CODE_LABEL)
8760 return 1;
8761 /* else */
8762 #endif
8763
8764 if (code == JUMP_INSN)
8765 return false;
8766
8767 /* If this is a sequence, we must handle them all at once.
8768 We could have for instance a call that sets the target register,
8769 and an insn in a delay slot that uses the register. In this case,
8770 we must return 0. */
8771 else if (code == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE)
8772 {
8773 rtx_sequence *seq = as_a <rtx_sequence *> (PATTERN (insn));
8774 bool retval = false;
8775
8776 for (int i = 0; i < seq->len (); i++)
8777 {
8778 rtx_insn *this_insn = seq->insn (i);
8779 rtx set = single_set (this_insn);
8780
8781 if (CALL_P (this_insn))
8782 code = CALL_INSN;
8783 else if (JUMP_P (this_insn))
8784 {
8785 if (INSN_ANNULLED_BRANCH_P (this_insn))
8786 return false;
8787 code = JUMP_INSN;
8788 }
8789
8790 if (set && reg_overlap_mentioned_p (reg, SET_SRC (set)))
8791 return false;
8792 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
8793 {
8794 if (!MEM_P (SET_DEST (set)))
8795 retval = true;
8796 else
8797 return false;
8798 }
8799 if (set == NULL_RTX
8800 && reg_overlap_mentioned_p (reg, PATTERN (this_insn)))
8801 return false;
8802 }
8803 if (retval)
8804 return true;
8805 else if (code == JUMP_INSN)
8806 return false;
8807 }
8808
8809 rtx set = single_set (insn);
8810 if (set && reg_overlap_mentioned_p (reg, SET_SRC (set)))
8811 return false;
8812 if (set && reg_overlap_mentioned_p (reg, SET_DEST (set)))
8813 return !MEM_P (SET_DEST (set));
8814 if (set == NULL && reg_overlap_mentioned_p (reg, PATTERN (insn)))
8815 return false;
8816
8817 if (code == CALL_INSN && call_used_regs[REGNO (reg)])
8818 return true;
8819 }
8820 return true;
8821 }
8822 \f
8823
8824 static GTY(()) rtx t_reg_rtx;
8825 rtx
8826 get_t_reg_rtx (void)
8827 {
8828 if (! t_reg_rtx)
8829 t_reg_rtx = gen_rtx_REG (SImode, T_REG);
8830 return t_reg_rtx;
8831 }
8832
8833 static GTY(()) tree fpscr_values;
8834
8835 static void
8836 emit_fpu_switch (rtx scratch, int index)
8837 {
8838 if (fpscr_values == NULL)
8839 {
8840 tree t = build_index_type (integer_one_node);
8841 t = build_array_type (integer_type_node, t);
8842 t = build_decl (BUILTINS_LOCATION,
8843 VAR_DECL, get_identifier ("__fpscr_values"), t);
8844 DECL_ARTIFICIAL (t) = 1;
8845 DECL_IGNORED_P (t) = 1;
8846 DECL_EXTERNAL (t) = 1;
8847 TREE_STATIC (t) = 1;
8848 TREE_PUBLIC (t) = 1;
8849 TREE_USED (t) = 1;
8850
8851 fpscr_values = t;
8852 }
8853
8854 rtx src = DECL_RTL (fpscr_values);
8855 if (!can_create_pseudo_p ())
8856 {
8857 emit_move_insn (scratch, XEXP (src, 0));
8858 if (index != 0)
8859 emit_insn (gen_addsi3 (scratch, scratch, GEN_INT (index * 4)));
8860 src = adjust_automodify_address (src, SImode, scratch, index * 4);
8861 }
8862 else
8863 src = adjust_address (src, SImode, index * 4);
8864
8865 emit_insn (gen_lds_fpscr (src));
8866 }
8867 \f
8868 static rtx get_free_reg (HARD_REG_SET);
8869
8870 /* This function returns a register to use to load the address to load
8871 the fpscr from. Currently it always returns r1 or r7, but when we are
8872 able to use pseudo registers after combine, or have a better mechanism
8873 for choosing a register, it should be done here. */
8874 /* REGS_LIVE is the liveness information for the point for which we
8875 need this allocation. In some bare-bones exit blocks, r1 is live at the
8876 start. We can even have all of r0..r3 being live:
8877 __complex__ long long f (double d) { if (d == 0) return 2; else return 3; }
8878 INSN before which new insns are placed with will clobber the register
8879 we return. If a basic block consists only of setting the return value
8880 register to a pseudo and using that register, the return value is not
8881 live before or after this block, yet we we'll insert our insns right in
8882 the middle. */
8883 static rtx
8884 get_free_reg (HARD_REG_SET regs_live)
8885 {
8886 if (! TEST_HARD_REG_BIT (regs_live, 1))
8887 return gen_rtx_REG (Pmode, 1);
8888
8889 /* Hard reg 1 is live; since this is a small register classes target,
8890 there shouldn't be anything but a jump before the function end. */
8891 gcc_assert (!TEST_HARD_REG_BIT (regs_live, 7));
8892 return gen_rtx_REG (Pmode, 7);
8893 }
8894
8895 /* This function will set the fpscr from memory.
8896 MODE is the mode we are setting it to. */
8897 void
8898 fpscr_set_from_mem (int mode, HARD_REG_SET regs_live)
8899 {
8900 enum attr_fp_mode fp_mode = (enum attr_fp_mode) mode;
8901 enum attr_fp_mode norm_mode = ACTUAL_NORMAL_MODE (FP_MODE);
8902
8903 rtx addr_reg = !can_create_pseudo_p () ? get_free_reg (regs_live) : NULL_RTX;
8904 emit_fpu_switch (addr_reg, fp_mode == norm_mode);
8905 }
8906
8907 /* Is the given character a logical line separator for the assembler? */
8908 #ifndef IS_ASM_LOGICAL_LINE_SEPARATOR
8909 #define IS_ASM_LOGICAL_LINE_SEPARATOR(C, STR) ((C) == ';')
8910 #endif
8911
8912 static bool
8913 sequence_insn_p (rtx_insn *insn)
8914 {
8915 rtx_insn* prev = PREV_INSN (insn);
8916 if (prev == NULL)
8917 return false;
8918
8919 rtx_insn* next = NEXT_INSN (prev);
8920 if (next == NULL)
8921 return false;
8922
8923 return INSN_P (next) && GET_CODE (PATTERN (next)) == SEQUENCE;
8924 }
8925
8926 int
8927 sh_insn_length_adjustment (rtx_insn *insn)
8928 {
8929 /* Instructions with unfilled delay slots take up an extra two bytes for
8930 the nop in the delay slot. */
8931 if (((NONJUMP_INSN_P (insn)
8932 && GET_CODE (PATTERN (insn)) != USE
8933 && GET_CODE (PATTERN (insn)) != CLOBBER)
8934 || CALL_P (insn) || JUMP_P (insn))
8935 && ! sequence_insn_p (insn)
8936 && get_attr_needs_delay_slot (insn) == NEEDS_DELAY_SLOT_YES)
8937 return 2;
8938
8939 /* Increase the insn length of a cbranch without a delay slot insn to
8940 force a delay slot which will be stuffed with a nop. */
8941 if (TARGET_CBRANCH_FORCE_DELAY_SLOT && TARGET_SH2
8942 && JUMP_P (insn) && get_attr_type (insn) == TYPE_CBRANCH
8943 && ! sequence_insn_p (insn))
8944 return 2;
8945
8946 /* sh-dsp parallel processing insn take four bytes instead of two. */
8947
8948 if (NONJUMP_INSN_P (insn))
8949 {
8950 int sum = 0;
8951 rtx body = PATTERN (insn);
8952 const char *templ;
8953 char c;
8954 bool maybe_label = true;
8955
8956 if (GET_CODE (body) == ASM_INPUT)
8957 templ = XSTR (body, 0);
8958 else if (asm_noperands (body) >= 0)
8959 templ
8960 = decode_asm_operands (body, NULL, NULL, NULL, NULL, NULL);
8961 else
8962 return 0;
8963 do
8964 {
8965 int ppi_adjust = 0;
8966
8967 do
8968 c = *templ++;
8969 while (c == ' ' || c == '\t');
8970 /* all sh-dsp parallel-processing insns start with p.
8971 The only non-ppi sh insn starting with p is pref.
8972 The only ppi starting with pr is prnd. */
8973 if ((c == 'p' || c == 'P') && strncasecmp ("re", templ, 2))
8974 ppi_adjust = 2;
8975 /* The repeat pseudo-insn expands two three insns, a total of
8976 six bytes in size. */
8977 else if ((c == 'r' || c == 'R')
8978 && ! strncasecmp ("epeat", templ, 5))
8979 ppi_adjust = 4;
8980 while (c && c != '\n'
8981 && ! IS_ASM_LOGICAL_LINE_SEPARATOR (c, templ))
8982 {
8983 /* If this is a label, it is obviously not a ppi insn. */
8984 if (c == ':' && maybe_label)
8985 {
8986 ppi_adjust = 0;
8987 break;
8988 }
8989 else if (c == '\'' || c == '"')
8990 maybe_label = false;
8991 c = *templ++;
8992 }
8993 sum += ppi_adjust;
8994 maybe_label = c != ':';
8995 }
8996 while (c);
8997 return sum;
8998 }
8999 return 0;
9000 }
9001 \f
9002 /* Return TRUE for a valid displacement for the REG+disp addressing
9003 with MODE. */
9004 bool
9005 sh_legitimate_index_p (machine_mode mode, rtx op, bool consider_sh2a,
9006 bool allow_zero)
9007 {
9008 if (! CONST_INT_P (op))
9009 return false;
9010
9011 {
9012 const HOST_WIDE_INT offset = INTVAL (op);
9013 const int max_disp = sh_max_mov_insn_displacement (mode, consider_sh2a);
9014 const int align_mask = mov_insn_alignment_mask (mode, consider_sh2a);
9015
9016 /* If the mode does not support any displacement always return false.
9017 Even though an index of '0' is actually always valid, it will cause
9018 troubles when e.g. a DFmode move is split into two SFmode moves,
9019 where one SFmode move will have index '0' and the other move will
9020 have index '4'. */
9021 if (!allow_zero && max_disp < 1)
9022 return false;
9023
9024 return offset >= 0 && offset <= max_disp && (offset & align_mask) == 0;
9025 }
9026 }
9027
9028 /* Recognize an RTL expression that is a valid memory address for
9029 an instruction.
9030 The MODE argument is the machine mode for the MEM expression
9031 that wants to use this address.
9032 Allow REG
9033 REG+disp
9034 REG+r0
9035 REG++
9036 --REG
9037 GBR
9038 GBR+disp */
9039 static bool
9040 sh_legitimate_address_p (machine_mode mode, rtx x, bool strict)
9041 {
9042 if (REG_P (x) && REGNO (x) == GBR_REG)
9043 return true;
9044
9045 if (MAYBE_BASE_REGISTER_RTX_P (x, strict))
9046 return true;
9047 else if ((GET_CODE (x) == POST_INC || GET_CODE (x) == PRE_DEC)
9048 && MAYBE_BASE_REGISTER_RTX_P (XEXP (x, 0), strict))
9049 return true;
9050 else if (GET_CODE (x) == PLUS)
9051 {
9052 rtx xop0 = XEXP (x, 0);
9053 rtx xop1 = XEXP (x, 1);
9054
9055 if (REG_P (xop0) && REGNO (xop0) == GBR_REG)
9056 return gbr_displacement (xop1, mode);
9057
9058 if (GET_MODE_SIZE (mode) <= 8
9059 && MAYBE_BASE_REGISTER_RTX_P (xop0, strict)
9060 && sh_legitimate_index_p (mode, xop1, TARGET_SH2A, false))
9061 return true;
9062
9063 if (GET_MODE_SIZE (mode) <= 4
9064 || (TARGET_FPU_DOUBLE && TARGET_FMOVD && mode == DFmode))
9065 {
9066 if (MAYBE_BASE_REGISTER_RTX_P (xop1, strict)
9067 && MAYBE_INDEX_REGISTER_RTX_P (xop0, strict))
9068 return true;
9069 if (MAYBE_INDEX_REGISTER_RTX_P (xop1, strict)
9070 && MAYBE_BASE_REGISTER_RTX_P (xop0, strict))
9071 return true;
9072 }
9073 }
9074
9075 return false;
9076 }
9077 \f
9078 /* Return TRUE if X references a SYMBOL_REF or LABEL_REF whose symbol
9079 isn't protected by a PIC unspec. */
9080 bool
9081 nonpic_symbol_mentioned_p (rtx x)
9082 {
9083 if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF
9084 || GET_CODE (x) == PC)
9085 return true;
9086
9087 /* We don't want to look into the possible MEM location of a
9088 CONST_DOUBLE, since we're not going to use it, in general. */
9089 if (GET_CODE (x) == CONST_DOUBLE)
9090 return false;
9091
9092 if (GET_CODE (x) == UNSPEC
9093 && (XINT (x, 1) == UNSPEC_PIC
9094 || XINT (x, 1) == UNSPEC_GOT
9095 || XINT (x, 1) == UNSPEC_GOTOFF
9096 || XINT (x, 1) == UNSPEC_GOTPLT
9097 || XINT (x, 1) == UNSPEC_GOTTPOFF
9098 || XINT (x, 1) == UNSPEC_DTPOFF
9099 || XINT (x, 1) == UNSPEC_TPOFF
9100 || XINT (x, 1) == UNSPEC_PLT
9101 || XINT (x, 1) == UNSPEC_PCREL
9102 || XINT (x, 1) == UNSPEC_SYMOFF
9103 || XINT (x, 1) == UNSPEC_PCREL_SYMOFF
9104 || XINT (x, 1) == UNSPEC_GOTFUNCDESC
9105 || XINT (x, 1) == UNSPEC_GOTOFFFUNCDESC))
9106 return false;
9107
9108 const char* fmt = GET_RTX_FORMAT (GET_CODE (x));
9109 for (int i = GET_RTX_LENGTH (GET_CODE (x)) - 1; i >= 0; i--)
9110 {
9111 if (fmt[i] == 'E')
9112 {
9113 for (int j = XVECLEN (x, i) - 1; j >= 0; j--)
9114 if (nonpic_symbol_mentioned_p (XVECEXP (x, i, j)))
9115 return true;
9116 }
9117 else if (fmt[i] == 'e' && nonpic_symbol_mentioned_p (XEXP (x, i)))
9118 return true;
9119 }
9120
9121 return false;
9122 }
9123
9124 /* Convert a non-PIC address in `orig' to a PIC address using @GOT or
9125 @GOTOFF in `reg'. */
9126 rtx
9127 legitimize_pic_address (rtx orig, machine_mode mode ATTRIBUTE_UNUSED, rtx reg)
9128 {
9129 if (tls_symbolic_operand (orig, Pmode) != TLS_MODEL_NONE)
9130 return orig;
9131
9132 if (GET_CODE (orig) == LABEL_REF
9133 || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_LOCAL_P (orig)))
9134 {
9135 if (reg == NULL_RTX)
9136 reg = gen_reg_rtx (Pmode);
9137
9138 if (TARGET_FDPIC
9139 && GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (orig))
9140 {
9141 /* Weak functions may be NULL which doesn't work with
9142 GOTOFFFUNCDESC because the runtime offset is not known. */
9143 if (SYMBOL_REF_WEAK (orig))
9144 emit_insn (gen_symGOTFUNCDESC2reg (reg, orig));
9145 else
9146 emit_insn (gen_symGOTOFFFUNCDESC2reg (reg, orig));
9147 }
9148 else if (TARGET_FDPIC
9149 && (GET_CODE (orig) == LABEL_REF
9150 || (GET_CODE (orig) == SYMBOL_REF && SYMBOL_REF_DECL (orig)
9151 && (TREE_READONLY (SYMBOL_REF_DECL (orig))
9152 || SYMBOL_REF_EXTERNAL_P (orig)
9153 || DECL_SECTION_NAME(SYMBOL_REF_DECL (orig))))))
9154 /* In FDPIC, GOTOFF can only be used for writable data. */
9155 emit_insn (gen_symGOT2reg (reg, orig));
9156 else
9157 emit_insn (gen_symGOTOFF2reg (reg, orig));
9158 return reg;
9159 }
9160 else if (GET_CODE (orig) == SYMBOL_REF)
9161 {
9162 if (reg == NULL_RTX)
9163 reg = gen_reg_rtx (Pmode);
9164
9165 if (TARGET_FDPIC && SYMBOL_REF_FUNCTION_P (orig))
9166 emit_insn (gen_symGOTFUNCDESC2reg (reg, orig));
9167 else
9168 emit_insn (gen_symGOT2reg (reg, orig));
9169 return reg;
9170 }
9171 return orig;
9172 }
9173
9174 /* Given a (logical) mode size and an offset in bytes, try to find a the
9175 appropriate displacement value for a mov insn. On SH the displacements
9176 are limited to max. 60 bytes for SImode, max. 30 bytes in HImode and max.
9177 15 bytes in QImode. To compensate this we create a new base address by
9178 adding an adjustment value to it.
9179
9180 If the originally requested offset is greater than 127 we prefer using
9181 values 124..127 over 128..131 to increase opportunities to use the
9182 add #imm, Rn insn.
9183
9184 In some cases it is possible that a requested offset might seem unaligned
9185 or inappropriate for the mode size, like offset = 2 and mode size = 4.
9186 This is compensated by adjusting the base address so that the effective
9187 address of the displacement move insn will be aligned.
9188
9189 This is not the best possible way of rebasing the base address, as it
9190 does not look at other present displacement addressings around it.
9191 In some cases this can create more base address adjustments than would
9192 actually be necessary. */
9193 struct disp_adjust
9194 {
9195 rtx offset_adjust;
9196 rtx mov_disp;
9197 };
9198
9199 static struct disp_adjust
9200 sh_find_mov_disp_adjust (machine_mode mode, HOST_WIDE_INT offset)
9201 {
9202 struct disp_adjust res = { NULL_RTX, NULL_RTX };
9203
9204 /* Do not try to use SH2A's large displacements here, because this would
9205 effectively disable the small displacement insns. */
9206 const int mode_sz = GET_MODE_SIZE (mode);
9207 const int mov_insn_sz = mov_insn_size (mode, false);
9208 const int max_disp = sh_max_mov_insn_displacement (mode, false);
9209 const int max_disp_next = max_disp + mov_insn_sz;
9210 HOST_WIDE_INT align_modifier = offset > 127 ? mov_insn_sz : 0;
9211 HOST_WIDE_INT offset_adjust;
9212
9213 /* In some cases this actually does happen and we must check for it. */
9214 if (mode_sz < 1 || mode_sz > 8 || max_disp < 1)
9215 return res;
9216
9217 /* Keeps the previous behavior for QImode displacement addressing.
9218 This just decides how the offset is re-based. Removing this special
9219 case will result in slightly bigger code on average, but it's not that
9220 bad actually. */
9221 if (mov_insn_sz == 1)
9222 align_modifier = 0;
9223
9224 offset_adjust = ((offset + align_modifier) & ~max_disp) - align_modifier;
9225
9226 if (mode_sz + offset - offset_adjust <= max_disp_next)
9227 {
9228 res.offset_adjust = GEN_INT (offset_adjust);
9229 res.mov_disp = GEN_INT (offset - offset_adjust);
9230 }
9231
9232 return res;
9233 }
9234
9235 /* Try to modify an illegitimate address and make it legitimate.
9236 If we find one, return the new, valid address.
9237 Otherwise, return the original address. */
9238 static rtx
9239 sh_legitimize_address (rtx x, rtx oldx, machine_mode mode)
9240 {
9241 if (flag_pic)
9242 x = legitimize_pic_address (oldx, mode, NULL_RTX);
9243
9244 if ((TARGET_FPU_DOUBLE && mode == DFmode)
9245 || (TARGET_SH2E && mode == SFmode))
9246 return x;
9247
9248 if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1))
9249 && BASE_REGISTER_RTX_P (XEXP (x, 0)))
9250 {
9251 struct disp_adjust adj = sh_find_mov_disp_adjust (mode,
9252 INTVAL (XEXP (x, 1)));
9253
9254 if (adj.offset_adjust != NULL_RTX && adj.mov_disp != NULL_RTX)
9255 {
9256 rtx sum = expand_binop (Pmode, add_optab, XEXP (x, 0),
9257 adj.offset_adjust, NULL_RTX, 0,
9258 OPTAB_LIB_WIDEN);
9259 return gen_rtx_PLUS (Pmode, sum, adj.mov_disp);
9260 }
9261 }
9262 return x;
9263 }
9264
9265 /* Attempt to replace *p, which is an address that needs reloading, with
9266 a valid memory address for an operand of mode MODE.
9267 Like for sh_legitimize_address, for the SH we try to get a normal form
9268 of the address. That will allow inheritance of the address reloads. */
9269 bool
9270 sh_legitimize_reload_address (rtx *p, machine_mode mode, int opnum,
9271 int itype)
9272 {
9273 enum reload_type type = (enum reload_type) itype;
9274 const int mode_sz = GET_MODE_SIZE (mode);
9275
9276 if (sh_lra_p ())
9277 return false;
9278
9279 if (GET_CODE (*p) == PLUS && CONST_INT_P (XEXP (*p, 1))
9280 && MAYBE_BASE_REGISTER_RTX_P (XEXP (*p, 0), true))
9281 {
9282 const HOST_WIDE_INT offset = INTVAL (XEXP (*p, 1));
9283 struct disp_adjust adj = sh_find_mov_disp_adjust (mode, offset);
9284
9285 if (TARGET_SH2A && mode == DFmode && (offset & 0x7))
9286 {
9287 push_reload (*p, NULL_RTX, p, NULL,
9288 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, opnum, type);
9289 return true;
9290 }
9291
9292 if (TARGET_SH2E && mode == SFmode)
9293 {
9294 *p = copy_rtx (*p);
9295 push_reload (*p, NULL_RTX, p, NULL,
9296 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, opnum, type);
9297 return true;
9298 }
9299
9300 /* FIXME: Do not allow to legitimize QImode and HImode displacement
9301 moves because then reload has a problem figuring the constraint
9302 that the move insn target/source reg must be R0.
9303 Or maybe some handling is wrong in sh_secondary_reload for this
9304 to work properly? */
9305 if ((mode_sz == 4 || mode_sz == 8)
9306 && ! (TARGET_SH4 && mode == DFmode)
9307 && adj.offset_adjust != NULL_RTX && adj.mov_disp != NULL_RTX)
9308 {
9309 rtx sum = gen_rtx_PLUS (Pmode, XEXP (*p, 0), adj.offset_adjust);
9310 *p = gen_rtx_PLUS (Pmode, sum, adj.mov_disp);
9311 push_reload (sum, NULL_RTX, &XEXP (*p, 0), NULL,
9312 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, opnum, type);
9313 return true;
9314 }
9315 }
9316
9317 /* We must re-recognize what we created before. */
9318 if (GET_CODE (*p) == PLUS
9319 && (mode_sz == 4 || mode_sz == 8)
9320 && GET_CODE (XEXP (*p, 0)) == PLUS
9321 && CONST_INT_P (XEXP (XEXP (*p, 0), 1))
9322 && MAYBE_BASE_REGISTER_RTX_P (XEXP (XEXP (*p, 0), 0), true)
9323 && CONST_INT_P (XEXP (*p, 1))
9324 && ! (TARGET_SH2E && mode == SFmode))
9325 {
9326 /* Because this address is so complex, we know it must have
9327 been created by LEGITIMIZE_RELOAD_ADDRESS before; thus,
9328 it is already unshared, and needs no further unsharing. */
9329 push_reload (XEXP (*p, 0), NULL_RTX, &XEXP (*p, 0), NULL,
9330 BASE_REG_CLASS, Pmode, VOIDmode, 0, 0, opnum, type);
9331 return true;
9332 }
9333
9334 return false;
9335 }
9336
9337 /* In the name of slightly smaller debug output, and to cater to
9338 general assembler lossage, recognize various UNSPEC sequences
9339 and turn them back into a direct symbol reference. */
9340 static rtx
9341 sh_delegitimize_address (rtx orig_x)
9342 {
9343 orig_x = delegitimize_mem_from_attrs (orig_x);
9344
9345 rtx x = orig_x;
9346 if (MEM_P (x))
9347 x = XEXP (x, 0);
9348 if (GET_CODE (x) == CONST)
9349 {
9350 rtx y = XEXP (x, 0);
9351 if (GET_CODE (y) == UNSPEC)
9352 {
9353 if (XINT (y, 1) == UNSPEC_GOT
9354 || XINT (y, 1) == UNSPEC_GOTOFF
9355 || XINT (y, 1) == UNSPEC_SYMOFF)
9356 return XVECEXP (y, 0, 0);
9357 else if (XINT (y, 1) == UNSPEC_PCREL_SYMOFF)
9358 {
9359 if (GET_CODE (XVECEXP (y, 0, 0)) == CONST)
9360 {
9361 rtx symplt = XEXP (XVECEXP (y, 0, 0), 0);
9362
9363 if (GET_CODE (symplt) == UNSPEC
9364 && (XINT (symplt, 1) == UNSPEC_PLT
9365 || XINT (symplt, 1) == UNSPEC_PCREL))
9366 return XVECEXP (symplt, 0, 0);
9367 }
9368 }
9369 }
9370 }
9371
9372 return orig_x;
9373 }
9374
9375 /* Mark the use of a constant in the literal table. If the constant
9376 has multiple labels, make it unique. */
9377 static rtx
9378 mark_constant_pool_use (rtx x)
9379 {
9380 if (x == NULL_RTX)
9381 return x;
9382
9383 switch (GET_CODE (x))
9384 {
9385 case LABEL_REF:
9386 x = XEXP (x, 0);
9387 case CODE_LABEL:
9388 break;
9389 default:
9390 return x;
9391 }
9392
9393 /* Get the first label in the list of labels for the same constant
9394 and delete another labels in the list. */
9395 rtx_insn* lab = as_a <rtx_insn*> (x);
9396 for (rtx_insn* insn = PREV_INSN (lab); insn; insn = PREV_INSN (insn))
9397 {
9398 if (!LABEL_P (insn)
9399 || LABEL_REFS (insn) != NEXT_INSN (insn))
9400 break;
9401 lab = insn;
9402 }
9403
9404 for (rtx insn = LABEL_REFS (lab); insn; insn = LABEL_REFS (insn))
9405 as_a<rtx_insn *> (insn)->set_deleted ();
9406
9407 /* Mark constants in a window. */
9408 for (rtx_insn* insn = NEXT_INSN (as_a <rtx_insn *> (x)); insn;
9409 insn = NEXT_INSN (insn))
9410 {
9411 if (!NONJUMP_INSN_P (insn))
9412 continue;
9413
9414 rtx pattern = PATTERN (insn);
9415 if (GET_CODE (pattern) != UNSPEC_VOLATILE)
9416 continue;
9417
9418 switch (XINT (pattern, 1))
9419 {
9420 case UNSPECV_CONST2:
9421 case UNSPECV_CONST4:
9422 case UNSPECV_CONST8:
9423 XVECEXP (pattern, 0, 1) = const1_rtx;
9424 break;
9425 case UNSPECV_WINDOW_END:
9426 if (XVECEXP (pattern, 0, 0) == x)
9427 return lab;
9428 break;
9429 case UNSPECV_CONST_END:
9430 return lab;
9431 default:
9432 break;
9433 }
9434 }
9435
9436 return lab;
9437 }
9438 \f
9439 /* Return true if it's possible to redirect BRANCH1 to the destination
9440 of an unconditional jump BRANCH2. We only want to do this if the
9441 resulting branch will have a short displacement. */
9442 static bool
9443 sh_can_follow_jump (const rtx_insn *branch1, const rtx_insn *branch2)
9444 {
9445 /* Don't follow if BRANCH2 is possible to be a jump crossing between
9446 hot and cold partitions. */
9447 if (flag_reorder_blocks_and_partition
9448 && simplejump_p (branch2)
9449 && CROSSING_JUMP_P (branch2))
9450 return false;
9451
9452 if (flag_expensive_optimizations && simplejump_p (branch2))
9453 {
9454 rtx dest = XEXP (SET_SRC (single_set (branch2)), 0);
9455 rtx_insn *insn;
9456 int distance;
9457
9458 for (distance = 0, insn = NEXT_INSN (branch1);
9459 insn && distance < 256;
9460 insn = PREV_INSN (insn))
9461 {
9462 if (insn == dest)
9463 return true;
9464 else
9465 distance += get_attr_length (insn);
9466 }
9467 for (distance = 0, insn = NEXT_INSN (branch1);
9468 insn && distance < 256;
9469 insn = NEXT_INSN (insn))
9470 {
9471 if (insn == dest)
9472 return true;
9473 else
9474 distance += get_attr_length (insn);
9475 }
9476 }
9477 return false;
9478 }
9479
9480 /* Return nonzero if register old_reg can be renamed to register new_reg. */
9481 bool
9482 sh_hard_regno_rename_ok (unsigned int old_reg ATTRIBUTE_UNUSED,
9483 unsigned int new_reg)
9484 {
9485 /* Interrupt functions can only use registers that have already been
9486 saved by the prologue, even if they would normally be
9487 call-clobbered. */
9488 if (sh_cfun_interrupt_handler_p () && !df_regs_ever_live_p (new_reg))
9489 return false;
9490
9491 return true;
9492 }
9493
9494 /* Function to update the integer COST
9495 based on the relationship between INSN that is dependent on
9496 DEP_INSN through the dependence LINK. The default is to make no
9497 adjustment to COST. This can be used for example to specify to
9498 the scheduler that an output- or anti-dependence does not incur
9499 the same cost as a data-dependence. The return value should be
9500 the new value for COST. */
9501 static int
9502 sh_adjust_cost (rtx_insn *insn, int dep_type, rtx_insn *dep_insn, int cost,
9503 unsigned int)
9504 {
9505 rtx reg, use_pat;
9506
9507 if (dep_type == 0)
9508 {
9509 if (recog_memoized (insn) < 0
9510 || recog_memoized (dep_insn) < 0)
9511 return cost;
9512
9513 rtx dep_set = single_set (dep_insn);
9514
9515 /* The latency that we specify in the scheduling description refers
9516 to the actual output, not to an auto-increment register; for that,
9517 the latency is one. */
9518 if (dep_set && MEM_P (SET_SRC (dep_set)) && cost > 1)
9519 {
9520 rtx set = single_set (insn);
9521
9522 if (set
9523 && !reg_mentioned_p (SET_DEST (dep_set), SET_SRC (set))
9524 && (!MEM_P (SET_DEST (set))
9525 || !reg_mentioned_p (SET_DEST (dep_set),
9526 XEXP (SET_DEST (set), 0))))
9527 cost = 1;
9528 }
9529 /* The only input for a call that is timing-critical is the
9530 function's address. */
9531 if (CALL_P (insn))
9532 {
9533 rtx call = get_call_rtx_from (insn);
9534 if (call
9535 /* sibcalli_thunk uses a symbol_ref in an unspec. */
9536 && (GET_CODE (XEXP (XEXP (call, 0), 0)) == UNSPEC
9537 || ! reg_set_p (XEXP (XEXP (call, 0), 0), dep_insn)))
9538 cost -= TARGET_SH4_300 ? 3 : 6;
9539 }
9540 /* Likewise, the most timing critical input for an sfuncs call
9541 is the function address. However, sfuncs typically start
9542 using their arguments pretty quickly.
9543 Assume a four cycle delay for SH4 before they are needed.
9544 Cached ST40-300 calls are quicker, so assume only a one
9545 cycle delay there.
9546 ??? Maybe we should encode the delays till input registers
9547 are needed by sfuncs into the sfunc call insn. */
9548 /* All sfunc calls are parallels with at least four components.
9549 Exploit this to avoid unnecessary calls to sfunc_uses_reg. */
9550 else if (GET_CODE (PATTERN (insn)) == PARALLEL
9551 && XVECLEN (PATTERN (insn), 0) >= 4
9552 && (reg = sfunc_uses_reg (insn)))
9553 {
9554 if (! reg_set_p (reg, dep_insn))
9555 cost -= TARGET_SH4_300 ? 1 : 4;
9556 }
9557 if (TARGET_HARD_SH4 && !TARGET_SH4_300)
9558 {
9559 attr_type dep_type = get_attr_type (dep_insn);
9560 attr_type type;
9561 if (dep_type == TYPE_FLOAD || dep_type == TYPE_PCFLOAD)
9562 cost--;
9563 else if ((dep_type == TYPE_LOAD_SI || dep_type == TYPE_PCLOAD_SI)
9564 && (type = get_attr_type (insn)) != TYPE_CALL
9565 && type != TYPE_SFUNC)
9566 cost--;
9567 /* When the preceding instruction loads the shift amount of
9568 the following SHAD/SHLD, the latency of the load is increased
9569 by 1 cycle. */
9570 if (get_attr_type (insn) == TYPE_DYN_SHIFT
9571 && get_attr_any_int_load (dep_insn) == ANY_INT_LOAD_YES
9572 && reg_overlap_mentioned_p (SET_DEST (dep_set),
9573 XEXP (SET_SRC (single_set (insn)),
9574 1)))
9575 cost++;
9576 /* When an LS group instruction with a latency of less than
9577 3 cycles is followed by a double-precision floating-point
9578 instruction, FIPR, or FTRV, the latency of the first
9579 instruction is increased to 3 cycles. */
9580 else if (cost < 3
9581 && get_attr_insn_class (dep_insn) == INSN_CLASS_LS_GROUP
9582 && get_attr_dfp_comp (insn) == DFP_COMP_YES)
9583 cost = 3;
9584 /* The lsw register of a double-precision computation is ready one
9585 cycle earlier. */
9586 else if (reload_completed
9587 && get_attr_dfp_comp (dep_insn) == DFP_COMP_YES
9588 && (use_pat = single_set (insn))
9589 && ! regno_use_in (REGNO (SET_DEST (single_set (dep_insn))),
9590 SET_SRC (use_pat)))
9591 cost -= 1;
9592
9593 if (get_attr_any_fp_comp (dep_insn) == ANY_FP_COMP_YES
9594 && get_attr_late_fp_use (insn) == LATE_FP_USE_YES)
9595 cost -= 1;
9596 }
9597 else if (TARGET_SH4_300)
9598 {
9599 /* Stores need their input register two cycles later. */
9600 attr_type type;
9601 if (dep_set && cost >= 1
9602 && ((type = get_attr_type (insn)) == TYPE_STORE
9603 || type == TYPE_PSTORE
9604 || type == TYPE_FSTORE || type == TYPE_MAC_MEM))
9605 {
9606 rtx set = single_set (insn);
9607
9608 if (!reg_mentioned_p (SET_SRC (set), XEXP (SET_DEST (set), 0))
9609 && rtx_equal_p (SET_SRC (set), SET_DEST (dep_set)))
9610 {
9611 cost -= 2;
9612 /* But don't reduce the cost below 1 if the address depends
9613 on a side effect of dep_insn. */
9614 if (cost < 1
9615 && modified_in_p (XEXP (SET_DEST (set), 0), dep_insn))
9616 cost = 1;
9617 }
9618 }
9619 }
9620 }
9621 /* An anti-dependence penalty of two applies if the first insn is a double
9622 precision fadd / fsub / fmul. */
9623 else if (!TARGET_SH4_300
9624 && dep_type == REG_DEP_ANTI
9625 && recog_memoized (dep_insn) >= 0
9626 && (get_attr_type (dep_insn) == TYPE_DFP_ARITH
9627 || get_attr_type (dep_insn) == TYPE_DFP_MUL)
9628 /* A lot of alleged anti-flow dependences are fake,
9629 so check this one is real. */
9630 && flow_dependent_p (dep_insn, insn))
9631 cost = 2;
9632
9633 return cost;
9634 }
9635
9636 /* Check if INSN is flow-dependent on DEP_INSN. Can also be used to check
9637 if DEP_INSN is anti-flow dependent on INSN. */
9638 static bool
9639 flow_dependent_p (rtx_insn *insn, rtx_insn *dep_insn)
9640 {
9641 rtx tmp = PATTERN (insn);
9642
9643 note_stores (dep_insn, flow_dependent_p_1, &tmp);
9644 return tmp == NULL_RTX;
9645 }
9646
9647 /* A helper function for flow_dependent_p called through note_stores. */
9648 static void
9649 flow_dependent_p_1 (rtx x, const_rtx pat ATTRIBUTE_UNUSED, void *data)
9650 {
9651 rtx * pinsn = (rtx *) data;
9652
9653 if (*pinsn && reg_referenced_p (x, *pinsn))
9654 *pinsn = NULL_RTX;
9655 }
9656
9657 /* For use by sh_allocate_initial_value. Note that sh.md contains some
9658 'special function' patterns (type sfunc) that clobber pr, but that
9659 do not look like function calls to leaf_function_p. Hence we must
9660 do this extra check. */
9661 static int
9662 sh_pr_n_sets (void)
9663 {
9664 return DF_REG_DEF_COUNT (PR_REG);
9665 }
9666
9667 /* Return where to allocate pseudo for a given hard register initial
9668 value. */
9669 static rtx
9670 sh_allocate_initial_value (rtx hard_reg)
9671 {
9672 if (REGNO (hard_reg) == PR_REG)
9673 {
9674 if (crtl->is_leaf && ! sh_pr_n_sets ())
9675 return hard_reg;
9676 else
9677 return gen_frame_mem (Pmode, return_address_pointer_rtx);
9678 }
9679
9680 return NULL_RTX;
9681 }
9682
9683 /* This function returns "2" to indicate dual issue for the SH4
9684 processor. To be used by the DFA pipeline description. */
9685 static int
9686 sh_issue_rate (void)
9687 {
9688 if (TARGET_SUPERSCALAR)
9689 return 2;
9690 else
9691 return 1;
9692 }
9693
9694 /* Functions for ready queue reordering for sched1. */
9695
9696 /* Get weight for mode for a set x. */
9697 static short
9698 find_set_regmode_weight (rtx x, machine_mode mode)
9699 {
9700 if (GET_CODE (x) == CLOBBER && register_operand (SET_DEST (x), mode))
9701 return 1;
9702 if (GET_CODE (x) == SET && register_operand (SET_DEST (x), mode))
9703 {
9704 if (REG_P (SET_DEST (x)))
9705 {
9706 if (!reg_mentioned_p (SET_DEST (x), SET_SRC (x)))
9707 return 1;
9708 else
9709 return 0;
9710 }
9711 return 1;
9712 }
9713 return 0;
9714 }
9715
9716 /* Get regmode weight for insn. */
9717 static short
9718 find_insn_regmode_weight (rtx insn, machine_mode mode)
9719 {
9720 /* Increment weight for each register born here. */
9721 rtx x = PATTERN (insn);
9722 short reg_weight = find_set_regmode_weight (x, mode);
9723 if (GET_CODE (x) == PARALLEL)
9724 {
9725 int j;
9726 for (j = XVECLEN (x, 0) - 1; j >= 0; j--)
9727 {
9728 x = XVECEXP (PATTERN (insn), 0, j);
9729 reg_weight += find_set_regmode_weight (x, mode);
9730 }
9731 }
9732 /* Decrement weight for each register that dies here. */
9733 for (x = REG_NOTES (insn); x; x = XEXP (x, 1))
9734 {
9735 if (REG_NOTE_KIND (x) == REG_DEAD || REG_NOTE_KIND (x) == REG_UNUSED)
9736 {
9737 rtx note = XEXP (x, 0);
9738 if (REG_P (note) && GET_MODE (note) == mode)
9739 reg_weight--;
9740 }
9741 }
9742 return reg_weight;
9743 }
9744
9745 /* Calculate regmode weights for all insns of a basic block. */
9746 static void
9747 find_regmode_weight (basic_block b, machine_mode mode)
9748 {
9749 rtx_insn *insn, *next_tail, *head, *tail;
9750
9751 get_ebb_head_tail (b, b, &head, &tail);
9752 next_tail = NEXT_INSN (tail);
9753
9754 for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
9755 {
9756 /* Handle register life information. */
9757 if (!INSN_P (insn))
9758 continue;
9759
9760 if (mode == SFmode)
9761 INSN_REGMODE_WEIGHT (insn, mode) =
9762 find_insn_regmode_weight (insn, mode)
9763 + 2 * find_insn_regmode_weight (insn, DFmode);
9764 else if (mode == SImode)
9765 INSN_REGMODE_WEIGHT (insn, mode) =
9766 find_insn_regmode_weight (insn, mode)
9767 + 2 * find_insn_regmode_weight (insn, DImode);
9768 }
9769 }
9770
9771 /* Comparison function for ready queue sorting. */
9772 static int
9773 rank_for_reorder (const void *x, const void *y)
9774 {
9775 rtx_insn *tmp = *(rtx_insn * const *) y;
9776 rtx_insn *tmp2 = *(rtx_insn * const *) x;
9777
9778 /* The insn in a schedule group should be issued the first. */
9779 if (SCHED_GROUP_P (tmp) != SCHED_GROUP_P (tmp2))
9780 return SCHED_GROUP_P (tmp2) ? 1 : -1;
9781
9782 /* If insns are equally good, sort by INSN_LUID (original insn order), This
9783 minimizes instruction movement, thus minimizing sched's effect on
9784 register pressure. */
9785 return INSN_LUID (tmp) - INSN_LUID (tmp2);
9786 }
9787
9788 /* Resort the array A in which only element at index N may be out of order. */
9789 static void
9790 swap_reorder (rtx_insn **a, int n)
9791 {
9792 rtx_insn *insn = a[n - 1];
9793 int i = n - 2;
9794
9795 while (i >= 0 && rank_for_reorder (a + i, &insn) >= 0)
9796 {
9797 a[i + 1] = a[i];
9798 i -= 1;
9799 }
9800 a[i + 1] = insn;
9801 }
9802
9803 /* Sort the ready list by ascending priority. */
9804 static void
9805 ready_reorder (rtx_insn **ready, int nready)
9806 {
9807 if (nready == 2)
9808 swap_reorder (ready, nready);
9809 else if (nready > 2)
9810 qsort (ready, nready, sizeof (rtx_insn *), rank_for_reorder);
9811 }
9812
9813 /* Count life regions of r0 for a block. */
9814 static int
9815 find_r0_life_regions (basic_block b)
9816 {
9817 bool live;
9818 int set;
9819 int death = 0;
9820
9821 if (REGNO_REG_SET_P (df_get_live_in (b), R0_REG))
9822 {
9823 set = 1;
9824 live = true;
9825 }
9826 else
9827 {
9828 set = 0;
9829 live = false;
9830 }
9831
9832 rtx_insn* insn = BB_HEAD (b);
9833 rtx_insn* end = BB_END (b);
9834 rtx r0_reg = gen_rtx_REG (SImode, R0_REG);
9835 while (1)
9836 {
9837 if (INSN_P (insn))
9838 {
9839 if (find_regno_note (insn, REG_DEAD, R0_REG))
9840 {
9841 death++;
9842 live = false;
9843 }
9844
9845 rtx pset;
9846 if (!live
9847 && (pset = single_set (insn))
9848 && reg_overlap_mentioned_p (r0_reg, SET_DEST (pset))
9849 && !find_regno_note (insn, REG_UNUSED, R0_REG))
9850 {
9851 set++;
9852 live = true;
9853 }
9854 }
9855 if (insn == end)
9856 break;
9857 insn = NEXT_INSN (insn);
9858 }
9859 return set - death;
9860 }
9861
9862 /* Calculate regmode weights for all insns of all basic block. */
9863 static void
9864 sh_md_init_global (FILE *dump ATTRIBUTE_UNUSED,
9865 int verbose ATTRIBUTE_UNUSED,
9866 int old_max_uid)
9867 {
9868 basic_block b;
9869
9870 regmode_weight[0] = (short *) xcalloc (old_max_uid, sizeof (short));
9871 regmode_weight[1] = (short *) xcalloc (old_max_uid, sizeof (short));
9872 r0_life_regions = 0;
9873
9874 FOR_EACH_BB_REVERSE_FN (b, cfun)
9875 {
9876 find_regmode_weight (b, SImode);
9877 find_regmode_weight (b, SFmode);
9878 if (!reload_completed)
9879 r0_life_regions += find_r0_life_regions (b);
9880 }
9881
9882 CURR_REGMODE_PRESSURE (SImode) = 0;
9883 CURR_REGMODE_PRESSURE (SFmode) = 0;
9884 }
9885
9886 /* Cleanup. */
9887 static void
9888 sh_md_finish_global (FILE *dump ATTRIBUTE_UNUSED,
9889 int verbose ATTRIBUTE_UNUSED)
9890 {
9891 if (regmode_weight[0])
9892 {
9893 free (regmode_weight[0]);
9894 regmode_weight[0] = NULL;
9895 }
9896 if (regmode_weight[1])
9897 {
9898 free (regmode_weight[1]);
9899 regmode_weight[1] = NULL;
9900 }
9901 }
9902
9903 /* Cache the can_issue_more so that we can return it from reorder2. Also,
9904 keep count of register pressures on SImode and SFmode. */
9905 static int
9906 sh_variable_issue (FILE *dump ATTRIBUTE_UNUSED,
9907 int sched_verbose ATTRIBUTE_UNUSED,
9908 rtx_insn *insn,
9909 int can_issue_more)
9910 {
9911 if (GET_CODE (PATTERN (insn)) != USE
9912 && GET_CODE (PATTERN (insn)) != CLOBBER)
9913 cached_can_issue_more = can_issue_more - 1;
9914 else
9915 cached_can_issue_more = can_issue_more;
9916
9917 if (reload_completed)
9918 return cached_can_issue_more;
9919
9920 CURR_REGMODE_PRESSURE (SImode) += INSN_REGMODE_WEIGHT (insn, SImode);
9921 CURR_REGMODE_PRESSURE (SFmode) += INSN_REGMODE_WEIGHT (insn, SFmode);
9922
9923 return cached_can_issue_more;
9924 }
9925
9926 static void
9927 sh_md_init (FILE *dump ATTRIBUTE_UNUSED,
9928 int verbose ATTRIBUTE_UNUSED,
9929 int veclen ATTRIBUTE_UNUSED)
9930 {
9931 CURR_REGMODE_PRESSURE (SImode) = 0;
9932 CURR_REGMODE_PRESSURE (SFmode) = 0;
9933 }
9934
9935 /* Some magic numbers. */
9936 /* Pressure on register r0 can lead to spill failures. so avoid sched1 for
9937 functions that already have high pressure on r0. */
9938 #define R0_MAX_LIFE_REGIONS 2
9939 /* Register Pressure thresholds for SImode and SFmode registers. */
9940 #define SIMODE_MAX_WEIGHT 5
9941 #define SFMODE_MAX_WEIGHT 10
9942
9943 /* Return true if the pressure is high for MODE. */
9944 static bool
9945 high_pressure (machine_mode mode)
9946 {
9947 /* Pressure on register r0 can lead to spill failures. so avoid sched1 for
9948 functions that already have high pressure on r0. */
9949 if (r0_life_regions >= R0_MAX_LIFE_REGIONS)
9950 return true;
9951
9952 if (mode == SFmode)
9953 return (CURR_REGMODE_PRESSURE (SFmode) > SFMODE_MAX_WEIGHT);
9954 else
9955 return (CURR_REGMODE_PRESSURE (SImode) > SIMODE_MAX_WEIGHT);
9956 }
9957
9958 /* Reorder ready queue if register pressure is high. */
9959 static int
9960 sh_reorder (FILE *dump ATTRIBUTE_UNUSED,
9961 int sched_verbose ATTRIBUTE_UNUSED,
9962 rtx_insn **ready,
9963 int *n_readyp,
9964 int clock_var ATTRIBUTE_UNUSED)
9965 {
9966 if (reload_completed)
9967 return sh_issue_rate ();
9968
9969 if (high_pressure (SFmode) || high_pressure (SImode))
9970 {
9971 ready_reorder (ready, *n_readyp);
9972 }
9973
9974 return sh_issue_rate ();
9975 }
9976
9977 /* Skip cycles if the current register pressure is high. */
9978 static int
9979 sh_reorder2 (FILE *dump ATTRIBUTE_UNUSED,
9980 int sched_verbose ATTRIBUTE_UNUSED,
9981 rtx_insn **ready ATTRIBUTE_UNUSED,
9982 int *n_readyp ATTRIBUTE_UNUSED,
9983 int clock_var ATTRIBUTE_UNUSED)
9984 {
9985 if (reload_completed)
9986 return cached_can_issue_more;
9987
9988 if (high_pressure(SFmode) || high_pressure (SImode))
9989 skip_cycles = 1;
9990
9991 return cached_can_issue_more;
9992 }
9993
9994 /* Skip cycles without sorting the ready queue. This will move insn from
9995 Q->R. If this is the last cycle we are skipping; allow sorting of ready
9996 queue by sh_reorder. */
9997
9998 /* Generally, skipping these many cycles are sufficient for all insns to move
9999 from Q -> R. */
10000 #define MAX_SKIPS 8
10001
10002 static int
10003 sh_dfa_new_cycle (FILE *sched_dump ATTRIBUTE_UNUSED,
10004 int sched_verbose ATTRIBUTE_UNUSED,
10005 rtx_insn *insn ATTRIBUTE_UNUSED,
10006 int last_clock_var,
10007 int clock_var,
10008 int *sort_p)
10009 {
10010 if (reload_completed)
10011 return 0;
10012
10013 if (skip_cycles)
10014 {
10015 if ((clock_var - last_clock_var) < MAX_SKIPS)
10016 {
10017 *sort_p = 0;
10018 return 1;
10019 }
10020 /* If this is the last cycle we are skipping, allow reordering of R. */
10021 if ((clock_var - last_clock_var) == MAX_SKIPS)
10022 {
10023 *sort_p = 1;
10024 return 1;
10025 }
10026 }
10027
10028 skip_cycles = 0;
10029
10030 return 0;
10031 }
10032
10033 static bool
10034 sh_ms_bitfield_layout_p (const_tree record_type ATTRIBUTE_UNUSED)
10035 {
10036 return TARGET_HITACHI || sh_attr_renesas_p (record_type);
10037 }
10038 \f
10039 /*
10040 On the SH1..SH4, the trampoline looks like
10041 2 0002 D202 mov.l l2,r2
10042 1 0000 D301 mov.l l1,r3
10043 3 0004 422B jmp @r2
10044 4 0006 0009 nop
10045 5 0008 00000000 l1: .long area
10046 6 000c 00000000 l2: .long function
10047
10048 FDPIC needs a form that includes a function descriptor and
10049 code to load the GOT register:
10050 0 0000 00000000 .long l0
10051 1 0004 00000000 .long gotval
10052 2 0008 D302 l0: mov.l l1,r3
10053 3 000a D203 mov.l l2,r2
10054 4 000c 6122 mov.l @r2,r1
10055 5 000e 5C21 mov.l @(4,r2),r12
10056 6 0010 412B jmp @r1
10057 7 0012 0009 nop
10058 8 0014 00000000 l1: .long area
10059 9 0018 00000000 l2: .long function
10060
10061 SH5 (compact) uses r1 instead of r3 for the static chain. */
10062
10063 /* Emit insns to store a value at memory address + offset. */
10064 static void
10065 sh_emit_storesi (rtx addr, HOST_WIDE_INT offset, rtx value)
10066 {
10067 gcc_assert ((offset & 3) == 0);
10068 emit_move_insn (offset == 0
10069 ? change_address (addr, SImode, NULL_RTX)
10070 : adjust_address (addr, SImode, offset), value);
10071 }
10072
10073 /* Emit insns to store w0 at addr + offset and w1 at addr + offset + 2. */
10074 static void
10075 sh_emit_storehi (rtx addr, HOST_WIDE_INT offset, uint16_t w0, uint16_t w1)
10076 {
10077 sh_emit_storesi (addr, offset, gen_int_mode (TARGET_LITTLE_ENDIAN
10078 ? (w0 | (w1 << 16))
10079 : (w1 | (w0 << 16)), SImode));
10080 }
10081
10082 /* Emit RTL insns to initialize the variable parts of a trampoline.
10083 FNADDR is an RTX for the address of the function's pure code.
10084 CXT is an RTX for the static chain value for the function. */
10085 static void
10086 sh_trampoline_init (rtx tramp_mem, tree fndecl, rtx cxt)
10087 {
10088 rtx fnaddr = XEXP (DECL_RTL (fndecl), 0);
10089 rtx tramp = force_reg (Pmode, XEXP (tramp_mem, 0));
10090
10091 if (TARGET_FDPIC)
10092 {
10093 rtx a = force_reg (Pmode, plus_constant (Pmode, XEXP (tramp_mem, 0), 8));
10094
10095 sh_emit_storesi (tramp_mem, 0, a);
10096 sh_emit_storesi (tramp_mem, 4, sh_get_fdpic_reg_initial_val ());
10097
10098 sh_emit_storehi (tramp_mem, 8, 0xd302, 0xd203);
10099 sh_emit_storehi (tramp_mem, 12, 0x6122, 0x5c21);
10100 sh_emit_storehi (tramp_mem, 16, 0x412b, 0x0009);
10101
10102 sh_emit_storesi (tramp_mem, 20, cxt);
10103 sh_emit_storesi (tramp_mem, 24, fnaddr);
10104 }
10105 else
10106 {
10107 sh_emit_storehi (tramp_mem, 0, 0xd202, 0xd301);
10108 sh_emit_storehi (tramp_mem, 4, 0x422b, 0x0009);
10109
10110 sh_emit_storesi (tramp_mem, 8, cxt);
10111 sh_emit_storesi (tramp_mem, 12, fnaddr);
10112 }
10113 if (TARGET_HARD_SH4)
10114 {
10115 if (!TARGET_INLINE_IC_INVALIDATE
10116 || (!(TARGET_SH4A || TARGET_SH4_300) && TARGET_USERMODE))
10117 emit_library_call (function_symbol (NULL, "__ic_invalidate",
10118 FUNCTION_ORDINARY).sym,
10119 LCT_NORMAL, VOIDmode, tramp, SImode);
10120 else
10121 emit_insn (gen_ic_invalidate_line (tramp));
10122 }
10123 }
10124
10125 /* On SH5, trampolines are SHmedia code, so add 1 to the address. */
10126 static rtx
10127 sh_trampoline_adjust_address (rtx tramp)
10128 {
10129 return tramp;
10130 }
10131
10132 /* If PIC, we cannot make sibling calls to global functions
10133 because the PLT requires r12 to be live. */
10134 static bool
10135 sh_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
10136 {
10137 return (1
10138 && ! sh_cfun_interrupt_handler_p ()
10139 && (! flag_pic || TARGET_FDPIC
10140 || (decl && ! (TREE_PUBLIC (decl) || DECL_WEAK (decl)))
10141 || (decl && DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT)));
10142 }
10143
10144 /* Expand to appropriate sym*_label2reg for SYM and SIBCALL_P. */
10145 void
10146 sh_expand_sym_label2reg (rtx reg, rtx sym, rtx lab, bool sibcall_p)
10147 {
10148 const_tree decl = SYMBOL_REF_DECL (sym);
10149 bool is_weak = (decl && DECL_P (decl) && DECL_WEAK (decl));
10150
10151 if (!is_weak && SYMBOL_REF_LOCAL_P (sym))
10152 emit_insn (gen_sym_label2reg (reg, sym, lab));
10153 else if (sibcall_p && SYMBOL_REF_LOCAL_P (sym))
10154 emit_insn (gen_symPCREL_label2reg (reg, sym, lab));
10155 else
10156 emit_insn (gen_symPLT_label2reg (reg, sym, lab));
10157 }
10158 \f
10159 /* Machine specific built-in functions. */
10160
10161 struct builtin_description
10162 {
10163 bool (* const is_enabled) (void);
10164 const enum insn_code icode;
10165 const char *const name;
10166 int signature;
10167 tree fndecl;
10168 };
10169
10170 /* This function can be used if there are any built-ins that are not for
10171 SHmedia. It's commented out to avoid the defined-but-unused warning. */
10172 static bool
10173 sh1_builtin_p (void)
10174 {
10175 return TARGET_SH1;
10176 }
10177
10178 /* describe number and signedness of arguments; arg[0] == result
10179 (1: unsigned, 2: signed, 4: don't care, 8: pointer 0: no argument */
10180 /* 9: 64-bit pointer, 10: 32-bit pointer */
10181 static const char signature_args[][4] =
10182 {
10183 #define SH_BLTIN_V2SI2 0
10184 { 4, 4 },
10185 #define SH_BLTIN_V4HI2 1
10186 { 4, 4 },
10187 #define SH_BLTIN_V2SI3 2
10188 { 4, 4, 4 },
10189 #define SH_BLTIN_V4HI3 3
10190 { 4, 4, 4 },
10191 #define SH_BLTIN_V8QI3 4
10192 { 4, 4, 4 },
10193 #define SH_BLTIN_MAC_HISI 5
10194 { 1, 4, 4, 1 },
10195 #define SH_BLTIN_SH_HI 6
10196 { 4, 4, 1 },
10197 #define SH_BLTIN_SH_SI 7
10198 { 4, 4, 1 },
10199 #define SH_BLTIN_V4HI2V2SI 8
10200 { 4, 4, 4 },
10201 #define SH_BLTIN_V4HI2V8QI 9
10202 { 4, 4, 4 },
10203 #define SH_BLTIN_SISF 10
10204 { 4, 2 },
10205 #define SH_BLTIN_LDUA_L 11
10206 { 2, 10 },
10207 #define SH_BLTIN_LDUA_Q 12
10208 { 1, 10 },
10209 #define SH_BLTIN_STUA_L 13
10210 { 0, 10, 2 },
10211 #define SH_BLTIN_STUA_Q 14
10212 { 0, 10, 1 },
10213 #define SH_BLTIN_LDUA_L64 15
10214 { 2, 9 },
10215 #define SH_BLTIN_LDUA_Q64 16
10216 { 1, 9 },
10217 #define SH_BLTIN_STUA_L64 17
10218 { 0, 9, 2 },
10219 #define SH_BLTIN_STUA_Q64 18
10220 { 0, 9, 1 },
10221 #define SH_BLTIN_NUM_SHARED_SIGNATURES 19
10222 #define SH_BLTIN_2 19
10223 #define SH_BLTIN_SU 19
10224 { 1, 2 },
10225 #define SH_BLTIN_3 20
10226 #define SH_BLTIN_SUS 20
10227 { 2, 2, 1 },
10228 #define SH_BLTIN_PSSV 21
10229 { 0, 8, 2, 2 },
10230 #define SH_BLTIN_XXUU 22
10231 #define SH_BLTIN_UUUU 22
10232 { 1, 1, 1, 1 },
10233 #define SH_BLTIN_PV 23
10234 { 0, 8 },
10235 #define SH_BLTIN_VP 24
10236 { 8, 0 },
10237 #define SH_BLTIN_UV 25
10238 { 1, 0 },
10239 #define SH_BLTIN_VU 26
10240 { 0, 1 },
10241 };
10242 /* mcmv: operands considered unsigned. */
10243 /* mmulsum_wq, msad_ubq: result considered unsigned long long. */
10244 /* mperm: control value considered unsigned int. */
10245 /* mshalds, mshard, mshards, mshlld, mshlrd: shift count is unsigned int. */
10246 /* mshards_q: returns signed short. */
10247 /* nsb: takes long long arg, returns unsigned char. */
10248 static struct builtin_description bdesc[] =
10249 {
10250 { sh1_builtin_p,
10251 CODE_FOR_sts_fpscr, "__builtin_sh_get_fpscr", SH_BLTIN_UV, 0 },
10252 { sh1_builtin_p,
10253 CODE_FOR_set_fpscr, "__builtin_sh_set_fpscr", SH_BLTIN_VU, 0 },
10254 };
10255
10256 static tree sh_builtin_get_fpscr;
10257 static tree sh_builtin_set_fpscr;
10258
10259 static void
10260 sh_init_builtins (void)
10261 {
10262 tree shared[SH_BLTIN_NUM_SHARED_SIGNATURES];
10263 memset (shared, 0, sizeof shared);
10264
10265 for (unsigned int di = 0; di < ARRAY_SIZE (bdesc); ++di)
10266 {
10267 builtin_description* d = &bdesc[di];
10268
10269 if (!d->is_enabled ())
10270 continue;
10271
10272 tree type, arg_type = NULL_TREE;
10273 int signature = d->signature;
10274
10275 if (signature < SH_BLTIN_NUM_SHARED_SIGNATURES && shared[signature])
10276 type = shared[signature];
10277 else
10278 {
10279 int has_result = signature_args[signature][0] != 0;
10280 tree args[3];
10281
10282 if (! TARGET_FPU_ANY
10283 && FLOAT_MODE_P (insn_data[d->icode].operand[0].mode))
10284 continue;
10285 for (unsigned int i = 0; i < ARRAY_SIZE (args); i++)
10286 args[i] = NULL_TREE;
10287 for (int i = 3; ; i--)
10288 {
10289 int arg = signature_args[signature][i];
10290 int opno = i - 1 + has_result;
10291
10292 if (arg & 8)
10293 arg_type = ptr_type_node;
10294 else if (arg)
10295 arg_type = (*lang_hooks.types.type_for_mode)
10296 (insn_data[d->icode].operand[opno].mode, (arg & 1));
10297 else if (i)
10298 continue;
10299 else
10300 arg_type = void_type_node;
10301 if (i == 0)
10302 break;
10303 args[i-1] = arg_type;
10304 }
10305 type = build_function_type_list (arg_type, args[0], args[1],
10306 args[2], NULL_TREE);
10307 if (signature < SH_BLTIN_NUM_SHARED_SIGNATURES)
10308 shared[signature] = type;
10309 }
10310 d->fndecl =
10311 add_builtin_function (d->name, type, d - bdesc, BUILT_IN_MD,
10312 NULL, NULL_TREE);
10313 /* Recode {sts,set}_fpscr decls for sh_atomic_assign_expand_fenv. */
10314 if (d->icode == CODE_FOR_sts_fpscr)
10315 sh_builtin_get_fpscr = d->fndecl;
10316 else if (d->icode == CODE_FOR_set_fpscr)
10317 sh_builtin_set_fpscr = d->fndecl;
10318 }
10319 }
10320
10321 /* Implement TARGET_ATOMIC_ASSIGN_EXPAND_FENV. */
10322
10323 static void
10324 sh_atomic_assign_expand_fenv (tree *hold, tree *clear, tree *update)
10325 {
10326 const unsigned SH_FE_INVALID = 64;
10327 const unsigned SH_FE_DIVBYZERO = 32;
10328 const unsigned SH_FE_OVERFLOW = 16;
10329 const unsigned SH_FE_UNDERFLOW = 8;
10330 const unsigned SH_FE_INEXACT = 4;
10331 const unsigned HOST_WIDE_INT SH_FE_ALL_EXCEPT = (SH_FE_INVALID
10332 | SH_FE_DIVBYZERO
10333 | SH_FE_OVERFLOW
10334 | SH_FE_UNDERFLOW
10335 | SH_FE_INEXACT);
10336 const unsigned HOST_WIDE_INT SH_FE_EXCEPT_SHIFT = 5;
10337 tree fenv_var, mask, ld_fenv, masked_fenv;
10338 tree new_fenv_var, reload_fenv, restore_fnenv;
10339 tree update_call, atomic_feraiseexcept, hold_fnclex;
10340
10341 if (! TARGET_FPU_ANY)
10342 return;
10343
10344 /* Generate the equivalent of :
10345 unsigned int fenv_var;
10346 fenv_var = __builtin_sh_get_fpscr ();
10347
10348 unsigned int masked_fenv;
10349 masked_fenv = fenv_var & mask;
10350
10351 __builtin_sh_set_fpscr (masked_fenv); */
10352
10353 fenv_var = create_tmp_var_raw (unsigned_type_node);
10354 mask = build_int_cst (unsigned_type_node,
10355 ~((SH_FE_ALL_EXCEPT << SH_FE_EXCEPT_SHIFT)
10356 | SH_FE_ALL_EXCEPT));
10357 ld_fenv = build2 (MODIFY_EXPR, unsigned_type_node,
10358 fenv_var, build_call_expr (sh_builtin_get_fpscr, 0));
10359 masked_fenv = build2 (BIT_AND_EXPR, unsigned_type_node, fenv_var, mask);
10360 hold_fnclex = build_call_expr (sh_builtin_set_fpscr, 1, masked_fenv);
10361 fenv_var = build4 (TARGET_EXPR, unsigned_type_node, fenv_var,
10362 build2 (COMPOUND_EXPR, void_type_node, masked_fenv,
10363 ld_fenv),
10364 NULL_TREE, NULL_TREE);
10365 *hold = build2 (COMPOUND_EXPR, void_type_node, fenv_var, hold_fnclex);
10366
10367 /* Store the value of masked_fenv to clear the exceptions:
10368 __builtin_sh_set_fpscr (masked_fenv); */
10369
10370 *clear = build_call_expr (sh_builtin_set_fpscr, 1, masked_fenv);
10371
10372 /* Generate the equivalent of :
10373 unsigned int new_fenv_var;
10374 new_fenv_var = __builtin_sh_get_fpscr ();
10375
10376 __builtin_sh_set_fpscr (fenv_var);
10377
10378 __atomic_feraiseexcept (new_fenv_var); */
10379
10380 new_fenv_var = create_tmp_var_raw (unsigned_type_node);
10381 reload_fenv = build2 (MODIFY_EXPR, unsigned_type_node, new_fenv_var,
10382 build_call_expr (sh_builtin_get_fpscr, 0));
10383 restore_fnenv = build_call_expr (sh_builtin_set_fpscr, 1, fenv_var);
10384 atomic_feraiseexcept = builtin_decl_implicit (BUILT_IN_ATOMIC_FERAISEEXCEPT);
10385 update_call = build_call_expr (atomic_feraiseexcept, 1,
10386 fold_convert (integer_type_node,
10387 new_fenv_var));
10388 *update = build2 (COMPOUND_EXPR, void_type_node,
10389 build2 (COMPOUND_EXPR, void_type_node,
10390 reload_fenv, restore_fnenv), update_call);
10391 }
10392
10393 /* Implements target hook vector_mode_supported_p. */
10394 bool
10395 sh_vector_mode_supported_p (machine_mode mode ATTRIBUTE_UNUSED)
10396 {
10397 return false;
10398 }
10399
10400 bool
10401 sh_frame_pointer_required (void)
10402 {
10403 /* If needed override this in other tm.h files to cope with various OS
10404 lossage requiring a frame pointer. */
10405 if (SUBTARGET_FRAME_POINTER_REQUIRED)
10406 return true;
10407
10408 if (crtl->profile)
10409 return true;
10410
10411 return false;
10412 }
10413
10414 /* Implements target hook dwarf_calling_convention. Return an enum
10415 of dwarf_calling_convention. */
10416 int
10417 sh_dwarf_calling_convention (const_tree func)
10418 {
10419 if (sh_attr_renesas_p (func))
10420 return DW_CC_GNU_renesas_sh;
10421
10422 return DW_CC_normal;
10423 }
10424
10425 /* Returns the sh builtin decl for CODE. */
10426 static tree
10427 sh_builtin_decl (unsigned code, bool initialize_p ATTRIBUTE_UNUSED)
10428 {
10429 if (code >= ARRAY_SIZE (bdesc))
10430 return error_mark_node;
10431
10432 if (!bdesc[code].is_enabled ())
10433 return error_mark_node;
10434
10435 return bdesc[code].fndecl;
10436 }
10437
10438 /* Expand an expression EXP that calls a built-in function,
10439 with result going to TARGET if that's convenient
10440 (and in mode MODE if that's convenient).
10441 SUBTARGET may be used as the target for computing one of EXP's operands.
10442 IGNORE is nonzero if the value is to be ignored. */
10443 static rtx
10444 sh_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
10445 machine_mode mode ATTRIBUTE_UNUSED, int ignore)
10446 {
10447 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0);
10448 unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl);
10449 const struct builtin_description *d = &bdesc[fcode];
10450 enum insn_code icode = d->icode;
10451 int signature = d->signature;
10452 int nop = 0;
10453 rtx op[4];
10454
10455 if (signature_args[signature][0])
10456 {
10457 if (ignore)
10458 return NULL_RTX;
10459
10460 machine_mode tmode = insn_data[icode].operand[0].mode;
10461 if (! target || GET_MODE (target) != tmode
10462 || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
10463 target = gen_reg_rtx (tmode);
10464 op[nop++] = target;
10465 }
10466 else
10467 target = NULL_RTX;
10468
10469 for (int i = 1; i <= 3; i++, nop++)
10470 {
10471 if (! signature_args[signature][i])
10472 break;
10473 tree arg = CALL_EXPR_ARG (exp, i - 1);
10474 if (arg == error_mark_node)
10475 return const0_rtx;
10476
10477 machine_mode opmode;
10478 tree optype;
10479 if (signature_args[signature][i] & 8)
10480 {
10481 opmode = ptr_mode;
10482 optype = ptr_type_node;
10483 }
10484 else
10485 {
10486 opmode = insn_data[icode].operand[nop].mode;
10487 optype = (*lang_hooks.types.type_for_mode) (opmode, 0);
10488 }
10489
10490 machine_mode argmode = TYPE_MODE (TREE_TYPE (arg));
10491 if (argmode != opmode)
10492 arg = build1 (NOP_EXPR, optype, arg);
10493 op[nop] = expand_expr (arg, NULL_RTX, opmode, EXPAND_NORMAL);
10494 if (! (*insn_data[icode].operand[nop].predicate) (op[nop], opmode))
10495 op[nop] = copy_to_mode_reg (opmode, op[nop]);
10496 }
10497
10498 rtx pat = NULL_RTX;
10499
10500 switch (nop)
10501 {
10502 case 1:
10503 pat = (*insn_data[d->icode].genfun) (op[0]);
10504 break;
10505 case 2:
10506 pat = (*insn_data[d->icode].genfun) (op[0], op[1]);
10507 break;
10508 case 3:
10509 pat = (*insn_data[d->icode].genfun) (op[0], op[1], op[2]);
10510 break;
10511 case 4:
10512 pat = (*insn_data[d->icode].genfun) (op[0], op[1], op[2], op[3]);
10513 break;
10514 default:
10515 gcc_unreachable ();
10516 }
10517 if (! pat)
10518 return NULL_RTX;
10519 emit_insn (pat);
10520 return target;
10521 }
10522
10523 /* Implement TARGET_HARD_REGNO_NREGS. On the SH all but the XD regs are
10524 UNITS_PER_WORD bits wide. */
10525
10526 static unsigned int
10527 sh_hard_regno_nregs (unsigned int regno, machine_mode mode)
10528 {
10529 if (XD_REGISTER_P (regno))
10530 return CEIL (GET_MODE_SIZE (mode), 2 * UNITS_PER_WORD);
10531 return CEIL (GET_MODE_SIZE (mode), UNITS_PER_WORD);
10532 }
10533
10534 /* Implement TARGET_HARD_REGNO_MODE_OK.
10535
10536 We can allow any mode in any general register. The special registers
10537 only allow SImode. Don't allow any mode in the PR.
10538
10539 We cannot hold DCmode values in the XD registers because alter_reg
10540 handles subregs of them incorrectly. We could work around this by
10541 spacing the XD registers like the DR registers, but this would require
10542 additional memory in every compilation to hold larger register vectors.
10543 We could hold SFmode / SCmode values in XD registers, but that
10544 would require a tertiary reload when reloading from / to memory,
10545 and a secondary reload to reload from / to general regs; that
10546 seems to be a losing proposition.
10547
10548 We want to allow TImode FP regs so that when V4SFmode is loaded as TImode,
10549 it won't be ferried through GP registers first. */
10550 static bool
10551 sh_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
10552 {
10553 if (SPECIAL_REGISTER_P (regno))
10554 return mode == SImode;
10555
10556 if (regno == FPUL_REG)
10557 return (mode == SImode || mode == SFmode);
10558
10559 if (FP_REGISTER_P (regno) && mode == SFmode)
10560 return true;
10561
10562 if (mode == V2SFmode)
10563 {
10564 if (((FP_REGISTER_P (regno) && (regno - FIRST_FP_REG) % 2 == 0)
10565 || GENERAL_REGISTER_P (regno)))
10566 return true;
10567 else
10568 return false;
10569 }
10570
10571 if (mode == V4SFmode)
10572 {
10573 if ((FP_REGISTER_P (regno) && (regno - FIRST_FP_REG) % 4 == 0)
10574 || GENERAL_REGISTER_P (regno))
10575 return true;
10576 else
10577 return false;
10578 }
10579
10580 if (mode == V16SFmode)
10581 return regno == FIRST_XD_REG;
10582
10583 if (FP_REGISTER_P (regno))
10584 {
10585 if (mode == SFmode
10586 || mode == SImode
10587 || ((TARGET_SH2E) && mode == SCmode)
10588 || (((TARGET_FPU_DOUBLE && mode == DFmode) || mode == DCmode)
10589 && ((regno - FIRST_FP_REG) & 1) == 0)
10590 || (TARGET_SH4 && mode == TImode
10591 && ((regno - FIRST_FP_REG) & 3) == 0))
10592 return true;
10593 else
10594 return false;
10595 }
10596
10597 if (XD_REGISTER_P (regno))
10598 return mode == DFmode;
10599
10600 if (regno == PR_REG)
10601 return mode == SImode;
10602
10603 if (regno == FPSCR_REG)
10604 return mode == SImode;
10605
10606 return true;
10607 }
10608
10609 /* Implement TARGET_MODES_TIEABLE_P.
10610
10611 If TARGET_HARD_REGNO_MODE_OK could produce different values for MODE1
10612 and MODE2, for any hard reg, then this must be false for correct output.
10613 That's the case for xd registers: we don't hold SFmode values in
10614 them, so we can't tie an SFmode pseudos with one in another
10615 floating-point mode. */
10616
10617 static bool
10618 sh_modes_tieable_p (machine_mode mode1, machine_mode mode2)
10619 {
10620 return (mode1 == mode2
10621 || (GET_MODE_CLASS (mode1) == GET_MODE_CLASS (mode2)
10622 && (mode1 != SFmode && mode2 != SFmode)));
10623 }
10624
10625 /* Specify the modes required to caller save a given hard regno.
10626 choose_hard_reg_mode chooses mode based on TARGET_HARD_REGNO_MODE_OK
10627 and returns ?Imode for float regs when sh_hard_regno_mode_ok
10628 permits integer modes on them. That makes LRA's split process
10629 unhappy. See PR55212.
10630 */
10631 machine_mode
10632 sh_hard_regno_caller_save_mode (unsigned int regno, unsigned int nregs,
10633 machine_mode mode)
10634 {
10635 if (FP_REGISTER_P (regno)
10636 && (mode == SFmode
10637 || mode == SCmode
10638 || ((mode == DFmode || mode == DCmode)
10639 && ((regno - FIRST_FP_REG) & 1) == 0)))
10640 return mode;
10641
10642 return choose_hard_reg_mode (regno, nregs, NULL);
10643 }
10644
10645 /* Implement TARGET_CAN_CHANGE_MODE_CLASS. */
10646 static bool
10647 sh_can_change_mode_class (machine_mode from, machine_mode to,
10648 reg_class_t rclass)
10649 {
10650 /* We want to enable the use of SUBREGs as a means to
10651 VEC_SELECT a single element of a vector. */
10652
10653 /* This effectively disallows using GENERAL_REGS for SFmode vector subregs.
10654 This can be problematic when SFmode vector subregs need to be accessed
10655 on the stack with displacement addressing, as it happens with -O0.
10656 Thus we disallow the mode change for -O0. */
10657 if (to == SFmode && VECTOR_MODE_P (from) && GET_MODE_INNER (from) == SFmode)
10658 return optimize ? !reg_classes_intersect_p (GENERAL_REGS, rclass) : true;
10659
10660 if (GET_MODE_SIZE (from) != GET_MODE_SIZE (to))
10661 {
10662 if (TARGET_LITTLE_ENDIAN)
10663 {
10664 if (GET_MODE_SIZE (to) < 8 || GET_MODE_SIZE (from) < 8)
10665 return !reg_classes_intersect_p (DF_REGS, rclass);
10666 }
10667 else
10668 {
10669 if (GET_MODE_SIZE (from) < 8)
10670 return !reg_classes_intersect_p (DF_REGS, rclass);
10671 }
10672 }
10673 return true;
10674 }
10675
10676 /* Return true if registers in machine mode MODE will likely be
10677 allocated to registers in small register classes. */
10678 bool
10679 sh_small_register_classes_for_mode_p (machine_mode mode ATTRIBUTE_UNUSED)
10680 {
10681 return true;
10682 }
10683
10684 /* If ADDRESS refers to a CODE_LABEL, add NUSES to the number of times
10685 that label is used. */
10686 void
10687 sh_mark_label (rtx address, int nuses)
10688 {
10689 if (GOTOFF_P (address))
10690 {
10691 /* Extract the label or symbol. */
10692 address = XEXP (address, 0);
10693 if (GET_CODE (address) == PLUS)
10694 address = XEXP (address, 0);
10695 address = XVECEXP (address, 0, 0);
10696 }
10697 if (GET_CODE (address) == LABEL_REF
10698 && LABEL_P (XEXP (address, 0)))
10699 LABEL_NUSES (XEXP (address, 0)) += nuses;
10700 }
10701
10702 /* Compute extra cost of moving data between one register class
10703 and another.
10704
10705 If SECONDARY*_RELOAD_CLASS says something about the src/dst pair, regclass
10706 uses this information. Hence, the general register <-> floating point
10707 register information here is not used for SFmode. */
10708 static int
10709 sh_register_move_cost (machine_mode mode,
10710 reg_class_t srcclass, reg_class_t dstclass)
10711 {
10712 if (dstclass == T_REGS || dstclass == PR_REGS)
10713 return 10;
10714
10715 if (dstclass == MAC_REGS && srcclass == MAC_REGS)
10716 return 4;
10717
10718 if (mode == SImode && TARGET_FMOVD
10719 && REGCLASS_HAS_FP_REG (srcclass)
10720 && REGCLASS_HAS_FP_REG (dstclass))
10721 return 4;
10722
10723 if (REGCLASS_HAS_FP_REG (dstclass) && srcclass == T_REGS)
10724 return ((TARGET_HARD_SH4 && !optimize_size) ? 10 : 7);
10725
10726 if ((REGCLASS_HAS_FP_REG (dstclass) && srcclass == MAC_REGS)
10727 || (dstclass == MAC_REGS && REGCLASS_HAS_FP_REG (srcclass)))
10728 return 9;
10729
10730 if ((REGCLASS_HAS_FP_REG (dstclass)
10731 && REGCLASS_HAS_GENERAL_REG (srcclass))
10732 || (REGCLASS_HAS_GENERAL_REG (dstclass)
10733 && REGCLASS_HAS_FP_REG (srcclass)))
10734 {
10735 /* Discourage trying to use fp regs for a pointer. This also
10736 discourages fp regs with SImode because Pmode is an alias
10737 of SImode on this target. See PR target/48596. */
10738 int addend = (mode == Pmode) ? 40 : 0;
10739
10740 return ((TARGET_FMOVD ? 8 : 12) + addend)
10741 * ((GET_MODE_SIZE (mode) + 7) / 8U);
10742 }
10743
10744 if ((dstclass == FPUL_REGS
10745 && REGCLASS_HAS_GENERAL_REG (srcclass))
10746 || (srcclass == FPUL_REGS
10747 && REGCLASS_HAS_GENERAL_REG (dstclass)))
10748 return 5;
10749
10750 if ((dstclass == FPUL_REGS
10751 && (srcclass == PR_REGS || srcclass == MAC_REGS || srcclass == T_REGS))
10752 || (srcclass == FPUL_REGS
10753 && (dstclass == PR_REGS || dstclass == MAC_REGS)))
10754 return 7;
10755
10756 if ((srcclass == FPSCR_REGS && ! REGCLASS_HAS_GENERAL_REG (dstclass))
10757 || (dstclass == FPSCR_REGS && ! REGCLASS_HAS_GENERAL_REG (srcclass)))
10758 return 4;
10759
10760 if (TARGET_FMOVD
10761 && ! REGCLASS_HAS_GENERAL_REG (srcclass)
10762 && ! REGCLASS_HAS_GENERAL_REG (dstclass))
10763 return 2 * ((GET_MODE_SIZE (mode) + 7) / 8U);
10764
10765 return 2 * ((GET_MODE_SIZE (mode) + 3) / 4U);
10766 }
10767
10768 static rtx
10769 emit_load_ptr (rtx reg, rtx addr)
10770 {
10771 rtx mem = gen_const_mem (ptr_mode, addr);
10772
10773 if (Pmode != ptr_mode)
10774 mem = gen_rtx_SIGN_EXTEND (Pmode, mem);
10775 return emit_move_insn (reg, mem);
10776 }
10777
10778 static void
10779 sh_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
10780 HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
10781 tree function)
10782 {
10783 const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
10784 CUMULATIVE_ARGS cum;
10785 int structure_value_byref = 0;
10786 rtx this_rtx, this_value, sibcall, funexp;
10787 rtx_insn *insns;
10788 tree funtype = TREE_TYPE (function);
10789 int simple_add = CONST_OK_FOR_ADD (delta);
10790 int did_load = 0;
10791 rtx scratch0, scratch1, scratch2;
10792
10793 reload_completed = 1;
10794 epilogue_completed = 1;
10795 crtl->uses_only_leaf_regs = 1;
10796
10797 emit_note (NOTE_INSN_PROLOGUE_END);
10798
10799 /* Find the "this" pointer. We have such a wide range of ABIs for the
10800 SH that it's best to do this completely machine independently.
10801 "this" is passed as first argument, unless a structure return pointer
10802 comes first, in which case "this" comes second. */
10803 INIT_CUMULATIVE_ARGS (cum, funtype, NULL_RTX, 0, 1);
10804 #ifndef PCC_STATIC_STRUCT_RETURN
10805 if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
10806 structure_value_byref = 1;
10807 #endif /* not PCC_STATIC_STRUCT_RETURN */
10808 if (structure_value_byref && sh_struct_value_rtx (function, 0) == 0)
10809 {
10810 tree ptype = build_pointer_type (TREE_TYPE (funtype));
10811
10812 function_arg_info ptr_arg (ptype, Pmode, /*named=*/true);
10813 sh_function_arg_advance (pack_cumulative_args (&cum), ptr_arg);
10814 }
10815 function_arg_info ptr_arg (ptr_type_node, Pmode, /*named=*/true);
10816 this_rtx = sh_function_arg (pack_cumulative_args (&cum), ptr_arg);
10817
10818 /* For SHcompact, we only have r0 for a scratch register: r1 is the
10819 static chain pointer (even if you can't have nested virtual functions
10820 right now, someone might implement them sometime), and the rest of the
10821 registers are used for argument passing, are callee-saved, or reserved. */
10822 /* We need to check call_used_regs / fixed_regs in case -fcall_saved-reg /
10823 -ffixed-reg has been used. */
10824 if (! call_used_or_fixed_reg_p (0) || fixed_regs[0])
10825 error ("r0 needs to be available as a call-clobbered register");
10826 scratch0 = scratch1 = scratch2 = gen_rtx_REG (Pmode, 0);
10827
10828 {
10829 if (call_used_or_fixed_reg_p (1) && ! fixed_regs[1])
10830 scratch1 = gen_rtx_REG (ptr_mode, 1);
10831 /* N.B., if not TARGET_HITACHI, register 2 is used to pass the pointer
10832 pointing where to return struct values. */
10833 if (call_used_or_fixed_reg_p (3) && ! fixed_regs[3])
10834 scratch2 = gen_rtx_REG (Pmode, 3);
10835 }
10836
10837 this_value = plus_constant (Pmode, this_rtx, delta);
10838 if (vcall_offset
10839 && (simple_add || scratch0 != scratch1)
10840 && strict_memory_address_p (ptr_mode, this_value))
10841 {
10842 emit_load_ptr (scratch0, this_value);
10843 did_load = 1;
10844 }
10845
10846 if (!delta)
10847 ; /* Do nothing. */
10848 else if (simple_add)
10849 emit_move_insn (this_rtx, this_value);
10850 else
10851 {
10852 emit_move_insn (scratch1, GEN_INT (delta));
10853 emit_insn (gen_add2_insn (this_rtx, scratch1));
10854 }
10855
10856 if (vcall_offset)
10857 {
10858 rtx offset_addr;
10859
10860 if (!did_load)
10861 emit_load_ptr (scratch0, this_rtx);
10862
10863 offset_addr = plus_constant (Pmode, scratch0, vcall_offset);
10864 if (strict_memory_address_p (ptr_mode, offset_addr))
10865 ; /* Do nothing. */
10866 else if (scratch0 != scratch1)
10867 {
10868 /* scratch0 != scratch1, and we have indexed loads. Get better
10869 schedule by loading the offset into r1 and using an indexed
10870 load - then the load of r1 can issue before the load from
10871 (this_rtx + delta) finishes. */
10872 emit_move_insn (scratch1, GEN_INT (vcall_offset));
10873 offset_addr = gen_rtx_PLUS (Pmode, scratch0, scratch1);
10874 }
10875 else if (CONST_OK_FOR_ADD (vcall_offset))
10876 {
10877 emit_insn (gen_add2_insn (scratch0, GEN_INT (vcall_offset)));
10878 offset_addr = scratch0;
10879 }
10880 else
10881 gcc_unreachable (); /* FIXME */
10882 emit_load_ptr (scratch0, offset_addr);
10883
10884 if (Pmode != ptr_mode)
10885 scratch0 = gen_rtx_TRUNCATE (ptr_mode, scratch0);
10886 emit_insn (gen_add2_insn (this_rtx, scratch0));
10887 }
10888
10889 /* Generate a tail call to the target function. */
10890 if (! TREE_USED (function))
10891 {
10892 assemble_external (function);
10893 TREE_USED (function) = 1;
10894 }
10895 funexp = XEXP (DECL_RTL (function), 0);
10896 /* If the function is overridden, so is the thunk, hence we don't
10897 need GOT addressing even if this is a public symbol. */
10898 #if 0
10899 if (TARGET_SH1 && ! flag_weak)
10900 sibcall = gen_sibcalli_thunk (funexp, const0_rtx);
10901 else
10902 #endif
10903 if (TARGET_SH2 && flag_pic)
10904 {
10905 if (TARGET_FDPIC)
10906 {
10907 sibcall = gen_sibcall_pcrel_fdpic (funexp, const0_rtx);
10908 XEXP (XVECEXP (sibcall, 0, 3), 0) = scratch2;
10909 }
10910 else
10911 {
10912 sibcall = gen_sibcall_pcrel (funexp, const0_rtx);
10913 XEXP (XVECEXP (sibcall, 0, 2), 0) = scratch2;
10914 }
10915 }
10916 else
10917 {
10918 emit_move_insn (scratch2, funexp);
10919 funexp = gen_rtx_MEM (FUNCTION_MODE, scratch2);
10920 sibcall = gen_sibcall (funexp, const0_rtx, NULL_RTX);
10921 }
10922 sibcall = emit_call_insn (sibcall);
10923 SIBLING_CALL_P (sibcall) = 1;
10924 use_reg (&CALL_INSN_FUNCTION_USAGE (sibcall), this_rtx);
10925 emit_barrier ();
10926
10927 /* Run just enough of rest_of_compilation to do scheduling and get
10928 the insns emitted. */
10929
10930 insns = get_insns ();
10931
10932 if (optimize > 0)
10933 {
10934 if (! cfun->cfg)
10935 init_flow (cfun);
10936 split_all_insns_noflow ();
10937 }
10938
10939 sh_reorg ();
10940 shorten_branches (insns);
10941 assemble_start_function (thunk_fndecl, fnname);
10942 final_start_function (insns, file, 1);
10943 final (insns, file, 1);
10944 final_end_function ();
10945 assemble_end_function (thunk_fndecl, fnname);
10946
10947 reload_completed = 0;
10948 epilogue_completed = 0;
10949 }
10950
10951 /* Return an RTX pair for the address and call site label of a function
10952 NAME of kind KIND, placing the result in TARGET if not NULL. For
10953 SFUNC_STATIC, if FDPIC, the LAB member of result will be set to
10954 (const_int 0) if jsr should be used, or a label_ref if bsrf should
10955 be used. For FDPIC, both SFUNC_GOT and SFUNC_STATIC will return the
10956 address of the function itself, not a function descriptor, so they
10957 can only be used with functions not using the FDPIC register that
10958 are known to be called directory without a PLT entry. */
10959
10960 function_symbol_result
10961 function_symbol (rtx target, const char *name, sh_function_kind kind)
10962 {
10963 /* If this is not an ordinary function, the name usually comes from a
10964 string literal or an sprintf buffer. Make sure we use the same
10965 string consistently, so that cse will be able to unify address loads. */
10966 if (kind != FUNCTION_ORDINARY)
10967 name = IDENTIFIER_POINTER (get_identifier (name));
10968 rtx sym = gen_rtx_SYMBOL_REF (Pmode, name);
10969 rtx lab = const0_rtx;
10970 SYMBOL_REF_FLAGS (sym) = SYMBOL_FLAG_FUNCTION;
10971 if (flag_pic)
10972 switch (kind)
10973 {
10974 case FUNCTION_ORDINARY:
10975 break;
10976 case SFUNC_GOT:
10977 {
10978 rtx reg = target ? target : gen_reg_rtx (Pmode);
10979
10980 emit_insn (gen_symGOT2reg (reg, sym));
10981 sym = reg;
10982 break;
10983 }
10984 case SFUNC_STATIC:
10985 {
10986 rtx reg = target ? target : gen_reg_rtx (Pmode);
10987
10988 if (TARGET_FDPIC)
10989 {
10990 /* We use PC-relative calls, since GOTOFF can only refer
10991 to writable data. This works along with sh_sfunc_call. */
10992 lab = PATTERN (gen_call_site ());
10993 emit_insn (gen_sym_label2reg (reg, sym, lab));
10994 }
10995 else
10996 {
10997 /* ??? To allow cse to work, we use GOTOFF relocations.
10998 we could add combiner patterns to transform this into
10999 straight pc-relative calls with sym2PIC / bsrf when
11000 label load and function call are still 1:1 and in the
11001 same basic block during combine. */
11002 emit_insn (gen_symGOTOFF2reg (reg, sym));
11003 }
11004
11005 sym = reg;
11006 break;
11007 }
11008 }
11009 if (target && sym != target)
11010 {
11011 emit_move_insn (target, sym);
11012 return function_symbol_result (target, lab);
11013 }
11014 return function_symbol_result (sym, lab);
11015 }
11016
11017 /* Find the number of the first general purpose register in S that
11018 is not set. */
11019 static int
11020 scavenge_reg (HARD_REG_SET *s)
11021 {
11022 for (int r = FIRST_GENERAL_REG; r <= LAST_GENERAL_REG; r++)
11023 if (TEST_HARD_REG_BIT (*s, r))
11024 return r;
11025 return -1;
11026 }
11027
11028 rtx
11029 sh_get_pr_initial_val (void)
11030 {
11031 /* If we haven't finished rtl generation, there might be a nonlocal label
11032 that we haven't seen yet.
11033 ??? get_hard_reg_initial_val fails if it is called after register
11034 allocation has started, unless it has been called before for the
11035 same register. And even then, we end in trouble if we didn't use
11036 the register in the same basic block before. So call
11037 get_hard_reg_initial_val now and wrap it in an unspec if we might
11038 need to replace it. */
11039 /* ??? We also must do this for TARGET_SH1 in general, because otherwise
11040 combine can put the pseudo returned by get_hard_reg_initial_val into
11041 instructions that need a general purpose registers, which will fail to
11042 be recognized when the pseudo becomes allocated to PR. */
11043 rtx val = get_hard_reg_initial_val (Pmode, PR_REG);
11044 return gen_rtx_UNSPEC (SImode, gen_rtvec (1, val), UNSPEC_RA);
11045 }
11046
11047 bool
11048 sh_expand_t_scc (rtx operands[])
11049 {
11050 enum rtx_code code = GET_CODE (operands[1]);
11051 rtx target = operands[0];
11052 rtx op0 = operands[2];
11053 rtx op1 = operands[3];
11054 rtx result = target;
11055
11056 if (!REG_P (op0) || REGNO (op0) != T_REG
11057 || !CONST_INT_P (op1))
11058 return false;
11059 if (!REG_P (result))
11060 result = gen_reg_rtx (SImode);
11061 HOST_WIDE_INT val = INTVAL (op1);
11062 if ((code == EQ && val == 1) || (code == NE && val == 0))
11063 emit_insn (gen_movt (result, get_t_reg_rtx ()));
11064 else if ((code == EQ && val == 0) || (code == NE && val == 1))
11065 emit_insn (gen_movnegt (result, get_t_reg_rtx ()));
11066 else if (code == EQ || code == NE)
11067 emit_insn (gen_move_insn (result, GEN_INT (code == NE)));
11068 else
11069 return false;
11070 if (result != target)
11071 emit_move_insn (target, result);
11072 return true;
11073 }
11074
11075 /* INSN is an sfunc; return the rtx that describes the address used. */
11076 static rtx
11077 extract_sfunc_addr (rtx insn)
11078 {
11079 rtx pattern = PATTERN (insn);
11080 const int len = XVECLEN (pattern, 0);
11081 for (int i = 0; i < len; i++)
11082 {
11083 rtx part = XVECEXP (pattern, 0, i);
11084 if (GET_CODE (part) == USE && GET_MODE (XEXP (part, 0)) == Pmode
11085 && GENERAL_REGISTER_P (true_regnum (XEXP (part, 0))))
11086 return XEXP (part, 0);
11087 }
11088 gcc_assert (GET_CODE (XVECEXP (pattern, 0, 0)) == UNSPEC_VOLATILE);
11089 return XVECEXP (XVECEXP (pattern, 0, 0), 0, 1);
11090 }
11091
11092 /* Verify that the register in use_sfunc_addr still agrees with the address
11093 used in the sfunc. This prevents fill_slots_from_thread from changing
11094 use_sfunc_addr.
11095 INSN is the use_sfunc_addr instruction, and REG is the register it
11096 guards. */
11097 bool
11098 check_use_sfunc_addr (rtx_insn *insn, rtx reg)
11099 {
11100 /* Search for the sfunc. It should really come right after INSN. */
11101 while ((insn = NEXT_INSN (insn)))
11102 {
11103 if (LABEL_P (insn) || JUMP_P (insn))
11104 break;
11105 if (! INSN_P (insn))
11106 continue;
11107
11108 if (rtx_sequence *seq = dyn_cast<rtx_sequence *> (PATTERN (insn)))
11109 insn = seq->insn (0);
11110 if (GET_CODE (PATTERN (insn)) != PARALLEL
11111 || get_attr_type (insn) != TYPE_SFUNC)
11112 continue;
11113 return rtx_equal_p (extract_sfunc_addr (insn), reg);
11114 }
11115 gcc_unreachable ();
11116 }
11117
11118 /* This function returns a constant rtx that represents 2**15 / pi in
11119 SFmode. It's used to scale a fixed-point signed 16.16-bit fraction
11120 of a full circle back to an SFmode value, i.e. 0x10000 maps to 2*pi. */
11121 static GTY(()) rtx sh_fsca_sf2int_rtx;
11122
11123 rtx
11124 sh_fsca_sf2int (void)
11125 {
11126 if (! sh_fsca_sf2int_rtx)
11127 {
11128 REAL_VALUE_TYPE rv;
11129
11130 real_from_string (&rv, "10430.378350470453");
11131 sh_fsca_sf2int_rtx = const_double_from_real_value (rv, SFmode);
11132 }
11133
11134 return sh_fsca_sf2int_rtx;
11135 }
11136
11137 /* This function returns a constant rtx that represents pi / 2**15 in
11138 SFmode. It's used to scale SFmode angles, in radians, to a
11139 fixed-point signed 16.16-bit fraction of a full circle, i.e. 2*pi
11140 maps to 0x10000. */
11141 static GTY(()) rtx sh_fsca_int2sf_rtx;
11142
11143 rtx
11144 sh_fsca_int2sf (void)
11145 {
11146 if (! sh_fsca_int2sf_rtx)
11147 {
11148 REAL_VALUE_TYPE rv;
11149
11150 real_from_string (&rv, "9.587379924285257e-5");
11151 sh_fsca_int2sf_rtx = const_double_from_real_value (rv, SFmode);
11152 }
11153
11154 return sh_fsca_int2sf_rtx;
11155 }
11156
11157 /* Initialize the CUMULATIVE_ARGS structure. */
11158 void
11159 sh_init_cumulative_args (CUMULATIVE_ARGS * pcum,
11160 tree fntype,
11161 rtx libname ATTRIBUTE_UNUSED,
11162 tree fndecl,
11163 signed int n_named_args,
11164 machine_mode mode)
11165 {
11166 pcum->arg_count [(int) SH_ARG_FLOAT] = 0;
11167 pcum->free_single_fp_reg = 0;
11168 pcum->outgoing = n_named_args != -1;
11169
11170 /* FIXME: Should we check TARGET_HITACHI here ??? */
11171 pcum->renesas_abi = sh_attr_renesas_p (fntype);
11172
11173 if (fntype)
11174 {
11175 pcum->force_mem = ((TARGET_HITACHI || pcum->renesas_abi)
11176 && aggregate_value_p (TREE_TYPE (fntype), fndecl));
11177 pcum->prototype_p = prototype_p (fntype);
11178 pcum->arg_count [(int) SH_ARG_INT] = false;
11179 }
11180 else
11181 {
11182 pcum->arg_count [(int) SH_ARG_INT] = 0;
11183 pcum->prototype_p = false;
11184 if (mode != VOIDmode)
11185 {
11186 /* If the default ABI is the Renesas ABI then all library
11187 calls must assume that the library will be using the
11188 Renesas ABI. So if the function would return its result
11189 in memory then we must force the address of this memory
11190 block onto the stack. Ideally we would like to call
11191 targetm.calls.return_in_memory() here but we do not have
11192 the TYPE or the FNDECL available so we synthesize the
11193 contents of that function as best we can. */
11194 pcum->force_mem =
11195 (TARGET_DEFAULT & MASK_HITACHI)
11196 && (mode == BLKmode
11197 || (GET_MODE_SIZE (mode) > 4
11198 && !(mode == DFmode
11199 && TARGET_FPU_DOUBLE)));
11200 }
11201 else
11202 pcum->force_mem = false;
11203 }
11204 }
11205
11206 rtx
11207 sh_gen_truncate (machine_mode mode, rtx x, int need_sign_ext)
11208 {
11209 enum rtx_code code = TRUNCATE;
11210
11211 if (GET_CODE (x) == ZERO_EXTEND || GET_CODE (x) == SIGN_EXTEND)
11212 {
11213 rtx inner = XEXP (x, 0);
11214 machine_mode inner_mode = GET_MODE (inner);
11215
11216 if (inner_mode == mode)
11217 return inner;
11218 else if (GET_MODE_SIZE (inner_mode) >= GET_MODE_SIZE (mode))
11219 x = inner;
11220 else if (GET_MODE_SIZE (inner_mode) < GET_MODE_SIZE (mode)
11221 && (! need_sign_ext || GET_CODE (x) == SIGN_EXTEND))
11222 {
11223 code = GET_CODE (x);
11224 x = inner;
11225 }
11226 }
11227 return gen_rtx_fmt_e (code, mode, x);
11228 }
11229
11230 /* Load and store depend on the highpart of the address. However,
11231 set_attr_alternative does not give well-defined results before reload,
11232 so we must look at the rtl ourselves to see if any of the feeding
11233 registers is used in a memref.
11234
11235 Return true iff INSN contains a MEM. */
11236 bool
11237 sh_contains_memref_p (rtx insn)
11238 {
11239 subrtx_iterator::array_type array;
11240 FOR_EACH_SUBRTX (iter, array, PATTERN (insn), NONCONST)
11241 if (MEM_P (*iter))
11242 return true;
11243 return false;
11244 }
11245
11246 /* Return true iff INSN loads a banked register. */
11247 bool
11248 sh_loads_bankedreg_p (rtx insn)
11249 {
11250 if (GET_CODE (PATTERN (insn)) == SET)
11251 {
11252 rtx op = SET_DEST (PATTERN(insn));
11253 if (REG_P (op) && BANKED_REGISTER_P (REGNO (op)))
11254 return true;
11255 }
11256
11257 return false;
11258 }
11259
11260 /* Implement TARGET_PREFERRED_RELOAD_CLASS. */
11261 static reg_class_t
11262 sh_preferred_reload_class (rtx x ATTRIBUTE_UNUSED, reg_class_t rclass)
11263 {
11264 return rclass;
11265 }
11266
11267 /* Implement TARGET_SECONDARY_RELOAD. */
11268 static reg_class_t
11269 sh_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
11270 machine_mode mode, secondary_reload_info *sri)
11271 {
11272 enum reg_class rclass = (enum reg_class) rclass_i;
11273
11274 if (MEM_P (x) && GET_CODE (XEXP (x, 0)) == PLUS
11275 && REG_P (XEXP (XEXP (x, 0), 0))
11276 && REGNO (XEXP (XEXP (x, 0), 0)) == GBR_REG)
11277 return rclass == R0_REGS ? NO_REGS : R0_REGS;
11278
11279 if (MEM_P (x) && REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) == GBR_REG)
11280 return rclass == R0_REGS ? NO_REGS : R0_REGS;
11281
11282 if (REG_P (x) && REGNO (x) == GBR_REG)
11283 return NO_REGS;
11284
11285 if (in_p)
11286 {
11287 if (REGCLASS_HAS_FP_REG (rclass)
11288 && immediate_operand ((x), mode)
11289 && ! ((fp_zero_operand (x) || fp_one_operand (x)) && mode == SFmode))
11290 switch (mode)
11291 {
11292 case E_SFmode:
11293 sri->icode = CODE_FOR_reload_insf__frn;
11294 return NO_REGS;
11295 case E_DFmode:
11296 sri->icode = CODE_FOR_reload_indf__frn;
11297 return NO_REGS;
11298 case E_SImode:
11299 /* ??? If we knew that we are in the appropriate mode -
11300 single precision - we could use a reload pattern directly. */
11301 return FPUL_REGS;
11302 default:
11303 abort ();
11304 }
11305 if (rclass == FPUL_REGS
11306 && ((REG_P (x) && (REGNO (x) == MACL_REG || REGNO (x) == MACH_REG
11307 || REGNO (x) == T_REG))
11308 || GET_CODE (x) == PLUS))
11309 return GENERAL_REGS;
11310 if (rclass == FPUL_REGS && immediate_operand (x, mode))
11311 {
11312 if (satisfies_constraint_I08 (x) || fp_zero_operand (x))
11313 return GENERAL_REGS;
11314 else if (mode == SFmode)
11315 return FP_REGS;
11316 sri->icode = CODE_FOR_reload_insi__i_fpul;
11317 return NO_REGS;
11318 }
11319 if (rclass == FPSCR_REGS
11320 && ((REG_P (x) && REGNO (x) >= FIRST_PSEUDO_REGISTER)
11321 || (MEM_P (x) && GET_CODE (XEXP (x, 0)) == PLUS)))
11322 return GENERAL_REGS;
11323 } /* end of input-only processing. */
11324
11325 if (((REGCLASS_HAS_FP_REG (rclass)
11326 && (REG_P (x)
11327 && (GENERAL_OR_AP_REGISTER_P (REGNO (x))
11328 || (FP_REGISTER_P (REGNO (x)) && mode == SImode
11329 && TARGET_FMOVD))))
11330 || (REGCLASS_HAS_GENERAL_REG (rclass)
11331 && REG_P (x)
11332 && FP_REGISTER_P (REGNO (x))))
11333 && (mode == SFmode || mode == SImode))
11334 return FPUL_REGS;
11335 if ((rclass == FPUL_REGS
11336 || (REGCLASS_HAS_FP_REG (rclass) && mode == SImode))
11337 && (MEM_P (x)
11338 || (REG_P (x)
11339 && (REGNO (x) >= FIRST_PSEUDO_REGISTER
11340 || REGNO (x) == T_REG
11341 || system_reg_operand (x, VOIDmode)))))
11342 {
11343 if (rclass == FPUL_REGS)
11344 return GENERAL_REGS;
11345 return NO_REGS; // LRA wants NO_REGS here, it used to be FPUL_REGS;
11346 }
11347
11348 if ((rclass == MAC_REGS || rclass == PR_REGS)
11349 && REG_P (x) && ! GENERAL_REGISTER_P (REGNO (x))
11350 && rclass != REGNO_REG_CLASS (REGNO (x)))
11351 return GENERAL_REGS;
11352
11353 /* If here fall back to loading FPUL register through general registers.
11354 This case can happen when movsi_ie insn is picked initially to
11355 load/store the FPUL register from/to another register, and then the
11356 other register is allocated on the stack. */
11357 if (rclass == FPUL_REGS && true_regnum (x) == -1)
11358 return GENERAL_REGS;
11359
11360 /* Force mov.b / mov.w displacement addressing insn to use R0 as
11361 the other operand.
11362 On SH2A could also just leave it alone here, which would result in a
11363 4 byte move insn being generated instead. However, for this to work
11364 the insns must have the appropriate alternatives. */
11365 if ((mode == QImode || mode == HImode) && rclass != R0_REGS
11366 && satisfies_constraint_Sdd (x)
11367 && sh_disp_addr_displacement (x)
11368 <= sh_max_mov_insn_displacement (mode, false))
11369 return R0_REGS;
11370
11371 /* When reload is trying to address a QImode or HImode subreg on the stack,
11372 force any subreg byte into R0_REGS, as this is going to become a
11373 displacement address.
11374 We could restrict this to SUBREG_BYTE (x) > 0, but if the actual reg
11375 is on the stack, the memref to it might already require a displacement
11376 and that has to be added to the final address. At this point we don't
11377 know the cumulative displacement so we assume the worst case. */
11378 if ((mode == QImode || mode == HImode) && rclass != R0_REGS
11379 && GET_CODE (x) == SUBREG && true_regnum (x) == -1)
11380 return R0_REGS;
11381
11382 return NO_REGS;
11383 }
11384
11385 /* Return true if SUBST can't safely replace its equivalent during RA. */
11386 static bool
11387 sh_cannot_substitute_mem_equiv_p (rtx)
11388 {
11389 /* If SUBST is mem[base+index] or QI/HImode mem[base+disp], the insn
11390 uses R0 and may cause spill failure when R0 is already used.
11391 We have to return true for that case at least.
11392 Moreover SH has strong R0 parity and also have not enough numbers of
11393 the hard registers to make the equiv substitution win in the size
11394 and the speed on average working sets. The pseudos produced to
11395 hold the equiv values can't get good hard registers for bad cases
11396 and end up memory save/restore insns which make the code worse. */
11397 return true;
11398 }
11399
11400 /* Implement TARGET_LEGITIMIZE_ADDRESS_DISPLACEMENT. */
11401 static bool
11402 sh_legitimize_address_displacement (rtx *offset1, rtx *offset2,
11403 poly_int64 orig_offset,
11404 machine_mode mode)
11405 {
11406 if ((TARGET_FPU_DOUBLE && mode == DFmode)
11407 || (TARGET_SH2E && mode == SFmode))
11408 return false;
11409
11410 struct disp_adjust adj = sh_find_mov_disp_adjust (mode, orig_offset);
11411 if (adj.offset_adjust != NULL_RTX && adj.mov_disp != NULL_RTX)
11412 {
11413 *offset1 = adj.offset_adjust;
11414 *offset2 = adj.mov_disp;
11415 return true;
11416 }
11417
11418 return false;
11419 }
11420
11421 /* Return true if movsf insn should be splited with an additional
11422 register. */
11423 bool
11424 sh_movsf_ie_ra_split_p (rtx op0, rtx op1, rtx op2)
11425 {
11426 /* op0 == op1 */
11427 if (rtx_equal_p (op0, op1))
11428 return true;
11429 /* fy, FQ, reg */
11430 if (GET_CODE (op1) == CONST_DOUBLE
11431 && ! satisfies_constraint_G (op1)
11432 && ! satisfies_constraint_H (op1)
11433 && REG_P (op0)
11434 && REG_P (op2))
11435 return true;
11436 /* f, r, y */
11437 if (REG_P (op0) && FP_REGISTER_P (REGNO (op0))
11438 && REG_P (op1) && GENERAL_REGISTER_P (REGNO (op1))
11439 && REG_P (op2) && (REGNO (op2) == FPUL_REG))
11440 return true;
11441 /* r, f, y */
11442 if (REG_P (op1) && FP_REGISTER_P (REGNO (op1))
11443 && REG_P (op0) && GENERAL_REGISTER_P (REGNO (op0))
11444 && REG_P (op2) && (REGNO (op2) == FPUL_REG))
11445 return true;
11446
11447 return false;
11448 }
11449
11450 static void
11451 sh_conditional_register_usage (void)
11452 {
11453 for (int regno = 0; regno < FIRST_PSEUDO_REGISTER; regno ++)
11454 if (! VALID_REGISTER_P (regno))
11455 fixed_regs[regno] = 1;
11456 /* R8 and R9 are call-clobbered on SH5, but not on earlier SH ABIs. */
11457 if (flag_pic)
11458 fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1;
11459 if (TARGET_FDPIC)
11460 {
11461 fixed_regs[PIC_REG] = 1;
11462 call_used_regs[PIC_REG] = 1;
11463 }
11464 /* Renesas saves and restores mac registers on call. */
11465 if (TARGET_HITACHI && ! TARGET_NOMACSAVE)
11466 {
11467 call_used_regs[MACH_REG] = 0;
11468 call_used_regs[MACL_REG] = 0;
11469 }
11470
11471 for (int regno = FIRST_GENERAL_REG; regno <= LAST_GENERAL_REG; regno++)
11472 if (! fixed_regs[regno] && call_used_regs[regno])
11473 SET_HARD_REG_BIT (reg_class_contents[SIBCALL_REGS], regno);
11474
11475 call_used_regs[FPSCR_MODES_REG] = 0;
11476 call_used_regs[FPSCR_STAT_REG] = 0;
11477 }
11478
11479 /* Implement TARGET_LEGITIMATE_CONSTANT_P
11480
11481 can_store_by_pieces constructs VOIDmode CONST_DOUBLEs. */
11482 static bool
11483 sh_legitimate_constant_p (machine_mode mode, rtx x)
11484 {
11485 if (SH_OFFSETS_MUST_BE_WITHIN_SECTIONS_P)
11486 {
11487 rtx base, offset;
11488 split_const (x, &base, &offset);
11489
11490 if (GET_CODE (base) == SYMBOL_REF
11491 && !offset_within_block_p (base, INTVAL (offset)))
11492 return false;
11493 }
11494
11495 if (TARGET_FDPIC
11496 && (SYMBOLIC_CONST_P (x)
11497 || (GET_CODE (x) == CONST && GET_CODE (XEXP (x, 0)) == PLUS
11498 && SYMBOLIC_CONST_P (XEXP (XEXP (x, 0), 0)))))
11499 return false;
11500
11501 return GET_CODE (x) != CONST_DOUBLE
11502 || mode == DFmode || mode == SFmode
11503 || mode == DImode || GET_MODE (x) == VOIDmode;
11504 }
11505
11506 enum sh_divide_strategy_e sh_div_strategy = SH_DIV_STRATEGY_DEFAULT;
11507
11508 static void
11509 sh_init_sync_libfuncs (void)
11510 {
11511 init_sync_libfuncs (UNITS_PER_WORD);
11512 }
11513
11514 /* Return true if it is appropriate to emit `ret' instructions in the
11515 body of a function. */
11516 bool
11517 sh_can_use_simple_return_p (void)
11518 {
11519 if (! reload_completed || frame_pointer_needed)
11520 return false;
11521
11522 /* Moving prologue around does't reduce the size. */
11523 if (optimize_function_for_size_p (cfun))
11524 return false;
11525
11526 /* Finally, allow for pr save. */
11527 HARD_REG_SET live_regs_mask;
11528 int d = calc_live_regs (&live_regs_mask);
11529
11530 if (rounded_frame_size (d) > 4)
11531 return false;
11532
11533 return true;
11534 }
11535
11536 /*------------------------------------------------------------------------------
11537 Address mode optimization support code
11538 */
11539
11540 typedef HOST_WIDE_INT disp_t;
11541 static const disp_t MIN_DISP = HOST_WIDE_INT_MIN;
11542 static const disp_t MAX_DISP = HOST_WIDE_INT_MAX;
11543 static const disp_t INVALID_DISP = MAX_DISP;
11544
11545 /* A memory reference which is described by a base register and a
11546 displacement. */
11547 class base_reg_disp
11548 {
11549 public:
11550 base_reg_disp (rtx br, disp_t d);
11551
11552 bool is_reg (void) const;
11553 bool is_disp (void) const;
11554 rtx reg (void) const;
11555 disp_t disp (void) const;
11556
11557 private:
11558 rtx reg_;
11559 disp_t disp_;
11560 };
11561
11562 inline
11563 base_reg_disp::base_reg_disp (rtx br, disp_t d)
11564 : reg_ (br), disp_ (d)
11565 {
11566 }
11567
11568 inline bool
11569 base_reg_disp::is_reg (void) const
11570 {
11571 return reg_ != NULL_RTX && disp_ != INVALID_DISP;
11572 }
11573
11574 inline bool
11575 base_reg_disp::is_disp (void) const
11576 {
11577 return reg_ == NULL_RTX && disp_ != INVALID_DISP;
11578 }
11579
11580 inline rtx
11581 base_reg_disp::reg (void) const
11582 {
11583 return reg_;
11584 }
11585
11586 inline disp_t
11587 base_reg_disp::disp (void) const
11588 {
11589 return disp_;
11590 }
11591
11592 /* Find the base register and calculate the displacement for a given
11593 address rtx 'x'. */
11594 static base_reg_disp
11595 sh_find_base_reg_disp (rtx_insn* insn, rtx x, disp_t disp = 0,
11596 rtx base_reg = NULL)
11597 {
11598 if (REG_P (x))
11599 {
11600 if (REGNO (x) == GBR_REG)
11601 return base_reg_disp (x, disp);
11602
11603 /* We've reached a hard-reg. This is probably the point where
11604 function args are copied to pseudos. Do not go any further and
11605 stick to the pseudo. If the original mem addr was in a hard reg
11606 from the beginning, it will become the base reg. */
11607 if (REGNO (x) < FIRST_PSEUDO_REGISTER)
11608 return base_reg_disp (base_reg != NULL ? base_reg : x, disp);
11609
11610 /* Find the def of the reg and trace it. If there are more than one
11611 defs and they are not the same, assume it's not safe to proceed. */
11612 rtx_insn* last_i = NULL;
11613 rtx last_set = NULL;
11614 for (df_ref d = DF_REG_DEF_CHAIN (REGNO (x)); d != NULL;
11615 d = DF_REF_NEXT_REG (d))
11616 {
11617 rtx set = const_cast<rtx> (set_of (x, DF_REF_INSN (d)));
11618
11619 /* Accept multiple defs, as long as they are equal. */
11620 if (last_set == NULL || rtx_equal_p (last_set, set))
11621 {
11622 last_i = DF_REF_INSN (d);
11623 last_set = set;
11624 }
11625 else
11626 {
11627 last_i = NULL;
11628 last_set = NULL;
11629 break;
11630 }
11631 }
11632
11633 if (last_set != NULL && last_i != NULL)
11634 return sh_find_base_reg_disp (last_i, XEXP (last_set, 1), disp,
11635 XEXP (last_set, 0));
11636
11637 /* When here, no previous insn was found that sets the reg.
11638 The input reg is already the base reg. */
11639 return base_reg_disp (x, disp);
11640 }
11641
11642 else if (GET_CODE (x) == PLUS)
11643 {
11644 base_reg_disp left_val = sh_find_base_reg_disp (insn, XEXP (x, 0));
11645 base_reg_disp right_val = sh_find_base_reg_disp (insn, XEXP (x, 1));
11646
11647 /* Either left or right val must be a reg.
11648 We don't handle the case of 'reg + reg' here. */
11649 if (left_val.is_reg () && right_val.is_disp ())
11650 return base_reg_disp (left_val.reg (), left_val.disp ()
11651 + right_val.disp () + disp);
11652 else if (right_val.is_reg () && left_val.is_disp ())
11653 return base_reg_disp (right_val.reg (), right_val.disp ()
11654 + left_val.disp () + disp);
11655 else
11656 return base_reg_disp (base_reg, disp);
11657 }
11658
11659 else if (CONST_INT_P (x))
11660 return base_reg_disp (NULL, disp + INTVAL (x));
11661
11662 /* Didn't find anything useful. */
11663 return base_reg_disp (base_reg, disp);
11664 }
11665
11666 /* Given an insn and a memory operand, try to find an equivalent GBR
11667 based memory address and return the corresponding new memory address.
11668 Return NULL_RTX if not found. */
11669 rtx
11670 sh_find_equiv_gbr_addr (rtx_insn* insn, rtx mem)
11671 {
11672 if (!MEM_P (mem) || gbr_address_mem (mem, GET_MODE (mem)))
11673 return NULL_RTX;
11674
11675 /* Leave post/pre inc/dec or any other side effect addresses alone. */
11676 if (side_effects_p (XEXP (mem, 0)))
11677 return NULL_RTX;
11678
11679 /* When not optimizing there might be no dataflow available. */
11680 if (df == NULL)
11681 return NULL_RTX;
11682
11683 base_reg_disp gbr_disp = sh_find_base_reg_disp (insn, XEXP (mem, 0));
11684
11685 if (gbr_disp.is_reg () && REGNO (gbr_disp.reg ()) == GBR_REG)
11686 {
11687 /* If GBR is marked as call clobbered we bail out if we see a call.
11688 FIXME: Actually should check if this mem refers to the gbr value
11689 before or after the call. If there is a store_gbr preceeding this
11690 mem, it's safe to use GBR for this mem.
11691
11692 If GBR is not marked as call clobbered, but there is some other
11693 def than a call, it's probably a load_gbr upon which we also
11694 bail out to be on the safe side.
11695 FIXME: Should check if we have a use-after-def case, such as
11696 the call case above. */
11697 for (df_ref d = DF_REG_DEF_CHAIN (GBR_REG); d != NULL;
11698 d = DF_REF_NEXT_REG (d))
11699 {
11700 if (CALL_P (DF_REF_INSN (d)))
11701 {
11702 if (TEST_HARD_REG_BIT (regs_invalidated_by_call, GBR_REG))
11703 return NULL_RTX;
11704 else
11705 continue;
11706 }
11707 else
11708 return NULL_RTX;
11709 }
11710
11711 rtx disp = GEN_INT (gbr_disp.disp ());
11712 if (gbr_displacement (disp, GET_MODE (mem)))
11713 return gen_rtx_PLUS (SImode, gen_rtx_REG (SImode, GBR_REG), disp);
11714 }
11715
11716 return NULL_RTX;
11717 }
11718
11719 /*------------------------------------------------------------------------------
11720 Manual insn combine support code.
11721 */
11722
11723 /* Return true if the specified insn contains any UNSPECs or
11724 UNSPEC_VOLATILEs. */
11725 static bool
11726 sh_unspec_insn_p (rtx x)
11727 {
11728 subrtx_iterator::array_type array;
11729 FOR_EACH_SUBRTX (i, array, x, ALL)
11730 if (*i != NULL
11731 && (GET_CODE (*i) == UNSPEC || GET_CODE (*i) == UNSPEC_VOLATILE))
11732 return true;
11733
11734 return false;
11735 }
11736
11737 /* Return true if the register operands of the specified insn are modified
11738 between the specified from and to insns (exclusive of those two). */
11739 bool
11740 sh_insn_operands_modified_between_p (rtx_insn* operands_insn,
11741 const rtx_insn* from,
11742 const rtx_insn* to)
11743 {
11744 /* FIXME: Return true for multiple sets for now. */
11745 rtx s = single_set (operands_insn);
11746 if (s == NULL_RTX)
11747 return true;
11748
11749 subrtx_iterator::array_type array;
11750 FOR_EACH_SUBRTX (i, array, SET_SRC (s), ALL)
11751 if (*i != NULL &&
11752 ((REG_P (*i) || SUBREG_P (*i)) && reg_set_between_p (*i, from, to)))
11753 return true;
11754
11755 return false;
11756 }
11757
11758 /* Given an insn, determine whether it's a 'nott' insn, i.e. an insn that
11759 negates the T bit and stores the result in the T bit. */
11760 bool
11761 sh_is_nott_insn (const rtx_insn* i)
11762 {
11763 return i != NULL && GET_CODE (PATTERN (i)) == SET
11764 && t_reg_operand (XEXP (PATTERN (i), 0), VOIDmode)
11765 && negt_reg_operand (XEXP (PATTERN (i), 1), VOIDmode);
11766 }
11767
11768 rtx
11769 sh_movt_set_dest (const rtx_insn* i)
11770 {
11771 return i == NULL ? NULL : sh_movt_set_dest (PATTERN (i));
11772 }
11773
11774 rtx
11775 sh_movt_set_dest (const_rtx pat)
11776 {
11777 return GET_CODE (pat) == SET
11778 && arith_reg_dest (XEXP (pat, 0), SImode)
11779 && t_reg_operand (XEXP (pat, 1), VOIDmode) ? XEXP (pat, 0) : NULL;
11780 }
11781
11782 /* Given an insn, check whether it's a 'movrt' kind of insn, i.e. an insn
11783 that stores the negated T bit in a register, and return the destination
11784 register rtx, or null. */
11785 rtx
11786 sh_movrt_set_dest (const rtx_insn* i)
11787 {
11788 return i == NULL ? NULL : sh_movrt_set_dest (PATTERN (i));
11789 }
11790
11791 rtx
11792 sh_movrt_set_dest (const_rtx pat)
11793 {
11794 /* The negc movrt replacement is inside a parallel. */
11795 if (GET_CODE (pat) == PARALLEL)
11796 pat = XVECEXP (pat, 0, 0);
11797
11798 return GET_CODE (pat) == SET
11799 && arith_reg_dest (XEXP (pat, 0), SImode)
11800 && negt_reg_operand (XEXP (pat, 1), VOIDmode) ? XEXP (pat, 0) : NULL;
11801
11802 }
11803
11804 /* Given an insn and a reg number, tell whether the reg dies or is unused
11805 after the insn. */
11806 bool
11807 sh_reg_dead_or_unused_after_insn (const rtx_insn* i, int regno)
11808 {
11809 return find_regno_note (i, REG_DEAD, regno) != NULL
11810 || find_regno_note (i, REG_UNUSED, regno) != NULL;
11811 }
11812
11813 /* Given an insn and a reg number, remove reg dead or reg unused notes to
11814 mark it as being used after the insn. */
11815 void
11816 sh_remove_reg_dead_or_unused_notes (rtx_insn* i, int regno)
11817 {
11818 if (rtx n = find_regno_note (i, REG_DEAD, regno))
11819 remove_note (i, n);
11820 if (rtx n = find_regno_note (i, REG_UNUSED, regno))
11821 remove_note (i, n);
11822 }
11823
11824 /* Given an insn check if it contains any post/pre inc/dec mem operands and
11825 add the REG_INC notes accordingly.
11826 FIXME: This function is very similar to lra.c (add_auto_inc_notes).
11827 FIXME: This function is currently used by peephole2 patterns because
11828 the peephole2 pass does not preserve REG_INC notes. If the notes
11829 are dropped the following passes will do wrong things. */
11830 rtx_insn*
11831 sh_check_add_incdec_notes (rtx_insn* i)
11832 {
11833 struct for_each_inc_dec_clb
11834 {
11835 static int func (rtx mem ATTRIBUTE_UNUSED, rtx op ATTRIBUTE_UNUSED,
11836 rtx dest, rtx src ATTRIBUTE_UNUSED,
11837 rtx srcoff ATTRIBUTE_UNUSED, void* arg)
11838 {
11839 gcc_assert (REG_P (dest));
11840
11841 rtx_insn* i = (rtx_insn*)arg;
11842 if (find_regno_note (i, REG_INC, REGNO (dest)) == NULL)
11843 add_reg_note (i, REG_INC, dest);
11844
11845 return 0;
11846 }
11847 };
11848
11849 for_each_inc_dec (PATTERN (i), for_each_inc_dec_clb::func, i);
11850 return i;
11851 }
11852
11853 /* Given a move insn destiation and a source, make sure that the move source
11854 operand is not a post-inc mem load with the same address reg as the
11855 destination. Returns the modified source operand with the post-inc removed
11856 if necessary. */
11857 rtx
11858 sh_remove_overlapping_post_inc (rtx dst, rtx src)
11859 {
11860 if (!MEM_P (src))
11861 return src;
11862
11863 rtx addr = XEXP (src, 0);
11864
11865 if (GET_CODE (addr) == POST_INC
11866 && reg_overlap_mentioned_p (XEXP (addr, 0), dst))
11867 return replace_equiv_address (src, XEXP (addr, 0));
11868
11869 gcc_assert (GET_CODE (addr) != POST_MODIFY);
11870 return src;
11871 }
11872
11873 /* Emit a move insn that is safe to be used in peephole patterns. */
11874 rtx_insn*
11875 sh_peephole_emit_move_insn (rtx dst, rtx src)
11876 {
11877 return sh_check_add_incdec_notes (
11878 emit_move_insn (dst, sh_remove_overlapping_post_inc (dst, src)));
11879 }
11880
11881 /* Given an op rtx and an insn, try to find out whether the result of the
11882 specified op consists only of logical operations on T bit stores. */
11883 bool
11884 sh_is_logical_t_store_expr (rtx op, rtx_insn* insn)
11885 {
11886 if (!logical_operator (op, SImode))
11887 return false;
11888
11889 rtx ops[2] = { XEXP (op, 0), XEXP (op, 1) };
11890 int op_is_t_count = 0;
11891
11892 for (int i = 0; i < 2; ++i)
11893 {
11894 if (t_reg_operand (ops[i], VOIDmode)
11895 || negt_reg_operand (ops[i], VOIDmode))
11896 op_is_t_count++;
11897
11898 else
11899 {
11900 set_of_reg op_set = sh_find_set_of_reg
11901 (ops[i], insn, prev_nonnote_nondebug_insn_bb);
11902 if (op_set.set_src == NULL_RTX)
11903 continue;
11904
11905 if (t_reg_operand (op_set.set_src, VOIDmode)
11906 || negt_reg_operand (op_set.set_src, VOIDmode)
11907 || sh_is_logical_t_store_expr (op_set.set_src, op_set.insn))
11908 op_is_t_count++;
11909 }
11910 }
11911
11912 return op_is_t_count == 2;
11913 }
11914
11915 /* Given the operand that is extended in a sign/zero extend insn, and the
11916 insn, try to figure out whether the sign/zero extension can be replaced
11917 by a simple reg-reg copy. If so, the replacement reg rtx is returned,
11918 NULL_RTX otherwise. */
11919 rtx
11920 sh_try_omit_signzero_extend (rtx extended_op, rtx_insn* insn)
11921 {
11922 if (REG_P (extended_op))
11923 extended_op = extended_op;
11924 else if (GET_CODE (extended_op) == SUBREG && REG_P (SUBREG_REG (extended_op)))
11925 extended_op = SUBREG_REG (extended_op);
11926 else
11927 return NULL_RTX;
11928
11929 /* Reg moves must be of the same mode. */
11930 if (GET_MODE (extended_op) != SImode)
11931 return NULL_RTX;
11932
11933 set_of_reg s = sh_find_set_of_reg (extended_op, insn,
11934 prev_nonnote_nondebug_insn_bb);
11935 if (s.set_src == NULL_RTX)
11936 return NULL_RTX;
11937
11938 if (t_reg_operand (s.set_src, VOIDmode)
11939 || negt_reg_operand (s.set_src, VOIDmode))
11940 return extended_op;
11941
11942 /* If the zero extended reg was formed by a logical operation, check the
11943 operands of the logical operation. If both originated from T bit
11944 stores the zero extension can be eliminated. */
11945 else if (sh_is_logical_t_store_expr (s.set_src, s.insn))
11946 return extended_op;
11947
11948 return NULL_RTX;
11949 }
11950
11951 /* Given the current insn, which is assumed to be a movrt_negc insn, try to
11952 figure out whether it should be converted into a movt-xor sequence in
11953 the movrt_negc splitter.
11954 Returns true if insns have been modified and the splitter has succeeded. */
11955 bool
11956 sh_split_movrt_negc_to_movt_xor (rtx_insn* curr_insn, rtx operands[])
11957 {
11958 /* In cases such as
11959 tst r4,r4
11960 mov #-1,r1
11961 negc r1,r1
11962 tst r4,r4
11963 we can replace the T bit clobbering negc with a movt-xor sequence and
11964 eliminate the redundant comparison.
11965 Because the xor insn depends on register allocation results, allow this
11966 only before reload. */
11967 if (!can_create_pseudo_p ())
11968 return false;
11969
11970 set_of_reg t_before_negc = sh_find_set_of_reg
11971 (get_t_reg_rtx (), curr_insn, prev_nonnote_nondebug_insn_bb);
11972 set_of_reg t_after_negc = sh_find_set_of_reg
11973 (get_t_reg_rtx (), curr_insn, next_nonnote_nondebug_insn_bb);
11974
11975 if (t_before_negc.set_rtx != NULL_RTX && t_after_negc.set_rtx != NULL_RTX
11976 && rtx_equal_p (t_before_negc.set_rtx, t_after_negc.set_rtx)
11977 && !reg_used_between_p (get_t_reg_rtx (), curr_insn, t_after_negc.insn)
11978 && !sh_insn_operands_modified_between_p (t_before_negc.insn,
11979 t_before_negc.insn,
11980 t_after_negc.insn)
11981 && !modified_between_p (get_t_reg_rtx (), curr_insn, t_after_negc.insn)
11982 && !sh_unspec_insn_p (t_after_negc.insn)
11983 && !volatile_insn_p (PATTERN (t_after_negc.insn))
11984 && !side_effects_p (PATTERN (t_after_negc.insn))
11985 && !may_trap_or_fault_p (PATTERN (t_after_negc.insn)))
11986 {
11987 emit_insn (gen_movrt_xor (operands[0], get_t_reg_rtx ()));
11988 set_insn_deleted (t_after_negc.insn);
11989 return true;
11990 }
11991 else
11992 return false;
11993 }
11994
11995 /* Given a reg and the current insn, see if the value of the reg originated
11996 from a sign or zero extension and return the discovered information. */
11997 sh_extending_set_of_reg
11998 sh_find_extending_set_of_reg (rtx reg, rtx_insn* curr_insn)
11999 {
12000 if (reg == NULL)
12001 return sh_extending_set_of_reg (curr_insn);
12002
12003 if (SUBREG_P (reg))
12004 reg = SUBREG_REG (reg);
12005
12006 if (!REG_P (reg))
12007 return sh_extending_set_of_reg (curr_insn);
12008
12009 /* FIXME: Also search the predecessor basic blocks. It seems that checking
12010 only the adjacent predecessor blocks would cover most of the cases.
12011 Also try to look through the first extension that we hit. There are some
12012 cases, where a zero_extend is followed an (implicit) sign_extend, and it
12013 fails to see the sign_extend. */
12014 sh_extending_set_of_reg result = sh_find_set_of_reg
12015 (reg, curr_insn, prev_nonnote_nondebug_insn_bb, true);
12016
12017 if (result.set_src != NULL)
12018 {
12019 if (GET_CODE (result.set_src) == SIGN_EXTEND
12020 || GET_CODE (result.set_src) == ZERO_EXTEND)
12021 {
12022 if (dump_file)
12023 fprintf (dump_file, "sh_find_extending_set_of_reg: reg %d is "
12024 "explicitly sign/zero extended in insn %d\n",
12025 REGNO (reg), INSN_UID (result.insn));
12026 result.from_mode = GET_MODE (XEXP (result.set_src, 0));
12027 result.ext_code = GET_CODE (result.set_src);
12028 }
12029 else if (MEM_P (result.set_src)
12030 && (GET_MODE (result.set_src) == QImode
12031 || GET_MODE (result.set_src) == HImode)
12032 && !sh_unspec_insn_p (result.insn))
12033 {
12034 /* On SH QIHImode memory loads always sign extend. However, in
12035 some cases where it seems that the higher bits are not
12036 interesting, the loads will not be expanded as sign extending
12037 insns, but as QIHImode loads into QIHImode regs. We report that
12038 the reg has been sign extended by the mem load. When it is used
12039 as such, we must convert the mem load into a sign extending insn,
12040 see also sh_extending_set_of_reg::use_as_extended_reg. */
12041 if (dump_file)
12042 fprintf (dump_file, "sh_find_extending_set_of_reg: reg %d is "
12043 "implicitly sign extended in insn %d\n",
12044 REGNO (reg), INSN_UID (result.insn));
12045 result.from_mode = GET_MODE (result.set_src);
12046 result.ext_code = SIGN_EXTEND;
12047 }
12048 }
12049
12050 return result;
12051 }
12052
12053 /* Given a reg that is known to be sign or zero extended at some insn,
12054 take the appropriate measures so that the extended value can be used as
12055 a reg at the specified insn and return the resulting reg rtx. */
12056 rtx
12057 sh_extending_set_of_reg::use_as_extended_reg (rtx_insn* use_at_insn) const
12058 {
12059 gcc_assert (insn != NULL && set_src != NULL && set_rtx != NULL);
12060 gcc_assert (ext_code == SIGN_EXTEND || ext_code == ZERO_EXTEND);
12061 gcc_assert (from_mode == QImode || from_mode == HImode);
12062
12063 if (MEM_P (set_src) && ext_code == SIGN_EXTEND)
12064 {
12065 if (dump_file)
12066 fprintf (dump_file,
12067 "use_as_extended_reg: converting non-extending mem load in "
12068 "insn %d into sign-extending load\n", INSN_UID (insn));
12069
12070 rtx r = gen_reg_rtx (SImode);
12071 rtx_insn* i0;
12072 if (from_mode == QImode)
12073 i0 = sh_check_add_incdec_notes (
12074 emit_insn_after (gen_extendqisi2 (r, set_src), insn));
12075 else if (from_mode == HImode)
12076 i0 = sh_check_add_incdec_notes (
12077 emit_insn_after (gen_extendhisi2 (r, set_src), insn));
12078 else
12079 gcc_unreachable ();
12080
12081 emit_insn_after (
12082 gen_move_insn (XEXP (set_rtx, 0),
12083 gen_lowpart (GET_MODE (set_src), r)), i0);
12084 set_insn_deleted (insn);
12085 return r;
12086 }
12087 else
12088 {
12089 rtx extension_dst = XEXP (set_rtx, 0);
12090 if (GET_MODE (extension_dst) != SImode)
12091 extension_dst = simplify_gen_subreg (SImode, extension_dst,
12092 GET_MODE (extension_dst), 0);
12093 if (modified_between_p (extension_dst, insn, use_at_insn))
12094 {
12095 if (dump_file)
12096 fprintf (dump_file,
12097 "use_as_extended_reg: dest reg %d of extending insn %d is "
12098 "modified, inserting a reg-reg copy\n",
12099 REGNO (extension_dst), INSN_UID (insn));
12100
12101 rtx r = gen_reg_rtx (SImode);
12102 emit_insn_after (gen_move_insn (r, extension_dst), insn);
12103 return r;
12104 }
12105 else
12106 {
12107 sh_remove_reg_dead_or_unused_notes (insn, REGNO (extension_dst));
12108 return extension_dst;
12109 }
12110 }
12111 }
12112
12113 bool
12114 sh_extending_set_of_reg::can_use_as_unextended_reg (void) const
12115 {
12116 if ((ext_code == SIGN_EXTEND || ext_code == ZERO_EXTEND)
12117 && (from_mode == QImode || from_mode == HImode)
12118 && set_src != NULL)
12119 return arith_reg_operand (XEXP (set_src, 0), from_mode);
12120 else
12121 return false;
12122 }
12123
12124 rtx
12125 sh_extending_set_of_reg::use_as_unextended_reg (rtx_insn* use_at_insn) const
12126 {
12127 gcc_assert (can_use_as_unextended_reg ());
12128
12129 rtx r = XEXP (set_src, 0);
12130 rtx r0 = simplify_gen_subreg (SImode, r, from_mode, 0);
12131
12132 if (modified_between_p (r, insn, use_at_insn))
12133 {
12134 rtx r1 = gen_reg_rtx (SImode);
12135 emit_insn_after (gen_move_insn (r1, r0), insn);
12136 return r1;
12137 }
12138 else
12139 {
12140 sh_remove_reg_dead_or_unused_notes (insn, SUBREG_P (r)
12141 ? REGNO (SUBREG_REG (r))
12142 : REGNO (r));
12143 return r0;
12144 }
12145 }
12146
12147 /* Given the current insn, which is assumed to be the *tst<mode>_t_subregs insn,
12148 perform the necessary checks on the operands and split it accordingly. */
12149 void
12150 sh_split_tst_subregs (rtx_insn* curr_insn, machine_mode subreg_mode,
12151 int subreg_offset, rtx operands[])
12152 {
12153 gcc_assert (subreg_mode == QImode || subreg_mode == HImode);
12154
12155 sh_extending_set_of_reg eop0 = sh_find_extending_set_of_reg (operands[0],
12156 curr_insn);
12157 sh_extending_set_of_reg eop1 = sh_find_extending_set_of_reg (operands[1],
12158 curr_insn);
12159
12160 /* If one of the operands is known to be zero extended, that's already
12161 sufficient to mask out the unwanted high bits. */
12162 if (eop0.ext_code == ZERO_EXTEND && eop0.from_mode == subreg_mode)
12163 {
12164 emit_insn (gen_tstsi_t (eop0.use_as_extended_reg (curr_insn),
12165 operands[1]));
12166 return;
12167 }
12168 if (eop1.ext_code == ZERO_EXTEND && eop1.from_mode == subreg_mode)
12169 {
12170 emit_insn (gen_tstsi_t (operands[0],
12171 eop1.use_as_extended_reg (curr_insn)));
12172 return;
12173 }
12174
12175 /* None of the operands seem to be zero extended.
12176 If both are sign extended it's OK, too. */
12177 if (eop0.ext_code == SIGN_EXTEND && eop1.ext_code == SIGN_EXTEND
12178 && eop0.from_mode == subreg_mode && eop1.from_mode == subreg_mode)
12179 {
12180 emit_insn (gen_tstsi_t (eop0.use_as_extended_reg (curr_insn),
12181 eop1.use_as_extended_reg (curr_insn)));
12182 return;
12183 }
12184
12185 /* Otherwise we have to insert a zero extension on one of the operands to
12186 mask out the unwanted high bits.
12187 Prefer the operand that has no known extension. */
12188 if (eop0.ext_code != UNKNOWN && eop1.ext_code == UNKNOWN)
12189 std::swap (operands[0], operands[1]);
12190
12191 rtx tmp0 = gen_reg_rtx (SImode);
12192 rtx tmp1 = simplify_gen_subreg (subreg_mode, operands[0],
12193 GET_MODE (operands[0]), subreg_offset);
12194 emit_insn (subreg_mode == QImode
12195 ? gen_zero_extendqisi2 (tmp0, tmp1)
12196 : gen_zero_extendhisi2 (tmp0, tmp1));
12197 emit_insn (gen_tstsi_t (tmp0, operands[1]));
12198 }
12199
12200 /* A helper class to increment/decrement a counter variable each time a
12201 function is entered/left. */
12202 class scope_counter
12203 {
12204 public:
12205 scope_counter (int& counter) : m_counter (counter) { ++m_counter; }
12206
12207 ~scope_counter (void)
12208 {
12209 --m_counter;
12210 gcc_assert (m_counter >= 0);
12211 }
12212
12213 int count (void) const { return m_counter; }
12214
12215 private:
12216 int& m_counter;
12217 };
12218
12219 /* Given an rtx x, determine whether the expression can be used to create
12220 an insn that calulates x and stores the result in the T bit.
12221 This is used by the 'treg_set_expr' predicate to construct insns sequences
12222 where T bit results are fed into other insns, such as addc, subc, negc
12223 insns.
12224
12225 FIXME: The patterns that expand 'treg_set_expr' operands tend to
12226 distinguish between 'positive' and 'negative' forms. For now this has to
12227 be done in the preparation code. We could also introduce
12228 'pos_treg_set_expr' and 'neg_treg_set_expr' predicates for that and write
12229 two different patterns for the 'postive' and 'negative' forms. However,
12230 the total amount of lines of code seems to be about the same and the
12231 '{pos|neg}_treg_set_expr' predicates would be more expensive, because the
12232 recog function would need to look inside the expression by temporarily
12233 splitting it. */
12234 static int sh_recog_treg_set_expr_reent_count = 0;
12235
12236 bool
12237 sh_recog_treg_set_expr (rtx op, machine_mode mode)
12238 {
12239 scope_counter recursion (sh_recog_treg_set_expr_reent_count);
12240
12241 /* Limit the recursion count to avoid nested expressions which we can't
12242 resolve to a single treg set insn. */
12243 if (recursion.count () > 1)
12244 return false;
12245
12246 /* Early accept known possible operands before doing recog. */
12247 if (op == const0_rtx || op == const1_rtx || t_reg_operand (op, mode)
12248 || negt_reg_operand (op, mode))
12249 return true;
12250
12251 /* Early reject impossible operands before doing recog.
12252 There are some (set ((t) (subreg ...))) patterns, but we must be careful
12253 not to allow any invalid reg-reg or mem-reg moves, or else other passes
12254 such as lower-subreg will bail out. Some insns such as SH4A movua are
12255 done with UNSPEC, so must reject those, too, or else it would result
12256 in an invalid reg -> treg move. */
12257 if (CONST_INT_P (op) || register_operand (op, mode)
12258 || memory_operand (op, mode) || sh_unspec_insn_p (op))
12259 return false;
12260
12261 if (!can_create_pseudo_p ())
12262 return false;
12263
12264 /* expand_debug_locations may call this to compute rtx costs at
12265 very early stage. In that case, don't make new insns here to
12266 avoid codegen differences with -g. */
12267 if (currently_expanding_to_rtl)
12268 return false;
12269
12270 /* We are going to invoke recog in a re-entrant way and thus
12271 have to capture its current state and restore it afterwards. */
12272 recog_data_d prev_recog_data = recog_data;
12273
12274 rtx_insn* i = make_insn_raw (gen_rtx_SET (get_t_reg_rtx (), op));
12275 SET_PREV_INSN (i) = NULL;
12276 SET_NEXT_INSN (i) = NULL;
12277
12278 /* If the comparison op doesn't have a result mode, set it to SImode. */
12279 machine_mode prev_op_mode = GET_MODE (op);
12280 if (COMPARISON_P (op) && prev_op_mode == VOIDmode)
12281 PUT_MODE (op, SImode);
12282
12283 int result = recog (PATTERN (i), i, 0);
12284
12285 /* It seems there is no insn like that. Create a negated version and
12286 try again. If we hit a negated form, we'll allow that and append a
12287 nott sequence when splitting out the insns. Insns that do the split
12288 can then remove the trailing nott if they know how to deal with it. */
12289 if (result < 0 && COMPARISON_P (op))
12290 {
12291 machine_mode cmp_mode = GET_MODE (XEXP (op, 0));
12292 if (cmp_mode == VOIDmode)
12293 cmp_mode = GET_MODE (XEXP (op, 1));
12294
12295 rtx_code prev_code = GET_CODE (op);
12296 PUT_CODE (op, reverse_condition (GET_CODE (op)));
12297 result = recog (PATTERN (i), i, 0);
12298 PUT_CODE (op, prev_code);
12299 }
12300
12301 PUT_MODE (op, prev_op_mode);
12302 recog_data = prev_recog_data;
12303 return result >= 0;
12304 }
12305
12306 /* Returns true when recog of a 'treg_set_expr' is currently in progress.
12307 This can be used as a condition for insn/split patterns to allow certain
12308 T bit setting patters only to be matched as sub expressions of other
12309 patterns. */
12310 bool
12311 sh_in_recog_treg_set_expr (void)
12312 {
12313 return sh_recog_treg_set_expr_reent_count > 0;
12314 }
12315
12316 /* Given an rtx x, which is assumed to be some expression that has been
12317 matched by the 'treg_set_expr' predicate before, split and emit the
12318 insns that are necessary to calculate the expression and store the result
12319 in the T bit.
12320 The splitting is done recursively similar to 'try_split' in emit-rt.c.
12321 Unfortunately we can't use 'try_split' here directly, as it tries to invoke
12322 'delete_insn' which then causes the DF parts to bail out, because we
12323 currently are inside another gen_split* function and would invoke
12324 'try_split' in a reentrant way. */
12325 static std::pair<rtx_insn*, rtx_insn*>
12326 sh_try_split_insn_simple (rtx_insn* i, rtx_insn* curr_insn, int n = 0)
12327 {
12328 if (dump_file)
12329 {
12330 fprintf (dump_file, "sh_try_split_insn_simple n = %d i = \n", n);
12331 print_rtl_single (dump_file, i);
12332 fprintf (dump_file, "\n");
12333 }
12334
12335 rtx_insn* seq = split_insns (PATTERN (i), curr_insn);
12336
12337 if (seq == NULL)
12338 return std::make_pair (i, i);
12339
12340 /* Avoid infinite splitter loops if any insn of the result matches
12341 the original pattern. */
12342 for (rtx_insn* s = seq; s != NULL; s = NEXT_INSN (s))
12343 if (INSN_P (s) && rtx_equal_p (PATTERN (s), PATTERN (i)))
12344 return std::make_pair (i, i);
12345
12346 unshare_all_rtl_in_chain (seq);
12347
12348 /* 'seq' is now a replacement for 'i'. Assuming that 'i' is an insn in
12349 a linked list, replace the single insn with the new insns. */
12350 rtx_insn* seqlast = seq;
12351 while (NEXT_INSN (seqlast) != NULL)
12352 seqlast = NEXT_INSN (seqlast);
12353
12354 if (rtx_insn* iprev = PREV_INSN (i))
12355 SET_NEXT_INSN (iprev) = seq;
12356 if (rtx_insn* inext = NEXT_INSN (i))
12357 SET_PREV_INSN (inext) = seqlast;
12358
12359 SET_PREV_INSN (seq) = PREV_INSN (i);
12360 SET_NEXT_INSN (seqlast) = NEXT_INSN (i);
12361
12362 SET_PREV_INSN (i) = NULL;
12363 SET_NEXT_INSN (i) = NULL;
12364
12365 /* Recursively split all insns. */
12366 for (i = seq; ; i = NEXT_INSN (i))
12367 {
12368 std::pair<rtx_insn*, rtx_insn*> ii =
12369 sh_try_split_insn_simple (i, curr_insn, n + 1);
12370 if (i == seq)
12371 seq = ii.first;
12372 if (i == seqlast)
12373 {
12374 seqlast = ii.second;
12375 break;
12376 }
12377 i = ii.first;
12378 }
12379
12380 return std::make_pair (seq, seqlast);
12381 }
12382
12383 sh_treg_insns
12384 sh_split_treg_set_expr (rtx x, rtx_insn* curr_insn)
12385 {
12386 if (t_reg_operand (x, VOIDmode))
12387 return sh_treg_insns ();
12388
12389 scope_counter in_treg_set_expr (sh_recog_treg_set_expr_reent_count);
12390
12391 rtx_insn* i = make_insn_raw (gen_rtx_SET (get_t_reg_rtx (), x));
12392 SET_PREV_INSN (i) = NULL;
12393 SET_NEXT_INSN (i) = NULL;
12394
12395 if (dump_file)
12396 {
12397 fprintf (dump_file, "split_treg_set_expr insn:\n");
12398 print_rtl (dump_file, i);
12399 fprintf (dump_file, "\n");
12400 }
12401
12402 /* If the insn is not found, we will try a negated form and append
12403 a nott. */
12404 bool append_nott = false;
12405
12406 /* We are going to invoke recog/split_insns in a re-entrant way and thus
12407 have to capture its current state and restore it afterwards. */
12408 recog_data_d prev_recog_data = recog_data;
12409
12410 if (negt_reg_operand (x, GET_MODE (x)))
12411 {
12412 /* This is a normal movt followed by a nott. It will be converted
12413 into a movrt after initial expansion. */
12414 XEXP (PATTERN (i), 1) = get_t_reg_rtx ();
12415 append_nott = true;
12416 }
12417 else
12418 {
12419 /* If the comparison op doesn't have a mode set, set it to SImode. */
12420 if (COMPARISON_P (x) && GET_MODE (x) == VOIDmode)
12421 PUT_MODE (x, SImode);
12422
12423 int insn_code = recog (PATTERN (i), i, 0);
12424
12425 if (insn_code < 0 && COMPARISON_P (x))
12426 {
12427 machine_mode cmp_mode = GET_MODE (XEXP (x, 0));
12428 if (cmp_mode == VOIDmode)
12429 cmp_mode = GET_MODE (XEXP (x, 1));
12430
12431 PUT_CODE (x, reverse_condition (GET_CODE (x)));
12432 insn_code = recog (PATTERN (i), i, 0);
12433 append_nott = true;
12434 }
12435
12436 gcc_assert (insn_code >= 0);
12437 }
12438
12439 /* Try to recursively split the insn. Some insns might refuse to split
12440 any further while we are in the treg_set_expr splitting phase. They
12441 will be emitted as part of the outer insn and then split again. */
12442 std::pair<rtx_insn*, rtx_insn*> insnlist =
12443 sh_try_split_insn_simple (i, curr_insn);
12444
12445 /* Restore recog state. */
12446 recog_data = prev_recog_data;
12447
12448 rtx_insn* nott_insn = sh_is_nott_insn (insnlist.second)
12449 ? insnlist.second
12450 : NULL;
12451 if (dump_file)
12452 {
12453 fprintf (dump_file, "split_treg_set_expr insnlist:\n");
12454 print_rtl (dump_file, insnlist.first);
12455 fprintf (dump_file, "\n");
12456
12457 if (nott_insn != NULL)
12458 fprintf (dump_file, "trailing nott insn %d\n", INSN_UID (nott_insn));
12459 }
12460
12461 emit_insn (insnlist.first);
12462
12463 if (nott_insn != NULL && append_nott)
12464 {
12465 if (dump_file)
12466 fprintf (dump_file, "removing trailing nott\n");
12467 remove_insn (nott_insn);
12468 nott_insn = NULL;
12469 append_nott = false;
12470 }
12471
12472 if (append_nott)
12473 nott_insn = emit_insn (gen_nott (get_t_reg_rtx ()));
12474
12475 rtx_insn* first_insn = get_insns ();
12476
12477 if (dump_file)
12478 {
12479 fprintf (dump_file, "resulting insns:\n");
12480 print_rtl (dump_file, first_insn);
12481 fprintf (dump_file, "\n");
12482 }
12483
12484 return sh_treg_insns (first_insn, nott_insn);
12485 }
12486
12487 /*------------------------------------------------------------------------------
12488 Mode switching support code.
12489 */
12490
12491 static void
12492 sh_emit_mode_set (int entity ATTRIBUTE_UNUSED, int mode,
12493 int prev_mode, HARD_REG_SET regs_live ATTRIBUTE_UNUSED)
12494 {
12495 if ((TARGET_SH4A_FP || TARGET_FPU_SH4_300)
12496 && prev_mode != FP_MODE_NONE && prev_mode != mode)
12497 {
12498 emit_insn (gen_toggle_pr ());
12499 if (TARGET_FMOVD)
12500 emit_insn (gen_toggle_sz ());
12501 }
12502 else if (mode != FP_MODE_NONE)
12503 {
12504 rtx tmp = gen_reg_rtx (SImode);
12505 emit_insn (gen_sts_fpscr (tmp));
12506 rtx i = NULL;
12507
12508 const unsigned HOST_WIDE_INT fpbits =
12509 TARGET_FMOVD ? (FPSCR_PR | FPSCR_SZ) : FPSCR_PR;
12510
12511 if (prev_mode != FP_MODE_NONE && prev_mode != mode)
12512 i = gen_xorsi3 (tmp, tmp, force_reg (SImode, GEN_INT (fpbits)));
12513 else if (mode == FP_MODE_SINGLE)
12514 i = gen_andsi3 (tmp, tmp, force_reg (SImode, GEN_INT (~fpbits)));
12515 else if (mode == FP_MODE_DOUBLE)
12516 i = gen_iorsi3 (tmp, tmp, force_reg (SImode, GEN_INT (fpbits)));
12517 else
12518 gcc_unreachable ();
12519
12520 emit_insn (i);
12521 emit_insn (gen_lds_fpscr (tmp));
12522 }
12523 }
12524
12525 static int
12526 sh_mode_needed (int entity ATTRIBUTE_UNUSED, rtx_insn *insn)
12527 {
12528 return recog_memoized (insn) >= 0 ? get_attr_fp_mode (insn) : FP_MODE_NONE;
12529 }
12530
12531 static int
12532 sh_mode_after (int entity ATTRIBUTE_UNUSED, int mode, rtx_insn *insn)
12533 {
12534 if (TARGET_HITACHI && recog_memoized (insn) >= 0 &&
12535 get_attr_fp_set (insn) != FP_SET_NONE)
12536 return (int) get_attr_fp_set (insn);
12537 else
12538 return mode;
12539 }
12540
12541 static int
12542 sh_mode_entry (int entity ATTRIBUTE_UNUSED)
12543 {
12544 return NORMAL_MODE (entity);
12545 }
12546
12547 static int
12548 sh_mode_exit (int entity ATTRIBUTE_UNUSED)
12549 {
12550 return sh_cfun_attr_renesas_p () ? FP_MODE_NONE : NORMAL_MODE (entity);
12551 }
12552
12553 static int
12554 sh_mode_priority (int entity ATTRIBUTE_UNUSED, int n)
12555 {
12556 return ((TARGET_FPU_SINGLE != 0) ^ (n) ? FP_MODE_SINGLE : FP_MODE_DOUBLE);
12557 }
12558
12559 /*------------------------------------------------------------------------------
12560 Misc
12561 */
12562
12563 /* Return true if we use LRA instead of reload pass. */
12564 bool
12565 sh_lra_p (void)
12566 {
12567 return sh_lra_flag;
12568 }
12569
12570 /* Implement TARGET_USE_BY_PIECES_INFRASTRUCTURE_P. */
12571
12572 static bool
12573 sh_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
12574 unsigned int align,
12575 enum by_pieces_operation op,
12576 bool speed_p)
12577 {
12578 switch (op)
12579 {
12580 case MOVE_BY_PIECES:
12581 return by_pieces_ninsns (size, align, MOVE_MAX_PIECES + 1, op)
12582 < (!speed_p ? 2 : (align >= 32) ? 16 : 2);
12583 case STORE_BY_PIECES:
12584 case SET_BY_PIECES:
12585 return by_pieces_ninsns (size, align, STORE_MAX_PIECES + 1, op)
12586 < (!speed_p ? 2 : (align >= 32) ? 16 : 2);
12587 default:
12588 return default_use_by_pieces_infrastructure_p (size, align,
12589 op, speed_p);
12590 }
12591 }
12592
12593 bool
12594 sh_cannot_force_const_mem_p (machine_mode mode ATTRIBUTE_UNUSED,
12595 rtx x ATTRIBUTE_UNUSED)
12596 {
12597 return TARGET_FDPIC;
12598 }
12599
12600 /* Emit insns to load the function address from FUNCDESC (an FDPIC
12601 function descriptor) into r1 and the GOT address into r12,
12602 returning an rtx for r1. */
12603
12604 rtx
12605 sh_load_function_descriptor (rtx funcdesc)
12606 {
12607 rtx r1 = gen_rtx_REG (Pmode, R1_REG);
12608 rtx pic_reg = gen_rtx_REG (Pmode, PIC_REG);
12609 rtx fnaddr = gen_rtx_MEM (Pmode, funcdesc);
12610 rtx gotaddr = gen_rtx_MEM (Pmode, plus_constant (Pmode, funcdesc, 4));
12611
12612 emit_move_insn (r1, fnaddr);
12613 /* The ABI requires the entry point address to be loaded first, so
12614 prevent the load from being moved after that of the GOT
12615 address. */
12616 emit_insn (gen_blockage ());
12617 emit_move_insn (pic_reg, gotaddr);
12618 return r1;
12619 }
12620
12621 /* Return an rtx holding the initial value of the FDPIC register (the
12622 FDPIC pointer passed in from the caller). */
12623
12624 rtx
12625 sh_get_fdpic_reg_initial_val (void)
12626 {
12627 return get_hard_reg_initial_val (Pmode, PIC_REG);
12628 }
12629
12630 #include "gt-sh.h"