1 1.1 mrg /* Definitions of target machine for GNU compiler. 2 1.1 mrg Renesas H8/300 version 3 1.12 mrg Copyright (C) 2000-2022 Free Software Foundation, Inc. 4 1.1 mrg Contributed by Steve Chamberlain (sac (at) cygnus.com), 5 1.1 mrg Jim Wilson (wilson (at) cygnus.com), and Doug Evans (dje (at) cygnus.com). 6 1.1 mrg 7 1.1 mrg This file is part of GCC. 8 1.1 mrg 9 1.1 mrg GCC is free software; you can redistribute it and/or modify 10 1.1 mrg it under the terms of the GNU General Public License as published by 11 1.1 mrg the Free Software Foundation; either version 3, or (at your option) 12 1.1 mrg any later version. 13 1.1 mrg 14 1.1 mrg GCC is distributed in the hope that it will be useful, 15 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 16 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 1.1 mrg GNU General Public License for more details. 18 1.1 mrg 19 1.1 mrg You should have received a copy of the GNU General Public License 20 1.1 mrg along with GCC; see the file COPYING3. If not see 21 1.1 mrg <http://www.gnu.org/licenses/>. */ 22 1.1 mrg 23 1.1 mrg #ifndef GCC_H8300_PROTOS_H 24 1.1 mrg #define GCC_H8300_PROTOS_H 25 1.1 mrg 26 1.12 mrg /* Declarations for functions used in insn-output.cc. */ 27 1.1 mrg #ifdef RTX_CODE 28 1.1 mrg extern unsigned int compute_mov_length (rtx *); 29 1.12 mrg extern const char *output_plussi (rtx *, bool); 30 1.12 mrg extern unsigned int compute_plussi_length (rtx *, bool); 31 1.12 mrg extern const char *output_a_shift (rtx[4], rtx_code); 32 1.12 mrg extern unsigned int compute_a_shift_length (rtx[4], rtx_code); 33 1.1 mrg extern const char *output_a_rotate (enum rtx_code, rtx *); 34 1.1 mrg extern unsigned int compute_a_rotate_length (rtx *); 35 1.1 mrg extern const char *output_simode_bld (int, rtx[]); 36 1.5 mrg extern void final_prescan_insn (rtx_insn *, rtx *, int); 37 1.1 mrg extern int h8300_expand_movsi (rtx[]); 38 1.12 mrg extern machine_mode h8300_select_cc_mode (RTX_CODE, rtx, rtx); 39 1.12 mrg extern const char *output_logical_op (machine_mode, rtx_code code, 40 1.12 mrg rtx *, rtx_insn *); 41 1.12 mrg extern unsigned int compute_logical_op_length (machine_mode, rtx_code, 42 1.12 mrg rtx *, rtx_insn *); 43 1.12 mrg 44 1.12 mrg extern int compute_a_shift_cc (rtx *, rtx_code); 45 1.3 mrg #ifdef HAVE_ATTR_cc 46 1.3 mrg extern enum attr_cc compute_plussi_cc (rtx *); 47 1.3 mrg #endif 48 1.1 mrg extern void h8300_expand_store (rtx[]); 49 1.5 mrg extern bool expand_a_shift (machine_mode, enum rtx_code, rtx[]); 50 1.12 mrg extern int h8300_shift_needs_scratch_p (int, machine_mode, rtx_code); 51 1.1 mrg extern int expand_a_rotate (rtx[]); 52 1.1 mrg extern int fix_bit_operand (rtx *, enum rtx_code); 53 1.1 mrg extern int h8300_adjust_insn_length (rtx, int); 54 1.5 mrg extern void split_adds_subs (machine_mode, rtx[]); 55 1.1 mrg 56 1.1 mrg extern int h8300_eightbit_constant_address_p (rtx); 57 1.1 mrg extern int h8300_tiny_constant_address_p (rtx); 58 1.1 mrg extern int byte_accesses_mergeable_p (rtx, rtx); 59 1.8 mrg extern int same_cmp_preceding_p (rtx_insn *); 60 1.8 mrg extern int same_cmp_following_p (rtx_insn *); 61 1.1 mrg 62 1.12 mrg /* Used in builtins.cc */ 63 1.1 mrg extern rtx h8300_return_addr_rtx (int, rtx); 64 1.1 mrg 65 1.1 mrg /* Classifies an h8sx shift operation. 66 1.1 mrg 67 1.1 mrg H8SX_SHIFT_NONE 68 1.1 mrg The shift cannot be done in a single instruction. 69 1.1 mrg 70 1.1 mrg H8SX_SHIFT_UNARY 71 1.1 mrg The shift is effectively a unary operation. The instruction will 72 1.1 mrg allow any sort of destination operand and have a format similar 73 1.1 mrg to neg and not. This is true of certain power-of-2 shifts. 74 1.1 mrg 75 1.1 mrg H8SX_SHIFT_BINARY 76 1.1 mrg The shift is a binary operation. The destination must be a 77 1.1 mrg register and the source can be a register or a constant. */ 78 1.1 mrg enum h8sx_shift_type { 79 1.1 mrg H8SX_SHIFT_NONE, 80 1.1 mrg H8SX_SHIFT_UNARY, 81 1.1 mrg H8SX_SHIFT_BINARY 82 1.1 mrg }; 83 1.1 mrg 84 1.5 mrg extern enum h8sx_shift_type h8sx_classify_shift (machine_mode, enum rtx_code, rtx); 85 1.1 mrg extern int h8300_ldm_stm_parallel (rtvec, int, int); 86 1.1 mrg #endif /* RTX_CODE */ 87 1.1 mrg 88 1.1 mrg #ifdef TREE_CODE 89 1.1 mrg extern int h8300_funcvec_function_p (tree); 90 1.1 mrg extern int h8300_eightbit_data_p (tree); 91 1.1 mrg extern int h8300_tiny_data_p (tree); 92 1.1 mrg #endif /* TREE_CODE */ 93 1.1 mrg 94 1.1 mrg extern int h8300_can_use_return_insn_p (void); 95 1.1 mrg extern void h8300_expand_prologue (void); 96 1.12 mrg extern void h8300_expand_epilogue (bool); 97 1.1 mrg extern int h8300_current_function_interrupt_function_p (void); 98 1.3 mrg extern int h8300_current_function_monitor_function_p (void); 99 1.1 mrg extern int h8300_initial_elimination_offset (int, int); 100 1.1 mrg extern int h8300_regs_ok_for_stm (int, rtx[]); 101 1.1 mrg extern int h8300_hard_regno_rename_ok (unsigned int, unsigned int); 102 1.3 mrg extern bool h8300_move_ok (rtx, rtx); 103 1.1 mrg 104 1.1 mrg struct cpp_reader; 105 1.1 mrg extern void h8300_pr_interrupt (struct cpp_reader *); 106 1.1 mrg extern void h8300_pr_saveall (struct cpp_reader *); 107 1.1 mrg extern enum reg_class h8300_reg_class_from_letter (int); 108 1.5 mrg extern unsigned int h8300_insn_length_from_table (rtx_insn *, rtx *); 109 1.1 mrg extern const char * output_h8sx_shift (rtx *, int, int); 110 1.1 mrg extern bool h8300_operands_match_p (rtx *); 111 1.1 mrg extern bool h8sx_mergeable_memrefs_p (rtx, rtx); 112 1.9 mrg extern poly_int64 h8300_push_rounding (poly_int64); 113 1.1 mrg 114 1.1 mrg #endif /* ! GCC_H8300_PROTOS_H */ 115