/* Prototypes for Renesas RL78 processors
   Copyright (C) 2011-2021 Free Software Foundation, Inc.
   Contributed by Red Hat.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   GCC is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with GCC; see the file COPYING3.  If not see
   <http://www.gnu.org/licenses/>.  */

const char *    rl78_addsi3_internal (rtx *, unsigned int);
void		rl78_emit_eh_epilogue (rtx);
void		rl78_expand_compare (rtx *);
void		rl78_expand_movsi (rtx *);
void		rl78_split_movsi (rtx *, machine_mode);
void 		rl78_split_movdi (rtx *, enum machine_mode);
int		rl78_force_nonfar_2 (rtx *, rtx (*gen)(rtx,rtx));
int		rl78_force_nonfar_3 (rtx *, rtx (*gen)(rtx,rtx,rtx));
void		rl78_expand_eh_epilogue (rtx);
void		rl78_expand_epilogue (void);
void		rl78_expand_prologue (void);
int		rl78_far_p (rtx x);
bool		rl78_hl_b_c_addr_p (rtx);
int		rl78_initial_elimination_offset (int, int);
bool		rl78_as_legitimate_address (machine_mode, rtx,
					    bool, addr_space_t);
int		rl78_legitimize_reload_address (rtx *, machine_mode, int,int, int);
enum reg_class	rl78_mode_code_base_reg_class (machine_mode, addr_space_t, int, int);
bool		rl78_peep_movhi_p (rtx *);
bool		rl78_real_insns_ok (void);
void		rl78_register_pragmas (void);
bool		rl78_regno_mode_code_ok_for_base_p (int, machine_mode, addr_space_t, int, int);
void		rl78_setup_peep_movhi (rtx *);
bool		rl78_virt_insns_ok (void);

bool		rl78_es_addr (rtx);
rtx		rl78_es_base (rtx);

bool		rl78_flags_already_set (rtx, rtx);
void		rl78_output_symbol_ref (FILE *, rtx);
void		rl78_output_labelref (FILE *, const char *);
int		rl78_saddr_p (rtx x);
int		rl78_sfr_p (rtx x);
void		rl78_output_aligned_common (FILE *, tree, const char *,
					    int, int, int);

int		rl78_one_far_p (rtx *operands, int num_operands);

#ifdef RTX_CODE
#ifdef HAVE_MACHINE_MODES

rtx rl78_emit_libcall (const char*, enum rtx_code,
                       enum machine_mode, enum machine_mode,
                       int, rtx*);

#endif
#endif
