(root)/
gcc-13.2.0/
gcc/
config/
rs6000/
rs6000-protos.h
       1  /* Definitions of target machine for GNU compiler, for IBM RS/6000.
       2     Copyright (C) 2000-2023 Free Software Foundation, Inc.
       3     Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
       4  
       5     This file is part of GCC.
       6  
       7     GCC is free software; you can redistribute it and/or modify it
       8     under the terms of the GNU General Public License as published
       9     by the Free Software Foundation; either version 3, or (at your
      10     option) any later version.
      11  
      12     GCC is distributed in the hope that it will be useful, but WITHOUT
      13     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      14     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      15     License for more details.
      16  
      17     You should have received a copy of the GNU General Public License
      18     along with GCC; see the file COPYING3.  If not see
      19     <http://www.gnu.org/licenses/>.  */
      20  
      21  #ifndef GCC_RS6000_PROTOS_H
      22  #define GCC_RS6000_PROTOS_H
      23  
      24  /* Declare functions in rs6000.cc */
      25  
      26  #ifdef RTX_CODE
      27  
      28  #ifdef TREE_CODE
      29  extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, int, int, int,
      30  				  tree, machine_mode);
      31  #endif /* TREE_CODE */
      32  
      33  extern int easy_altivec_constant (rtx, machine_mode);
      34  extern bool xxspltib_constant_p (rtx, machine_mode, int *, int *);
      35  extern int vspltis_shifted (rtx);
      36  extern HOST_WIDE_INT const_vector_elt_as_int (rtx, unsigned int);
      37  extern bool macho_lo_sum_memory_operand (rtx, machine_mode);
      38  extern bool can_be_rotated_to_lowbits (unsigned HOST_WIDE_INT, int, int *);
      39  extern bool can_be_rotated_to_positive_16bits (HOST_WIDE_INT);
      40  extern bool can_be_rotated_to_negative_15bits (HOST_WIDE_INT);
      41  extern int num_insns_constant (rtx, machine_mode);
      42  extern int small_data_operand (rtx, machine_mode);
      43  extern bool mem_operand_gpr (rtx, machine_mode);
      44  extern bool mem_operand_ds_form (rtx, machine_mode);
      45  extern bool toc_relative_expr_p (const_rtx, bool, const_rtx *, const_rtx *);
      46  extern void validate_condition_mode (enum rtx_code, machine_mode);
      47  extern bool legitimate_constant_pool_address_p (const_rtx, machine_mode,
      48  						bool);
      49  extern bool legitimate_indirect_address_p (rtx, int);
      50  extern bool legitimate_indexed_address_p (rtx, int);
      51  extern bool avoiding_indexed_address_p (machine_mode);
      52  extern rtx rs6000_force_indexed_or_indirect_mem (rtx x);
      53  
      54  extern rtx rs6000_got_register (rtx);
      55  extern rtx find_addr_reg (rtx);
      56  extern rtx gen_easy_altivec_constant (rtx);
      57  extern const char *output_vec_const_move (rtx *);
      58  extern const char *rs6000_output_move_128bit (rtx *);
      59  extern bool rs6000_move_128bit_ok_p (rtx []);
      60  extern bool rs6000_split_128bit_ok_p (rtx []);
      61  extern void rs6000_expand_float128_convert (rtx, rtx, bool);
      62  extern void rs6000_expand_vector_init (rtx, rtx);
      63  extern void rs6000_expand_vector_set (rtx, rtx, rtx);
      64  extern void rs6000_expand_vector_extract (rtx, rtx, rtx);
      65  extern void rs6000_split_vec_extract_var (rtx, rtx, rtx, rtx, rtx);
      66  extern rtx rs6000_adjust_vec_address (rtx, rtx, rtx, rtx, machine_mode);
      67  extern void altivec_expand_vec_perm_le (rtx op[4]);
      68  extern void rs6000_expand_extract_even (rtx, rtx, rtx);
      69  extern void rs6000_expand_interleave (rtx, rtx, rtx, bool);
      70  extern void rs6000_scale_v2df (rtx, rtx, int);
      71  extern void rs6000_generate_float2_code (bool, rtx, rtx, rtx);
      72  extern void rs6000_generate_float2_double_code (rtx, rtx, rtx);
      73  extern void rs6000_generate_vsigned2_code (bool, rtx, rtx, rtx);
      74  extern int expand_block_clear (rtx[]);
      75  extern int expand_block_move (rtx[], bool);
      76  extern bool expand_block_compare (rtx[]);
      77  extern bool expand_strn_compare (rtx[], int);
      78  extern bool rs6000_is_valid_mask (rtx, int *, int *, machine_mode);
      79  extern bool rs6000_is_valid_rotate_dot_mask (rtx mask, machine_mode mode);
      80  extern bool rs6000_is_valid_and_mask (rtx, machine_mode);
      81  extern bool rs6000_is_valid_shift_mask (rtx, rtx, machine_mode);
      82  extern bool rs6000_is_valid_insert_mask (rtx, rtx, machine_mode);
      83  extern const char *rs6000_insn_for_and_mask (machine_mode, rtx *, bool);
      84  extern const char *rs6000_insn_for_shift_mask (machine_mode, rtx *, bool);
      85  extern const char *rs6000_insn_for_insert_mask (machine_mode, rtx *, bool);
      86  extern bool rs6000_is_valid_2insn_and (rtx, machine_mode);
      87  extern void rs6000_emit_2insn_and (machine_mode, rtx *, bool, int);
      88  extern int registers_ok_for_quad_peep (rtx, rtx);
      89  extern int mems_ok_for_quad_peep (rtx, rtx);
      90  extern bool gpr_or_gpr_p (rtx, rtx);
      91  extern bool direct_move_p (rtx, rtx);
      92  extern bool quad_address_p (rtx, machine_mode, bool);
      93  extern bool quad_load_store_p (rtx, rtx);
      94  extern bool fusion_gpr_load_p (rtx, rtx, rtx, rtx);
      95  extern void expand_fusion_gpr_load (rtx *);
      96  extern void emit_fusion_addis (rtx, rtx);
      97  extern const char *emit_fusion_gpr_load (rtx, rtx);
      98  extern enum reg_class (*rs6000_preferred_reload_class_ptr) (rtx,
      99  							    enum reg_class);
     100  extern enum reg_class (*rs6000_secondary_reload_class_ptr) (enum reg_class,
     101  							    machine_mode,
     102  							    rtx);
     103  extern void rs6000_secondary_reload_inner (rtx, rtx, rtx, bool);
     104  extern void rs6000_secondary_reload_gpr (rtx, rtx, rtx, bool);
     105  
     106  
     107  extern int ccr_bit (rtx, int);
     108  extern void rs6000_output_function_entry (FILE *, const char *);
     109  extern void print_operand (FILE *, rtx, int);
     110  extern void print_operand_address (FILE *, rtx);
     111  extern const char *rs6000_call_template (rtx *, unsigned int);
     112  extern const char *rs6000_sibcall_template (rtx *, unsigned int);
     113  extern const char *rs6000_indirect_call_template (rtx *, unsigned int);
     114  extern const char *rs6000_indirect_sibcall_template (rtx *, unsigned int);
     115  extern const char *rs6000_pltseq_template (rtx *, int);
     116  extern enum rtx_code rs6000_reverse_condition (machine_mode,
     117  					       enum rtx_code);
     118  extern rtx rs6000_emit_eqne (machine_mode, rtx, rtx, rtx);
     119  extern rtx rs6000_emit_fp_cror (rtx_code, machine_mode, rtx);
     120  extern void rs6000_emit_sCOND (machine_mode, rtx[]);
     121  extern void rs6000_emit_cbranch (machine_mode, rtx[]);
     122  extern char * output_cbranch (rtx, const char *, int, rtx_insn *);
     123  extern const char * output_probe_stack_range (rtx, rtx, rtx);
     124  extern void rs6000_emit_dot_insn (rtx dst, rtx src, int dot, rtx ccreg);
     125  extern bool rs6000_emit_set_const (rtx, rtx);
     126  extern bool rs6000_emit_cmove (rtx, rtx, rtx, rtx);
     127  extern bool rs6000_emit_int_cmove (rtx, rtx, rtx, rtx);
     128  extern int rs6000_emit_vector_cond_expr (rtx, rtx, rtx, rtx, rtx, rtx);
     129  extern void rs6000_emit_minmax (rtx, enum rtx_code, rtx, rtx);
     130  extern void rs6000_expand_atomic_compare_and_swap (rtx op[]);
     131  extern rtx swap_endian_selector_for_mode (machine_mode mode);
     132  
     133  extern void rs6000_expand_atomic_exchange (rtx op[]);
     134  extern void rs6000_expand_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx);
     135  extern void rs6000_emit_swdiv (rtx, rtx, rtx, bool);
     136  extern void rs6000_emit_swsqrt (rtx, rtx, bool);
     137  extern void output_toc (FILE *, rtx, int, machine_mode);
     138  extern void rs6000_fatal_bad_address (rtx);
     139  extern rtx create_TOC_reference (rtx, rtx);
     140  extern void rs6000_split_multireg_move (rtx, rtx);
     141  extern void rs6000_emit_le_vsx_permute (rtx, rtx, machine_mode);
     142  extern void rs6000_emit_le_vsx_move (rtx, rtx, machine_mode);
     143  extern bool valid_sf_si_move (rtx, rtx, machine_mode);
     144  extern void rs6000_emit_move (rtx, rtx, machine_mode);
     145  extern bool rs6000_legitimate_offset_address_p (machine_mode, rtx,
     146  						bool, bool);
     147  extern rtx rs6000_find_base_term (rtx);
     148  extern rtx rs6000_return_addr (int, rtx);
     149  extern void rs6000_output_symbol_ref (FILE*, rtx);
     150  extern HOST_WIDE_INT rs6000_initial_elimination_offset (int, int);
     151  extern void rs6000_emit_popcount (rtx, rtx);
     152  extern void rs6000_emit_parity (rtx, rtx);
     153  
     154  extern rtx rs6000_machopic_legitimize_pic_address (rtx, machine_mode,
     155  						   rtx);
     156  extern rtx rs6000_allocate_stack_temp (machine_mode, bool, bool);
     157  extern align_flags rs6000_loop_align (rtx);
     158  extern void rs6000_split_logical (rtx [], enum rtx_code, bool, bool, bool);
     159  extern bool rs6000_function_pcrel_p (struct function *);
     160  extern bool rs6000_pcrel_p (void);
     161  extern bool rs6000_fndecl_pcrel_p (const_tree);
     162  extern void rs6000_output_addr_vec_elt (FILE *, int);
     163  
     164  /* Different PowerPC instruction formats that are used by GCC.  There are
     165     various other instruction formats used by the PowerPC hardware, but these
     166     formats are not currently used by GCC.  */
     167  
     168  enum insn_form {
     169    INSN_FORM_BAD,		/* Bad instruction format.  */
     170    INSN_FORM_BASE_REG,		/* Base register only.  */
     171    INSN_FORM_D,			/* Reg + 16-bit numeric offset.  */
     172    INSN_FORM_DS,			/* Reg + offset, bottom 2 bits must be 0.  */
     173    INSN_FORM_DQ,			/* Reg + offset, bottom 4 bits must be 0.  */
     174    INSN_FORM_X,			/* Base register + index register.  */
     175    INSN_FORM_UPDATE,		/* Address updates base register.  */
     176    INSN_FORM_LO_SUM,		/* Reg + offset using symbol.  */
     177    INSN_FORM_PREFIXED_NUMERIC,	/* Reg + 34 bit numeric offset.  */
     178    INSN_FORM_PCREL_LOCAL,	/* PC-relative local symbol.  */
     179    INSN_FORM_PCREL_EXTERNAL	/* PC-relative external symbol.  */
     180  };
     181  
     182  /* Instruction format for the non-prefixed version of a load or store.  This is
     183     used to determine if a 16-bit offset is valid to be used with a non-prefixed
     184     (traditional) instruction or if the bottom bits of the offset cannot be used
     185     with a DS or DQ instruction format, and GCC has to use a prefixed
     186     instruction for the load or store.  */
     187  
     188  enum non_prefixed_form {
     189    NON_PREFIXED_DEFAULT,		/* Use the default.  */
     190    NON_PREFIXED_D,		/* All 16-bits are valid.  */
     191    NON_PREFIXED_DS,		/* Bottom 2 bits must be 0.  */
     192    NON_PREFIXED_DQ,		/* Bottom 4 bits must be 0.  */
     193    NON_PREFIXED_X		/* No offset memory form exists.  */
     194  };
     195  
     196  extern enum insn_form address_to_insn_form (rtx, machine_mode,
     197  					    enum non_prefixed_form);
     198  extern bool address_is_non_pfx_d_or_x (rtx addr, machine_mode mode,
     199  				       enum non_prefixed_form non_prefix_format);
     200  extern bool pcrel_opt_valid_mem_p (rtx, machine_mode, rtx);
     201  enum non_prefixed_form reg_to_non_prefixed (rtx reg, machine_mode mode);
     202  extern bool prefixed_load_p (rtx_insn *);
     203  extern bool prefixed_store_p (rtx_insn *);
     204  extern bool prefixed_paddi_p (rtx_insn *);
     205  extern void rs6000_asm_output_opcode (FILE *);
     206  extern void output_pcrel_opt_reloc (rtx);
     207  extern void rs6000_final_prescan_insn (rtx_insn *, rtx [], int);
     208  extern int rs6000_adjust_insn_length (rtx_insn *, int);
     209  
     210  /* Return true if the address can be used for a prefixed load, store, or add
     211     immediate instructions that cannot be used with a non-prefixed instruction.
     212     For example, using a numeric offset that is not valid for the non-prefixed
     213     instruction or a PC-relative reference to a local symbol would return true,
     214     but an address with an offset of 64 would not return true.
     215  
     216     References to external PC-relative symbols aren't allowed, because GCC has
     217     to load the address into a register and then issue a separate load or
     218     store.  */
     219  
     220  static inline bool
     221  address_is_prefixed (rtx addr,
     222  		     machine_mode mode,
     223  		     enum non_prefixed_form non_prefixed)
     224  {
     225    enum insn_form iform = address_to_insn_form (addr, mode, non_prefixed);
     226    return (iform == INSN_FORM_PREFIXED_NUMERIC
     227  	  || iform == INSN_FORM_PCREL_LOCAL);
     228  }
     229  
     230  /* Functions and data structures relating to 128-bit constants that are
     231     converted to byte, half-word, word, and double-word values.  All fields are
     232     kept in big endian order.  We also convert scalar values to 128-bits if they
     233     are going to be loaded into vector registers.  */
     234  #define VECTOR_128BIT_BITS		128
     235  #define VECTOR_128BIT_BYTES		(128 / 8)
     236  #define VECTOR_128BIT_HALF_WORDS	(128 / 16)
     237  #define VECTOR_128BIT_WORDS		(128 / 32)
     238  #define VECTOR_128BIT_DOUBLE_WORDS	(128 / 64)
     239  
     240  typedef struct {
     241    /* Constant as various sized items.  */
     242    unsigned HOST_WIDE_INT double_words[VECTOR_128BIT_DOUBLE_WORDS];
     243    unsigned int words[VECTOR_128BIT_WORDS];
     244    unsigned short half_words[VECTOR_128BIT_HALF_WORDS];
     245    unsigned char bytes[VECTOR_128BIT_BYTES];
     246  
     247    unsigned original_size;		/* Constant size before splat.  */
     248    bool fp_constant_p;			/* Is the constant floating point?  */
     249    bool all_double_words_same;		/* Are the double words all equal?  */
     250    bool all_words_same;			/* Are the words all equal?  */
     251    bool all_half_words_same;		/* Are the half words all equal?  */
     252    bool all_bytes_same;			/* Are the bytes all equal?  */
     253  } vec_const_128bit_type;
     254  
     255  extern bool vec_const_128bit_to_bytes (rtx, machine_mode,
     256  				       vec_const_128bit_type *);
     257  extern unsigned constant_generates_lxvkq (vec_const_128bit_type *);
     258  extern unsigned constant_generates_xxspltiw (vec_const_128bit_type *);
     259  extern unsigned constant_generates_xxspltidp (vec_const_128bit_type *);
     260  #endif /* RTX_CODE */
     261  
     262  #ifdef TREE_CODE
     263  extern unsigned int rs6000_data_alignment (tree, unsigned int, enum data_align);
     264  extern unsigned int rs6000_special_adjust_field_align (tree, unsigned int);
     265  extern unsigned int rs6000_special_round_type_align (tree, unsigned int,
     266  						     unsigned int);
     267  extern unsigned int darwin_rs6000_special_round_type_align (tree, unsigned int,
     268  							    unsigned int);
     269  extern tree altivec_resolve_overloaded_builtin (location_t, tree, void *);
     270  extern rtx rs6000_libcall_value (machine_mode);
     271  extern rtx rs6000_va_arg (tree, tree);
     272  extern int function_ok_for_sibcall (tree);
     273  extern int rs6000_reg_parm_stack_space (tree, bool);
     274  extern void rs6000_asm_weaken_decl (FILE *, tree, const char *, const char *);
     275  extern void rs6000_xcoff_declare_function_name (FILE *, const char *, tree);
     276  extern void rs6000_xcoff_declare_object_name (FILE *, const char *, tree);
     277  extern void rs6000_xcoff_asm_output_aligned_decl_common (FILE *, tree,
     278  							 const char *,
     279  							 unsigned HOST_WIDE_INT,
     280  							 unsigned int);
     281  extern void rs6000_elf_declare_function_name (FILE *, const char *, tree);
     282  extern bool rs6000_elf_in_small_data_p (const_tree);
     283  
     284  #endif /* TREE_CODE */
     285  
     286  extern int direct_return (void);
     287  extern int first_reg_to_save (void);
     288  extern int first_fp_reg_to_save (void);
     289  extern void output_ascii (FILE *, const char *, int);
     290  extern void rs6000_gen_section_name (char **, const char *, const char *);
     291  extern void output_function_profiler (FILE *, int);
     292  extern void output_profile_hook  (int);
     293  extern int rs6000_trampoline_size (void);
     294  extern alias_set_type get_TOC_alias_set (void);
     295  extern void rs6000_emit_prologue (void);
     296  extern void rs6000_emit_load_toc_table (int);
     297  extern unsigned int rs6000_debugger_regno (unsigned int, unsigned int);
     298  extern void rs6000_emit_epilogue (enum epilogue_type);
     299  extern void rs6000_expand_split_stack_prologue (void);
     300  extern void rs6000_split_stack_space_check (rtx, rtx);
     301  extern void rs6000_emit_eh_reg_restore (rtx, rtx);
     302  extern void rs6000_call_aix (rtx, rtx, rtx, rtx);
     303  extern void rs6000_sibcall_aix (rtx, rtx, rtx, rtx);
     304  extern void rs6000_call_sysv (rtx, rtx, rtx, rtx);
     305  extern void rs6000_sibcall_sysv (rtx, rtx, rtx, rtx);
     306  extern void rs6000_call_darwin (rtx, rtx, rtx, rtx);
     307  extern void rs6000_sibcall_darwin (rtx, rtx, rtx, rtx);
     308  extern void rs6000_aix_asm_output_dwarf_table_ref (char *);
     309  extern void get_ppc476_thunk_name (char name[32]);
     310  extern int rs6000_store_data_bypass_p (rtx_insn *, rtx_insn *);
     311  extern HOST_WIDE_INT rs6000_builtin_mask_calculate (void);
     312  extern void rs6000_asm_output_dwarf_pcrel (FILE *file, int size,
     313  					   const char *label);
     314  extern void rs6000_asm_output_dwarf_datarel (FILE *file, int size,
     315  					     const char *label);
     316  extern long rs6000_const_f32_to_i32 (rtx operand);
     317  
     318  /* Declare functions in rs6000-c.cc */
     319  
     320  extern void rs6000_pragma_longcall (struct cpp_reader *);
     321  extern void rs6000_cpu_cpp_builtins (struct cpp_reader *);
     322  #ifdef TREE_CODE
     323  extern bool rs6000_pragma_target_parse (tree, tree);
     324  #endif
     325  extern void rs6000_activate_target_options (tree new_tree);
     326  extern void rs6000_target_modify_macros (bool, HOST_WIDE_INT);
     327  extern void (*rs6000_target_modify_macros_ptr) (bool, HOST_WIDE_INT);
     328  
     329  #ifdef NO_DOLLAR_IN_LABEL
     330  const char * rs6000_xcoff_strip_dollar (const char *);
     331  #endif
     332  
     333  extern unsigned char rs6000_class_max_nregs[][LIM_REG_CLASSES];
     334  extern unsigned char rs6000_hard_regno_nregs[][FIRST_PSEUDO_REGISTER];
     335  
     336  extern bool rs6000_linux_float_exceptions_rounding_supported_p (void);
     337  
     338  /* Pass management.  */
     339  namespace gcc { class context; }
     340  class rtl_opt_pass;
     341  
     342  extern rtl_opt_pass *make_pass_analyze_swaps (gcc::context *);
     343  extern rtl_opt_pass *make_pass_pcrel_opt (gcc::context *);
     344  extern bool rs6000_sum_of_two_registers_p (const_rtx expr);
     345  extern bool rs6000_quadword_masked_address_p (const_rtx exp);
     346  extern rtx rs6000_gen_lvx (enum machine_mode, rtx, rtx);
     347  extern rtx rs6000_gen_stvx (enum machine_mode, rtx, rtx);
     348  
     349  extern void rs6000_emit_xxspltidp_v2df (rtx, long value);
     350  extern gimple *currently_expanding_gimple_stmt;
     351  extern bool rs6000_opaque_type_invalid_use_p (gimple *);
     352  #endif  /* rs6000-protos.h */