/* score-mdaux.h for Sunplus S+CORE processor Copyright (C) 2005 Free Software Foundation, Inc. Contributed by Sunnorth 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 2, 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 COPYING. If not, write to the Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef SCORE_MDAUX_0621 #define SCORE_MDAUX_0621 /* Machine Auxiliary Functions. */ enum score_address_type { ADD_REG, ADD_CONST_INT, ADD_SYMBOLIC }; #ifdef RTX_CODE struct score_address_info { enum score_address_type type; rtx reg; rtx offset; enum rtx_code code; enum score_symbol_type symbol_type; }; #endif struct score_frame_info { HOST_WIDE_INT total_size; /* bytes that the entire frame takes up */ HOST_WIDE_INT var_size; /* bytes that variables take up */ HOST_WIDE_INT args_size; /* bytes that outgoing arguments take up */ HOST_WIDE_INT gp_reg_size; /* bytes needed to store gp regs */ HOST_WIDE_INT gp_sp_offset; /* offset from new sp to store gp registers */ HOST_WIDE_INT cprestore_size; /* # bytes that the .cprestore slot takes up */ unsigned int mask; /* mask of saved gp registers */ int num_gp; /* number of gp registers saved */ }; typedef void (*score_save_restore_fn) (rtx, rtx); int mda_valid_base_register_p (rtx x, int strict); #ifdef RTX_CODE int mda_classify_address (struct score_address_info *info, enum machine_mode mode, rtx x, int strict); struct score_frame_info *mda_compute_frame_size (HOST_WIDE_INT size); struct score_frame_info *mda_cached_frame (void); void mda_gen_cmp (enum machine_mode mode); #endif int mda_symbolic_constant_p (rtx x, enum score_symbol_type *symbol_type); int mda_bp (void); /* Machine Expand. */ void mdx_prologue (void); void mdx_epilogue (int sibcall_p); void mdx_movsicc (rtx *ops); void mdx_call (rtx *ops, bool sibcall); void mdx_call_value (rtx *ops, bool sibcall); /* Machine Split. */ void mds_movdi (rtx *ops); void mds_zero_extract_andi (rtx *ops); /* Machine Print. */ enum mda_mem_unit {MDA_BYTE = 0, MDA_HWORD = 1, MDA_WORD = 2}; #define MDA_ALIGN_UNIT(V, UNIT) !(V & ((1 << UNIT) - 1)) const char * mdp_linsn (rtx *ops, enum mda_mem_unit unit, bool sign); const char * mdp_sinsn (rtx *ops, enum mda_mem_unit unit); const char * mdp_select_add_imm (rtx *ops, bool set_cc); const char * mdp_select (rtx *ops, const char *inst_pre, bool commu, const char *letter, bool set_cc); const char * mdp_limm (rtx *ops); const char * mdp_move (rtx *ops); /* Machine unaligned memory load/store. */ bool mdx_unaligned_load (rtx* ops); bool mdx_unaligned_store (rtx* ops); bool mdx_block_move (rtx* ops); #endif