OSDN Git Service

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