Home | History | Annotate | Line # | Download | only in sh
sh-protos.h revision 1.1.1.2
      1      1.1  mrg /* Definitions of target machine for GNU compiler for Renesas / SuperH SH.
      2  1.1.1.2  mrg    Copyright (C) 1993-2013 Free Software Foundation, Inc.
      3      1.1  mrg    Contributed by Steve Chamberlain (sac (at) cygnus.com).
      4      1.1  mrg    Improved by Jim Wilson (wilson (at) cygnus.com).
      5      1.1  mrg 
      6      1.1  mrg This file is part of GCC.
      7      1.1  mrg 
      8      1.1  mrg GCC is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     11      1.1  mrg any later version.
     12      1.1  mrg 
     13      1.1  mrg GCC is distributed in the hope that it will be useful,
     14      1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     15      1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16      1.1  mrg GNU General Public License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU General Public License
     19      1.1  mrg along with GCC; see the file COPYING3.  If not see
     20      1.1  mrg <http://www.gnu.org/licenses/>.  */
     21      1.1  mrg 
     22      1.1  mrg #ifndef GCC_SH_PROTOS_H
     23      1.1  mrg #define GCC_SH_PROTOS_H
     24      1.1  mrg 
     25      1.1  mrg enum sh_function_kind {
     26      1.1  mrg   /* A function with normal C ABI  */
     27      1.1  mrg   FUNCTION_ORDINARY,
     28      1.1  mrg   /* A special function that guarantees that some otherwise call-clobbered
     29      1.1  mrg      registers are not clobbered.  These can't go through the SH5 resolver,
     30      1.1  mrg      because it only saves argument passing registers.  */
     31      1.1  mrg   SFUNC_GOT,
     32      1.1  mrg   /* A special function that should be linked statically.  These are typically
     33      1.1  mrg      smaller or not much larger than a PLT entry.
     34      1.1  mrg      Some also have a non-standard ABI which precludes dynamic linking.  */
     35      1.1  mrg   SFUNC_STATIC
     36      1.1  mrg };
     37      1.1  mrg 
     38  1.1.1.2  mrg /* Atomic model.  */
     39  1.1.1.2  mrg struct sh_atomic_model
     40  1.1.1.2  mrg {
     41  1.1.1.2  mrg   enum enum_type
     42  1.1.1.2  mrg   {
     43  1.1.1.2  mrg     none = 0,
     44  1.1.1.2  mrg     soft_gusa,
     45  1.1.1.2  mrg     hard_llcs,
     46  1.1.1.2  mrg     soft_tcb,
     47  1.1.1.2  mrg     soft_imask,
     48  1.1.1.2  mrg 
     49  1.1.1.2  mrg     num_models
     50  1.1.1.2  mrg   };
     51  1.1.1.2  mrg 
     52  1.1.1.2  mrg   /*  If strict is set, disallow mixing of different models, as it would
     53  1.1.1.2  mrg       happen on SH4A.  */
     54  1.1.1.2  mrg   bool strict;
     55  1.1.1.2  mrg   enum_type type;
     56  1.1.1.2  mrg 
     57  1.1.1.2  mrg   /* Name string as it was specified on the command line.  */
     58  1.1.1.2  mrg   const char* name;
     59  1.1.1.2  mrg 
     60  1.1.1.2  mrg   /* Name string as it is used in C/C++ defines.  */
     61  1.1.1.2  mrg   const char* cdef_name;
     62  1.1.1.2  mrg 
     63  1.1.1.2  mrg   /* GBR offset variable for TCB model.  */
     64  1.1.1.2  mrg   int tcb_gbr_offset;
     65  1.1.1.2  mrg };
     66  1.1.1.2  mrg 
     67  1.1.1.2  mrg extern const sh_atomic_model& selected_atomic_model (void);
     68  1.1.1.2  mrg 
     69  1.1.1.2  mrg /* Shortcuts to check the currently selected atomic model.  */
     70  1.1.1.2  mrg #define TARGET_ATOMIC_ANY \
     71  1.1.1.2  mrg   selected_atomic_model ().type != sh_atomic_model::none
     72  1.1.1.2  mrg 
     73  1.1.1.2  mrg #define TARGET_ATOMIC_STRICT \
     74  1.1.1.2  mrg   selected_atomic_model ().strict
     75  1.1.1.2  mrg 
     76  1.1.1.2  mrg #define TARGET_ATOMIC_SOFT_GUSA \
     77  1.1.1.2  mrg   selected_atomic_model ().type == sh_atomic_model::soft_gusa
     78  1.1.1.2  mrg 
     79  1.1.1.2  mrg #define TARGET_ATOMIC_HARD_LLCS \
     80  1.1.1.2  mrg   selected_atomic_model ().type == sh_atomic_model::hard_llcs
     81  1.1.1.2  mrg 
     82  1.1.1.2  mrg #define TARGET_ATOMIC_SOFT_TCB \
     83  1.1.1.2  mrg   selected_atomic_model ().type == sh_atomic_model::soft_tcb
     84  1.1.1.2  mrg 
     85  1.1.1.2  mrg #define TARGET_ATOMIC_SOFT_TCB_GBR_OFFSET_RTX \
     86  1.1.1.2  mrg   GEN_INT (selected_atomic_model ().tcb_gbr_offset)
     87  1.1.1.2  mrg 
     88  1.1.1.2  mrg #define TARGET_ATOMIC_SOFT_IMASK \
     89  1.1.1.2  mrg   selected_atomic_model ().type == sh_atomic_model::soft_imask
     90  1.1.1.2  mrg 
     91      1.1  mrg #ifdef RTX_CODE
     92      1.1  mrg extern rtx sh_fsca_sf2int (void);
     93      1.1  mrg extern rtx sh_fsca_int2sf (void);
     94      1.1  mrg 
     95      1.1  mrg /* Declare functions defined in sh.c and used in templates.  */
     96      1.1  mrg 
     97      1.1  mrg extern const char *output_branch (int, rtx, rtx *);
     98      1.1  mrg extern const char *output_ieee_ccmpeq (rtx, rtx *);
     99      1.1  mrg extern const char *output_branchy_insn (enum rtx_code, const char *, rtx, rtx *);
    100      1.1  mrg extern const char *output_movedouble (rtx, rtx[], enum machine_mode);
    101      1.1  mrg extern const char *output_movepcrel (rtx, rtx[], enum machine_mode);
    102      1.1  mrg extern const char *output_far_jump (rtx, rtx);
    103      1.1  mrg 
    104  1.1.1.2  mrg extern rtx sfunc_uses_reg (rtx);
    105      1.1  mrg extern int barrier_align (rtx);
    106      1.1  mrg extern int sh_loop_align (rtx);
    107  1.1.1.2  mrg extern bool fp_zero_operand (rtx);
    108  1.1.1.2  mrg extern bool fp_one_operand (rtx);
    109      1.1  mrg extern rtx get_fpscr_rtx (void);
    110  1.1.1.2  mrg extern bool sh_legitimate_index_p (enum machine_mode, rtx, bool, bool);
    111  1.1.1.2  mrg extern bool sh_legitimize_reload_address (rtx *, enum machine_mode, int, int);
    112      1.1  mrg extern rtx legitimize_pic_address (rtx, enum machine_mode, rtx);
    113  1.1.1.2  mrg extern bool nonpic_symbol_mentioned_p (rtx);
    114      1.1  mrg extern void emit_sf_insn (rtx);
    115      1.1  mrg extern void emit_df_insn (rtx);
    116      1.1  mrg extern void output_pic_addr_const (FILE *, rtx);
    117  1.1.1.2  mrg extern bool expand_block_move (rtx *);
    118  1.1.1.2  mrg extern void prepare_move_operands (rtx[], enum machine_mode mode);
    119      1.1  mrg extern enum rtx_code prepare_cbranch_operands (rtx *, enum machine_mode mode,
    120      1.1  mrg 					       enum rtx_code comparison);
    121      1.1  mrg extern void expand_cbranchsi4 (rtx *operands, enum rtx_code comparison, int);
    122      1.1  mrg extern bool expand_cbranchdi4 (rtx *operands, enum rtx_code comparison);
    123      1.1  mrg extern void sh_emit_scc_to_t (enum rtx_code, rtx, rtx);
    124      1.1  mrg extern rtx sh_emit_cheap_store_flag (enum machine_mode, enum rtx_code, rtx, rtx);
    125      1.1  mrg extern void sh_emit_compare_and_branch (rtx *, enum machine_mode);
    126      1.1  mrg extern void sh_emit_compare_and_set (rtx *, enum machine_mode);
    127  1.1.1.2  mrg extern bool sh_ashlsi_clobbers_t_reg_p (rtx);
    128  1.1.1.2  mrg extern bool sh_lshrsi_clobbers_t_reg_p (rtx);
    129      1.1  mrg extern void gen_shifty_op (int, rtx *);
    130      1.1  mrg extern void gen_shifty_hi_op (int, rtx *);
    131  1.1.1.2  mrg extern bool expand_ashiftrt (rtx *);
    132  1.1.1.2  mrg extern bool sh_dynamicalize_shift_p (rtx);
    133      1.1  mrg extern int shl_and_kind (rtx, rtx, int *);
    134      1.1  mrg extern int shl_and_length (rtx);
    135      1.1  mrg extern int shl_and_scr_length (rtx);
    136  1.1.1.2  mrg extern bool gen_shl_and (rtx, rtx, rtx, rtx);
    137      1.1  mrg extern int shl_sext_kind (rtx, rtx, int *);
    138      1.1  mrg extern int shl_sext_length (rtx);
    139  1.1.1.2  mrg extern bool gen_shl_sext (rtx, rtx, rtx, rtx);
    140      1.1  mrg extern rtx gen_datalabel_ref (rtx);
    141      1.1  mrg extern int regs_used (rtx, int);
    142      1.1  mrg extern void fixup_addr_diff_vecs (rtx);
    143      1.1  mrg extern int get_dest_uid (rtx, int);
    144      1.1  mrg extern void final_prescan_insn (rtx, rtx *, int);
    145      1.1  mrg extern enum tls_model tls_symbolic_operand (rtx, enum machine_mode);
    146  1.1.1.2  mrg extern bool system_reg_operand (rtx, enum machine_mode);
    147  1.1.1.2  mrg extern bool reg_unused_after (rtx, rtx);
    148      1.1  mrg extern void expand_sf_unop (rtx (*)(rtx, rtx, rtx), rtx *);
    149      1.1  mrg extern void expand_sf_binop (rtx (*)(rtx, rtx, rtx, rtx), rtx *);
    150      1.1  mrg extern void expand_df_unop (rtx (*)(rtx, rtx, rtx), rtx *);
    151      1.1  mrg extern void expand_df_binop (rtx (*)(rtx, rtx, rtx, rtx), rtx *);
    152      1.1  mrg extern int sh_insn_length_adjustment (rtx);
    153  1.1.1.2  mrg extern bool sh_can_redirect_branch (rtx, rtx);
    154      1.1  mrg extern void sh_expand_unop_v2sf (enum rtx_code, rtx, rtx);
    155      1.1  mrg extern void sh_expand_binop_v2sf (enum rtx_code, rtx, rtx, rtx);
    156  1.1.1.2  mrg extern bool sh_expand_t_scc (rtx *);
    157      1.1  mrg extern rtx sh_gen_truncate (enum machine_mode, rtx, int);
    158      1.1  mrg extern bool sh_vector_mode_supported_p (enum machine_mode);
    159  1.1.1.2  mrg extern bool sh_cfun_trap_exit_p (void);
    160  1.1.1.2  mrg extern rtx sh_find_equiv_gbr_addr (rtx cur_insn, rtx mem);
    161  1.1.1.2  mrg extern int sh_eval_treg_value (rtx op);
    162  1.1.1.2  mrg extern HOST_WIDE_INT sh_disp_addr_displacement (rtx mem_op);
    163  1.1.1.2  mrg extern int sh_max_mov_insn_displacement (machine_mode mode, bool consider_sh2a);
    164  1.1.1.2  mrg 
    165  1.1.1.2  mrg /* Result value of sh_find_set_of_reg.  */
    166  1.1.1.2  mrg struct set_of_reg
    167  1.1.1.2  mrg {
    168  1.1.1.2  mrg   /* The insn where sh_find_set_of_reg stopped looking.
    169  1.1.1.2  mrg      Can be NULL_RTX if the end of the insn list was reached.  */
    170  1.1.1.2  mrg   rtx insn;
    171  1.1.1.2  mrg 
    172  1.1.1.2  mrg   /* The set rtx of the specified reg if found, NULL_RTX otherwise.  */
    173  1.1.1.2  mrg   const_rtx set_rtx;
    174  1.1.1.2  mrg 
    175  1.1.1.2  mrg   /* The set source rtx of the specified reg if found, NULL_RTX otherwise.
    176  1.1.1.2  mrg      Usually, this is the most interesting return value.  */
    177  1.1.1.2  mrg   rtx set_src;
    178  1.1.1.2  mrg };
    179  1.1.1.2  mrg 
    180  1.1.1.2  mrg extern set_of_reg sh_find_set_of_reg (rtx reg, rtx insn, rtx(*stepfunc)(rtx));
    181  1.1.1.2  mrg extern bool sh_is_logical_t_store_expr (rtx op, rtx insn);
    182  1.1.1.2  mrg extern rtx sh_try_omit_signzero_extend (rtx extended_op, rtx insn);
    183      1.1  mrg #endif /* RTX_CODE */
    184      1.1  mrg 
    185  1.1.1.2  mrg extern void sh_cpu_cpp_builtins (cpp_reader* pfile);
    186  1.1.1.2  mrg 
    187      1.1  mrg extern const char *output_jump_label_table (void);
    188  1.1.1.2  mrg extern rtx get_t_reg_rtx (void);
    189  1.1.1.2  mrg extern rtx get_fpscr_rtx (void);
    190      1.1  mrg extern int sh_media_register_for_return (void);
    191      1.1  mrg extern void sh_expand_prologue (void);
    192      1.1  mrg extern void sh_expand_epilogue (bool);
    193      1.1  mrg extern void sh_set_return_address (rtx, rtx);
    194      1.1  mrg extern int initial_elimination_offset (int, int);
    195  1.1.1.2  mrg extern bool fldi_ok (void);
    196  1.1.1.2  mrg extern bool sh_hard_regno_rename_ok (unsigned int, unsigned int);
    197  1.1.1.2  mrg extern bool sh_cfun_interrupt_handler_p (void);
    198  1.1.1.2  mrg extern bool sh_cfun_resbank_handler_p (void);
    199  1.1.1.2  mrg extern bool sh_attr_renesas_p (const_tree);
    200  1.1.1.2  mrg extern bool sh_cfun_attr_renesas_p (void);
    201      1.1  mrg extern bool sh_cannot_change_mode_class
    202      1.1  mrg 	      (enum machine_mode, enum machine_mode, enum reg_class);
    203  1.1.1.2  mrg extern bool sh_small_register_classes_for_mode_p (enum machine_mode);
    204      1.1  mrg extern void sh_mark_label (rtx, int);
    205  1.1.1.2  mrg extern bool check_use_sfunc_addr (rtx, rtx);
    206      1.1  mrg 
    207      1.1  mrg #ifdef HARD_CONST
    208      1.1  mrg extern void fpscr_set_from_mem (int, HARD_REG_SET);
    209      1.1  mrg #endif
    210      1.1  mrg 
    211      1.1  mrg extern void sh_pr_interrupt (struct cpp_reader *);
    212      1.1  mrg extern void sh_pr_trapa (struct cpp_reader *);
    213      1.1  mrg extern void sh_pr_nosave_low_regs (struct cpp_reader *);
    214      1.1  mrg extern rtx function_symbol (rtx, const char *, enum sh_function_kind);
    215      1.1  mrg extern rtx sh_get_pr_initial_val (void);
    216      1.1  mrg 
    217  1.1.1.2  mrg extern void sh_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree,
    218  1.1.1.2  mrg 				     signed int, enum machine_mode);
    219      1.1  mrg extern rtx sh_dwarf_register_span (rtx);
    220      1.1  mrg 
    221      1.1  mrg extern rtx replace_n_hard_rtx (rtx, rtx *, int , int);
    222      1.1  mrg extern int shmedia_cleanup_truncate (rtx *, void *);
    223      1.1  mrg 
    224  1.1.1.2  mrg extern bool sh_contains_memref_p (rtx);
    225  1.1.1.2  mrg extern bool sh_loads_bankedreg_p (rtx);
    226      1.1  mrg extern rtx shmedia_prepare_call_address (rtx fnaddr, int is_sibcall);
    227      1.1  mrg extern int sh2a_get_function_vector_number (rtx);
    228  1.1.1.2  mrg extern bool sh2a_is_function_vector_call (rtx);
    229      1.1  mrg extern void sh_fix_range (const char *);
    230      1.1  mrg extern bool sh_hard_regno_mode_ok (unsigned int, enum machine_mode);
    231  1.1.1.2  mrg extern bool sh_can_use_simple_return_p (void);
    232      1.1  mrg #endif /* ! GCC_SH_PROTOS_H */
    233