OSDN Git Service

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