163d1a8abSmrg /* Definitions of target machine for GNU compiler for Renesas / SuperH SH.
2*ec02198aSmrg    Copyright (C) 1993-2020 Free Software Foundation, Inc.
363d1a8abSmrg    Contributed by Steve Chamberlain (sac@cygnus.com).
463d1a8abSmrg    Improved by Jim Wilson (wilson@cygnus.com).
563d1a8abSmrg 
663d1a8abSmrg This file is part of GCC.
763d1a8abSmrg 
863d1a8abSmrg GCC is free software; you can redistribute it and/or modify
963d1a8abSmrg it under the terms of the GNU General Public License as published by
1063d1a8abSmrg the Free Software Foundation; either version 3, or (at your option)
1163d1a8abSmrg any later version.
1263d1a8abSmrg 
1363d1a8abSmrg GCC is distributed in the hope that it will be useful,
1463d1a8abSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
1563d1a8abSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1663d1a8abSmrg GNU General Public License for more details.
1763d1a8abSmrg 
1863d1a8abSmrg You should have received a copy of the GNU General Public License
1963d1a8abSmrg along with GCC; see the file COPYING3.  If not see
2063d1a8abSmrg <http://www.gnu.org/licenses/>.  */
2163d1a8abSmrg 
2263d1a8abSmrg #ifndef GCC_SH_PROTOS_H
2363d1a8abSmrg #define GCC_SH_PROTOS_H
2463d1a8abSmrg 
2563d1a8abSmrg enum sh_function_kind {
2663d1a8abSmrg   /* A function with normal C ABI  */
2763d1a8abSmrg   FUNCTION_ORDINARY,
2863d1a8abSmrg   /* A special function that guarantees that some otherwise call-clobbered
2963d1a8abSmrg      registers are not clobbered.  These can't go through the SH5 resolver,
3063d1a8abSmrg      because it only saves argument passing registers.  */
3163d1a8abSmrg   SFUNC_GOT,
3263d1a8abSmrg   /* A special function that should be linked statically.  These are typically
3363d1a8abSmrg      smaller or not much larger than a PLT entry.
3463d1a8abSmrg      Some also have a non-standard ABI which precludes dynamic linking.  */
3563d1a8abSmrg   SFUNC_STATIC
3663d1a8abSmrg };
3763d1a8abSmrg 
3863d1a8abSmrg #ifdef RTX_CODE
3963d1a8abSmrg extern rtx sh_fsca_sf2int (void);
4063d1a8abSmrg extern rtx sh_fsca_int2sf (void);
4163d1a8abSmrg 
4263d1a8abSmrg /* Declare functions defined in sh.c and used in templates.  */
4363d1a8abSmrg extern bool sh_lra_p (void);
4463d1a8abSmrg 
4563d1a8abSmrg extern const char *output_branch (int, rtx_insn *, rtx *);
4663d1a8abSmrg extern const char *output_ieee_ccmpeq (rtx_insn *, rtx *);
4763d1a8abSmrg extern const char *output_branchy_insn (enum rtx_code, const char *,
4863d1a8abSmrg 					rtx_insn *, rtx *);
4963d1a8abSmrg extern const char *output_movedouble (rtx, rtx[], machine_mode);
5063d1a8abSmrg extern const char *output_movepcrel (rtx, rtx[], machine_mode);
5163d1a8abSmrg extern const char *output_far_jump (rtx_insn *, rtx);
5263d1a8abSmrg 
5363d1a8abSmrg extern rtx sfunc_uses_reg (rtx_insn *);
5463d1a8abSmrg extern int barrier_align (rtx_insn *);
5563d1a8abSmrg extern int sh_loop_align (rtx_insn *);
5663d1a8abSmrg extern bool fp_zero_operand (rtx);
5763d1a8abSmrg extern bool fp_one_operand (rtx);
5863d1a8abSmrg extern bool sh_legitimate_index_p (machine_mode, rtx, bool, bool);
5963d1a8abSmrg extern bool sh_legitimize_reload_address (rtx *, machine_mode, int, int);
6063d1a8abSmrg extern rtx legitimize_pic_address (rtx, machine_mode, rtx);
6163d1a8abSmrg extern bool nonpic_symbol_mentioned_p (rtx);
6263d1a8abSmrg extern void output_pic_addr_const (FILE *, rtx);
6363d1a8abSmrg extern bool expand_block_move (rtx *);
6463d1a8abSmrg extern void prepare_move_operands (rtx[], machine_mode mode);
6563d1a8abSmrg extern bool sh_expand_cmpstr (rtx *);
6663d1a8abSmrg extern bool sh_expand_cmpnstr (rtx *);
6763d1a8abSmrg extern bool sh_expand_strlen  (rtx *);
6863d1a8abSmrg extern void sh_expand_setmem (rtx *);
6963d1a8abSmrg extern enum rtx_code prepare_cbranch_operands (rtx *, machine_mode mode,
7063d1a8abSmrg 					       enum rtx_code comparison);
71c7a68eb7Smrg extern void expand_cbranchsi4 (rtx *operands, enum rtx_code comparison);
7263d1a8abSmrg extern bool expand_cbranchdi4 (rtx *operands, enum rtx_code comparison);
7363d1a8abSmrg extern void sh_emit_scc_to_t (enum rtx_code, rtx, rtx);
7463d1a8abSmrg extern void sh_emit_compare_and_branch (rtx *, machine_mode);
7563d1a8abSmrg extern void sh_emit_compare_and_set (rtx *, machine_mode);
7663d1a8abSmrg extern bool sh_ashlsi_clobbers_t_reg_p (rtx);
7763d1a8abSmrg extern bool sh_lshrsi_clobbers_t_reg_p (rtx);
7863d1a8abSmrg extern void gen_shifty_op (int, rtx *);
7963d1a8abSmrg extern void gen_shifty_hi_op (int, rtx *);
8063d1a8abSmrg extern bool expand_ashiftrt (rtx *);
8163d1a8abSmrg extern bool sh_dynamicalize_shift_p (rtx);
8263d1a8abSmrg extern int shl_and_kind (rtx, rtx, int *);
8363d1a8abSmrg extern int shl_and_length (rtx);
8463d1a8abSmrg extern int shl_and_scr_length (rtx);
8563d1a8abSmrg extern bool gen_shl_and (rtx, rtx, rtx, rtx);
8663d1a8abSmrg extern int shl_sext_kind (rtx, rtx, int *);
8763d1a8abSmrg extern int shl_sext_length (rtx);
8863d1a8abSmrg extern bool gen_shl_sext (rtx, rtx, rtx, rtx);
8963d1a8abSmrg extern int regs_used (rtx, int);
9063d1a8abSmrg extern void fixup_addr_diff_vecs (rtx_insn *);
910fc04c29Smrg extern int get_dest_uid (rtx_insn *, int);
9263d1a8abSmrg extern void final_prescan_insn (rtx_insn *, rtx *, int);
9363d1a8abSmrg extern enum tls_model tls_symbolic_operand (rtx, machine_mode);
9463d1a8abSmrg extern bool system_reg_operand (rtx, machine_mode);
9563d1a8abSmrg extern bool reg_unused_after (rtx, rtx_insn *);
9663d1a8abSmrg extern int sh_insn_length_adjustment (rtx_insn *);
9763d1a8abSmrg extern bool sh_expand_t_scc (rtx *);
9863d1a8abSmrg extern rtx sh_gen_truncate (machine_mode, rtx, int);
9963d1a8abSmrg extern bool sh_vector_mode_supported_p (machine_mode);
10063d1a8abSmrg extern bool sh_cfun_trap_exit_p (void);
10163d1a8abSmrg extern rtx sh_find_equiv_gbr_addr (rtx_insn* cur_insn, rtx mem);
10263d1a8abSmrg extern int sh_eval_treg_value (rtx op);
10363d1a8abSmrg extern HOST_WIDE_INT sh_disp_addr_displacement (rtx mem_op);
10463d1a8abSmrg extern int sh_max_mov_insn_displacement (machine_mode mode, bool consider_sh2a);
10563d1a8abSmrg extern bool sh_movsf_ie_ra_split_p (rtx, rtx, rtx);
10663d1a8abSmrg extern void sh_expand_sym_label2reg (rtx, rtx, rtx, bool);
10763d1a8abSmrg 
10863d1a8abSmrg /* Result value of sh_find_set_of_reg.  */
10963d1a8abSmrg struct set_of_reg
11063d1a8abSmrg {
11163d1a8abSmrg   /* The insn where sh_find_set_of_reg stopped looking.
11263d1a8abSmrg      Can be NULL_RTX if the end of the insn list was reached.  */
11363d1a8abSmrg   rtx_insn* insn;
11463d1a8abSmrg 
11563d1a8abSmrg   /* The set rtx of the specified reg if found, NULL_RTX otherwise.  */
11663d1a8abSmrg   const_rtx set_rtx;
11763d1a8abSmrg 
11863d1a8abSmrg   /* The set source rtx of the specified reg if found, NULL_RTX otherwise.
11963d1a8abSmrg      Usually, this is the most interesting return value.  */
12063d1a8abSmrg   rtx set_src;
12163d1a8abSmrg };
12263d1a8abSmrg 
123c7a68eb7Smrg /* Given a reg rtx and a start insn, try to find the insn that sets
124c7a68eb7Smrg    the specified reg by using the specified insn stepping function,
125c7a68eb7Smrg    such as 'prev_nonnote_nondebug_insn_bb'.  When the insn is found,
126c7a68eb7Smrg    try to extract the rtx of the reg set.  */
12763d1a8abSmrg template <typename F> inline set_of_reg
12863d1a8abSmrg sh_find_set_of_reg (rtx reg, rtx_insn* insn, F stepfunc,
12963d1a8abSmrg 		    bool ignore_reg_reg_copies = false)
13063d1a8abSmrg {
13163d1a8abSmrg   set_of_reg result;
13263d1a8abSmrg   result.insn = insn;
13363d1a8abSmrg   result.set_rtx = NULL_RTX;
13463d1a8abSmrg   result.set_src = NULL_RTX;
13563d1a8abSmrg 
13663d1a8abSmrg   if (!REG_P (reg) || insn == NULL_RTX)
13763d1a8abSmrg     return result;
13863d1a8abSmrg 
13963d1a8abSmrg   for (rtx_insn* i = stepfunc (insn); i != NULL_RTX; i = stepfunc (i))
14063d1a8abSmrg     {
14163d1a8abSmrg       if (BARRIER_P (i))
14263d1a8abSmrg 	break;
14363d1a8abSmrg       if (!INSN_P (i) || DEBUG_INSN_P (i))
14463d1a8abSmrg 	  continue;
14563d1a8abSmrg       if (reg_set_p (reg, i))
14663d1a8abSmrg 	{
14763d1a8abSmrg 	  if (CALL_P (i))
14863d1a8abSmrg 	    break;
14963d1a8abSmrg 
15063d1a8abSmrg 	  result.insn = i;
15163d1a8abSmrg 	  result.set_rtx = set_of (reg, i);
15263d1a8abSmrg 
15363d1a8abSmrg 	  if (result.set_rtx == NULL_RTX || GET_CODE (result.set_rtx) != SET)
15463d1a8abSmrg 	    break;
15563d1a8abSmrg 
15663d1a8abSmrg 	  result.set_src = XEXP (result.set_rtx, 1);
15763d1a8abSmrg 
15863d1a8abSmrg 	  if (ignore_reg_reg_copies && REG_P (result.set_src))
15963d1a8abSmrg 	    {
16063d1a8abSmrg 	      reg = result.set_src;
16163d1a8abSmrg 	      continue;
16263d1a8abSmrg 	    }
16363d1a8abSmrg 	  if (ignore_reg_reg_copies && SUBREG_P (result.set_src)
16463d1a8abSmrg 	      && REG_P (SUBREG_REG (result.set_src)))
16563d1a8abSmrg 	    {
16663d1a8abSmrg 	      reg = SUBREG_REG (result.set_src);
16763d1a8abSmrg 	      continue;
16863d1a8abSmrg 	    }
16963d1a8abSmrg 
17063d1a8abSmrg 	  break;
17163d1a8abSmrg 	}
17263d1a8abSmrg     }
17363d1a8abSmrg 
17463d1a8abSmrg   /* If the searched reg is found inside a (mem (post_inc:SI (reg))), set_of
17563d1a8abSmrg      will return NULL and set_rtx will be NULL.
17663d1a8abSmrg      In this case report a 'not found'.  result.insn will always be non-null
17763d1a8abSmrg      at this point, so no need to check it.  */
17863d1a8abSmrg   if (result.set_src != NULL && result.set_rtx == NULL)
17963d1a8abSmrg     result.set_src = NULL;
18063d1a8abSmrg 
18163d1a8abSmrg   return result;
18263d1a8abSmrg }
18363d1a8abSmrg 
18463d1a8abSmrg /* Result value of sh_find_extending_set_of_reg.  */
18563d1a8abSmrg struct sh_extending_set_of_reg : public set_of_reg
18663d1a8abSmrg {
18763d1a8abSmrg   /* The mode the set is extending from (QImode or HImode), or VOIDmode if
18863d1a8abSmrg      this is not a zero/sign extending set.  */
18963d1a8abSmrg   machine_mode from_mode;
19063d1a8abSmrg 
19163d1a8abSmrg   /* ZERO_EXTEND, SIGN_EXTEND or UNKNOWN.  */
19263d1a8abSmrg   rtx_code ext_code;
19363d1a8abSmrg 
sh_extending_set_of_regsh_extending_set_of_reg19463d1a8abSmrg   sh_extending_set_of_reg (rtx_insn* i)
19563d1a8abSmrg   {
19663d1a8abSmrg     insn = i;
19763d1a8abSmrg     set_rtx = NULL;
19863d1a8abSmrg     set_src = NULL;
19963d1a8abSmrg     from_mode = VOIDmode;
20063d1a8abSmrg     ext_code = UNKNOWN;
20163d1a8abSmrg   }
20263d1a8abSmrg 
sh_extending_set_of_regsh_extending_set_of_reg20363d1a8abSmrg   sh_extending_set_of_reg (const set_of_reg& rhs)
20463d1a8abSmrg   {
20563d1a8abSmrg     *((set_of_reg*)this) = rhs;
20663d1a8abSmrg     from_mode = VOIDmode;
20763d1a8abSmrg     ext_code = UNKNOWN;
20863d1a8abSmrg   }
20963d1a8abSmrg 
21063d1a8abSmrg   /* Returns true if it's possible to use the source reg of the sign
21163d1a8abSmrg      or zero extending set directly, bypassing the extension.  */
21263d1a8abSmrg   bool can_use_as_unextended_reg (void) const;
21363d1a8abSmrg 
21463d1a8abSmrg   /* Returns the reg rtx of the sign or zero extending set source, that can
21563d1a8abSmrg      be safely used at the specified insn in SImode.  */
21663d1a8abSmrg   rtx use_as_unextended_reg (rtx_insn* use_at_insn) const;
21763d1a8abSmrg 
21863d1a8abSmrg   /* Returns the reg rtx of the sign or zero extending result, that can be
21963d1a8abSmrg      safely used at the specified insn in SImode.  If the set source is an
22063d1a8abSmrg      implicitly sign extending mem load, the mem load is converted into an
22163d1a8abSmrg      explicitly sign extending mem load.  */
22263d1a8abSmrg   rtx use_as_extended_reg (rtx_insn* use_at_insn) const;
22363d1a8abSmrg };
22463d1a8abSmrg 
22563d1a8abSmrg extern sh_extending_set_of_reg sh_find_extending_set_of_reg (rtx reg,
22663d1a8abSmrg 							     rtx_insn* insn);
22763d1a8abSmrg 
22863d1a8abSmrg extern bool sh_is_logical_t_store_expr (rtx op, rtx_insn* insn);
22963d1a8abSmrg extern rtx sh_try_omit_signzero_extend (rtx extended_op, rtx_insn* insn);
23063d1a8abSmrg extern bool sh_split_movrt_negc_to_movt_xor (rtx_insn* curr_insn,
23163d1a8abSmrg 					     rtx operands[]);
23263d1a8abSmrg extern void sh_split_tst_subregs (rtx_insn* curr_insn,
23363d1a8abSmrg 				  machine_mode subreg_mode, int subreg_offset,
23463d1a8abSmrg 				  rtx operands[]);
23563d1a8abSmrg 
23663d1a8abSmrg extern bool sh_is_nott_insn (const rtx_insn* i);
23763d1a8abSmrg extern rtx sh_movt_set_dest (const rtx_insn* i);
23863d1a8abSmrg extern rtx sh_movt_set_dest (const_rtx i);
23963d1a8abSmrg extern rtx sh_movrt_set_dest (const rtx_insn* i);
24063d1a8abSmrg extern rtx sh_movrt_set_dest (const_rtx i);
24163d1a8abSmrg 
sh_is_movt_insn(const rtx_insn * i)24263d1a8abSmrg inline bool sh_is_movt_insn (const rtx_insn* i)
24363d1a8abSmrg {
24463d1a8abSmrg   return sh_movt_set_dest (i) != NULL;
24563d1a8abSmrg }
24663d1a8abSmrg 
sh_is_movrt_insn(const rtx_insn * i)24763d1a8abSmrg inline bool sh_is_movrt_insn (const rtx_insn* i)
24863d1a8abSmrg {
24963d1a8abSmrg   return sh_movrt_set_dest (i) != NULL;
25063d1a8abSmrg }
25163d1a8abSmrg 
25263d1a8abSmrg extern bool sh_insn_operands_modified_between_p (rtx_insn* operands_insn,
25363d1a8abSmrg 						 const rtx_insn* from,
25463d1a8abSmrg 						 const rtx_insn* to);
25563d1a8abSmrg 
25663d1a8abSmrg extern bool sh_reg_dead_or_unused_after_insn (const rtx_insn* i, int regno);
25763d1a8abSmrg extern void sh_remove_reg_dead_or_unused_notes (rtx_insn* i, int regno);
25863d1a8abSmrg extern rtx_insn* sh_check_add_incdec_notes (rtx_insn* i);
25963d1a8abSmrg extern rtx sh_remove_overlapping_post_inc (rtx dst, rtx src);
26063d1a8abSmrg extern rtx_insn* sh_peephole_emit_move_insn (rtx dst, rtx src);
26163d1a8abSmrg 
26263d1a8abSmrg extern bool sh_in_recog_treg_set_expr (void);
26363d1a8abSmrg extern bool sh_recog_treg_set_expr (rtx op, machine_mode mode);
26463d1a8abSmrg 
26563d1a8abSmrg /* Result value of sh_split_treg_set_expr.  Contains the first insn emitted
26663d1a8abSmrg    and the optional trailing nott insn.  */
26763d1a8abSmrg class sh_treg_insns
26863d1a8abSmrg {
26963d1a8abSmrg public:
sh_treg_insns(void)27063d1a8abSmrg   sh_treg_insns (void) : m_first_insn (NULL), m_trailing_nott_insn (NULL) { }
sh_treg_insns(rtx_insn * first_insn,rtx_insn * nott_insn)27163d1a8abSmrg   sh_treg_insns (rtx_insn* first_insn, rtx_insn* nott_insn)
27263d1a8abSmrg   : m_first_insn (first_insn),
27363d1a8abSmrg     m_trailing_nott_insn (nott_insn)
27463d1a8abSmrg   { }
27563d1a8abSmrg 
was_treg_operand(void)27663d1a8abSmrg   bool was_treg_operand (void) const { return m_first_insn == NULL; }
has_trailing_nott(void)27763d1a8abSmrg   bool has_trailing_nott (void) const { return m_trailing_nott_insn != NULL; }
trailing_nott(void)27863d1a8abSmrg   rtx_insn* trailing_nott (void) const { return m_trailing_nott_insn; }
first_insn(void)27963d1a8abSmrg   rtx_insn* first_insn (void) const { return m_first_insn; }
28063d1a8abSmrg 
28163d1a8abSmrg   /* If there is a trailing nott, remove it from the emitted insns and
28263d1a8abSmrg      return true.  Return false otherwise.  */
28363d1a8abSmrg   bool
remove_trailing_nott(void)28463d1a8abSmrg   remove_trailing_nott (void)
28563d1a8abSmrg   {
28663d1a8abSmrg     if (!has_trailing_nott ())
28763d1a8abSmrg       return false;
28863d1a8abSmrg 
28963d1a8abSmrg     remove_insn (trailing_nott ());
29063d1a8abSmrg     return true;
29163d1a8abSmrg   }
29263d1a8abSmrg 
29363d1a8abSmrg private:
29463d1a8abSmrg   rtx_insn* m_first_insn;
29563d1a8abSmrg   rtx_insn* m_trailing_nott_insn;
29663d1a8abSmrg };
29763d1a8abSmrg 
29863d1a8abSmrg extern sh_treg_insns sh_split_treg_set_expr (rtx x, rtx_insn* curr_insn);
29963d1a8abSmrg 
30063d1a8abSmrg enum
30163d1a8abSmrg {
30263d1a8abSmrg   /* An effective conditional branch distance of zero bytes is impossible.
30363d1a8abSmrg      Hence we can use it to designate an unknown value.  */
30463d1a8abSmrg   unknown_cbranch_distance = 0u,
30563d1a8abSmrg   infinite_cbranch_distance = ~0u
30663d1a8abSmrg };
30763d1a8abSmrg 
30863d1a8abSmrg unsigned int
30963d1a8abSmrg sh_cbranch_distance (rtx_insn* cbranch_insn,
31063d1a8abSmrg 		     unsigned int max_dist = infinite_cbranch_distance);
31163d1a8abSmrg 
31263d1a8abSmrg #endif /* RTX_CODE */
31363d1a8abSmrg 
31463d1a8abSmrg extern void sh_cpu_cpp_builtins (cpp_reader* pfile);
31563d1a8abSmrg 
31663d1a8abSmrg extern const char *output_jump_label_table (void);
31763d1a8abSmrg extern rtx get_t_reg_rtx (void);
31863d1a8abSmrg extern void sh_expand_prologue (void);
31963d1a8abSmrg extern void sh_expand_epilogue (bool);
32063d1a8abSmrg extern void sh_set_return_address (rtx, rtx);
32163d1a8abSmrg extern int initial_elimination_offset (int, int);
32263d1a8abSmrg extern bool sh_hard_regno_rename_ok (unsigned int, unsigned int);
32363d1a8abSmrg extern bool sh_cfun_interrupt_handler_p (void);
32463d1a8abSmrg extern bool sh_cfun_resbank_handler_p (void);
32563d1a8abSmrg extern bool sh_attr_renesas_p (const_tree);
32663d1a8abSmrg extern bool sh_cfun_attr_renesas_p (void);
32763d1a8abSmrg extern bool sh_small_register_classes_for_mode_p (machine_mode);
32863d1a8abSmrg extern void sh_mark_label (rtx, int);
32963d1a8abSmrg extern bool check_use_sfunc_addr (rtx_insn *, rtx);
33063d1a8abSmrg 
33163d1a8abSmrg #ifdef HARD_CONST
33263d1a8abSmrg extern void fpscr_set_from_mem (int, HARD_REG_SET);
33363d1a8abSmrg #endif
33463d1a8abSmrg 
33563d1a8abSmrg extern void sh_pr_interrupt (struct cpp_reader *);
33663d1a8abSmrg extern void sh_pr_trapa (struct cpp_reader *);
33763d1a8abSmrg extern void sh_pr_nosave_low_regs (struct cpp_reader *);
33863d1a8abSmrg 
33963d1a8abSmrg struct function_symbol_result
34063d1a8abSmrg {
function_symbol_resultfunction_symbol_result34163d1a8abSmrg   function_symbol_result (void) : sym (NULL), lab (NULL) { }
function_symbol_resultfunction_symbol_result34263d1a8abSmrg   function_symbol_result (rtx s, rtx l) : sym (s), lab (l) { }
34363d1a8abSmrg 
34463d1a8abSmrg   rtx sym;
34563d1a8abSmrg   rtx lab;
34663d1a8abSmrg };
34763d1a8abSmrg 
34863d1a8abSmrg extern function_symbol_result function_symbol (rtx, const char *,
34963d1a8abSmrg 					       sh_function_kind);
35063d1a8abSmrg extern rtx sh_get_fdpic_reg_initial_val (void);
35163d1a8abSmrg extern rtx sh_get_pr_initial_val (void);
35263d1a8abSmrg 
35363d1a8abSmrg extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree,
35463d1a8abSmrg 				     signed int, machine_mode);
35563d1a8abSmrg extern rtx sh_dwarf_register_span (rtx);
35663d1a8abSmrg 
35763d1a8abSmrg extern bool sh_contains_memref_p (rtx);
35863d1a8abSmrg extern bool sh_loads_bankedreg_p (rtx);
35963d1a8abSmrg extern int sh2a_get_function_vector_number (rtx);
36063d1a8abSmrg extern bool sh2a_is_function_vector_call (rtx);
36163d1a8abSmrg extern void sh_fix_range (const char *);
36263d1a8abSmrg extern machine_mode sh_hard_regno_caller_save_mode (unsigned int, unsigned int,
36363d1a8abSmrg 						    machine_mode);
36463d1a8abSmrg extern bool sh_can_use_simple_return_p (void);
36563d1a8abSmrg extern rtx sh_load_function_descriptor (rtx);
36663d1a8abSmrg #endif /* ! GCC_SH_PROTOS_H */
367