1 /* Copyright (C) 2016-2020 Free Software Foundation, Inc. 2 3 This file is free software; you can redistribute it and/or modify it under 4 the terms of the GNU General Public License as published by the Free 5 Software Foundation; either version 3 of the License, or (at your option) 6 any later version. 7 8 This file is distributed in the hope that it will be useful, but WITHOUT 9 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 for more details. 12 13 You should have received a copy of the GNU General Public License 14 along with GCC; see the file COPYING3. If not see 15 <http://www.gnu.org/licenses/>. */ 16 17 #ifndef _GCN_PROTOS_ 18 #define _GCN_PROTOS_ 19 20 extern void gcn_asm_output_symbol_ref (FILE *file, rtx x); 21 extern tree gcn_builtin_decl (unsigned code, bool initialize_p); 22 extern bool gcn_can_split_p (machine_mode, rtx); 23 extern bool gcn_constant64_p (rtx); 24 extern bool gcn_constant_p (rtx); 25 extern rtx gcn_convert_mask_mode (rtx reg); 26 extern char * gcn_expand_dpp_shr_insn (machine_mode, const char *, int, int); 27 extern void gcn_expand_epilogue (); 28 extern rtx gcn_expand_scaled_offsets (addr_space_t as, rtx base, rtx offsets, 29 rtx scale, bool unsigned_p, rtx exec); 30 extern void gcn_expand_prologue (); 31 extern rtx gcn_expand_reduc_scalar (machine_mode, rtx, int); 32 extern rtx gcn_expand_scalar_to_vector_address (machine_mode, rtx, rtx, rtx); 33 extern void gcn_expand_vector_init (rtx, rtx); 34 extern bool gcn_flat_address_p (rtx, machine_mode); 35 extern bool gcn_fp_constant_p (rtx, bool); 36 extern rtx gcn_full_exec (); 37 extern rtx gcn_full_exec_reg (); 38 extern rtx gcn_gen_undef (machine_mode); 39 extern bool gcn_global_address_p (rtx); 40 extern tree gcn_goacc_adjust_propagation_record (tree record_type, bool sender, 41 const char *name); 42 extern void gcn_goacc_adjust_gangprivate_decl (tree var); 43 extern void gcn_goacc_reduction (gcall *call); 44 extern bool gcn_hard_regno_rename_ok (unsigned int from_reg, 45 unsigned int to_reg); 46 extern machine_mode gcn_hard_regno_caller_save_mode (unsigned int regno, 47 unsigned int nregs, 48 machine_mode regmode); 49 extern bool gcn_hard_regno_mode_ok (int regno, machine_mode mode); 50 extern int gcn_hard_regno_nregs (int regno, machine_mode mode); 51 extern void gcn_hsa_declare_function_name (FILE *file, const char *name, 52 tree decl); 53 extern HOST_WIDE_INT gcn_initial_elimination_offset (int, int); 54 extern bool gcn_inline_constant64_p (rtx, bool); 55 extern bool gcn_inline_constant_p (rtx); 56 extern int gcn_inline_fp_constant_p (rtx, bool); 57 extern reg_class gcn_mode_code_base_reg_class (machine_mode, addr_space_t, 58 int, int); 59 extern rtx gcn_oacc_dim_pos (int dim); 60 extern rtx gcn_oacc_dim_size (int dim); 61 extern rtx gcn_operand_doublepart (machine_mode, rtx, int); 62 extern rtx gcn_operand_part (machine_mode, rtx, int); 63 extern bool gcn_regno_mode_code_ok_for_base_p (int, machine_mode, 64 addr_space_t, int, int); 65 extern reg_class gcn_regno_reg_class (int regno); 66 extern rtx gcn_scalar_exec (); 67 extern rtx gcn_scalar_exec_reg (); 68 extern bool gcn_scalar_flat_address_p (rtx); 69 extern bool gcn_scalar_flat_mem_p (rtx); 70 extern bool gcn_sgpr_move_p (rtx, rtx); 71 extern bool gcn_valid_move_p (machine_mode, rtx, rtx); 72 extern rtx gcn_vec_constant (machine_mode, int); 73 extern rtx gcn_vec_constant (machine_mode, rtx); 74 extern bool gcn_vgpr_move_p (rtx, rtx); 75 extern void print_operand_address (FILE *file, register rtx addr); 76 extern void print_operand (FILE *file, rtx x, int code); 77 extern bool regno_ok_for_index_p (int); 78 79 enum gcn_cvt_t 80 { 81 fix_trunc_cvt, 82 fixuns_trunc_cvt, 83 float_cvt, 84 floatuns_cvt, 85 extend_cvt, 86 trunc_cvt 87 }; 88 89 extern bool gcn_valid_cvt_p (machine_mode from, machine_mode to, 90 enum gcn_cvt_t op); 91 92 #ifdef TREE_CODE 93 extern void gcn_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, 94 int); 95 class gimple_opt_pass; 96 extern gimple_opt_pass *make_pass_omp_gcn (gcc::context *ctxt); 97 #endif 98 99 /* Return true if MODE is valid for 1 VGPR register. */ 100 101 inline bool 102 vgpr_1reg_mode_p (machine_mode mode) 103 { 104 return (mode == SImode || mode == SFmode || mode == HImode || mode == QImode 105 || mode == V64QImode || mode == V64HImode || mode == V64SImode 106 || mode == V64HFmode || mode == V64SFmode || mode == BImode); 107 } 108 109 /* Return true if MODE is valid for 1 SGPR register. */ 110 111 inline bool 112 sgpr_1reg_mode_p (machine_mode mode) 113 { 114 return (mode == SImode || mode == SFmode || mode == HImode 115 || mode == QImode || mode == BImode); 116 } 117 118 /* Return true if MODE is valid for pair of VGPR registers. */ 119 120 inline bool 121 vgpr_2reg_mode_p (machine_mode mode) 122 { 123 return (mode == DImode || mode == DFmode 124 || mode == V64DImode || mode == V64DFmode); 125 } 126 127 /* Return true if MODE can be handled directly by VGPR operations. */ 128 129 inline bool 130 vgpr_vector_mode_p (machine_mode mode) 131 { 132 return (mode == V64QImode || mode == V64HImode 133 || mode == V64SImode || mode == V64DImode 134 || mode == V64HFmode || mode == V64SFmode || mode == V64DFmode); 135 } 136 137 138 /* Return true if MODE is valid for pair of SGPR registers. */ 139 140 inline bool 141 sgpr_2reg_mode_p (machine_mode mode) 142 { 143 return mode == DImode || mode == DFmode; 144 } 145 146 #endif 147