1  /* Internal to rs6000 type, variable, and function declarations and
       2     definitons shared between the various rs6000 source files.
       3     Copyright (C) 1991-2023 Free Software Foundation, Inc.
       4     Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
       5  
       6     This file is part of GCC.
       7  
       8     GCC is free software; you can redistribute it and/or modify it
       9     under the terms of the GNU General Public License as published
      10     by the Free Software Foundation; either version 3, or (at your
      11     option) any later version.
      12  
      13     GCC is distributed in the hope that it will be useful, but WITHOUT
      14     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
      15     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
      16     License for more details.
      17  
      18     You should have received a copy of the GNU General Public License
      19     along with GCC; see the file COPYING3.  If not see
      20     <http://www.gnu.org/licenses/>.  */
      21  
      22  #ifndef GCC_RS6000_INTERNAL_H
      23  #define GCC_RS6000_INTERNAL_H
      24  
      25  #include "rs6000-builtins.h"
      26  
      27  /* Structure used to define the rs6000 stack */
      28  typedef struct rs6000_stack {
      29    int reload_completed;		/* stack info won't change from here on */
      30    int first_gp_reg_save;	/* first callee saved GP register used */
      31    int first_fp_reg_save;	/* first callee saved FP register used */
      32    int first_altivec_reg_save;	/* first callee saved AltiVec register used */
      33    int lr_save_p;		/* true if the link reg needs to be saved */
      34    int cr_save_p;		/* true if the CR reg needs to be saved */
      35    unsigned int vrsave_mask;	/* mask of vec registers to save */
      36    int push_p;			/* true if we need to allocate stack space */
      37    int calls_p;			/* true if there are non-sibling calls */
      38    int world_save_p;		/* true if we're saving *everything*:
      39  				   r13-r31, cr, f14-f31, vrsave, v20-v31  */
      40    enum rs6000_abi abi;		/* which ABI to use */
      41    int gp_save_offset;		/* offset to save GP regs from initial SP */
      42    int fp_save_offset;		/* offset to save FP regs from initial SP */
      43    int altivec_save_offset;	/* offset to save AltiVec regs from initial SP */
      44    int rop_hash_save_offset;	/* offset to save ROP hash from initial SP */
      45    int lr_save_offset;		/* offset to save LR from initial SP */
      46    int cr_save_offset;		/* offset to save CR from initial SP */
      47    int vrsave_save_offset;	/* offset to save VRSAVE from initial SP */
      48    int varargs_save_offset;	/* offset to save the varargs registers */
      49    int ehrd_offset;		/* offset to EH return data */
      50    int ehcr_offset;		/* offset to EH CR field data */
      51    int reg_size;			/* register size (4 or 8) */
      52    HOST_WIDE_INT vars_size;	/* variable save area size */
      53    int parm_size;		/* outgoing parameter size */
      54    int save_size;		/* save area size */
      55    int fixed_size;		/* fixed size of stack frame */
      56    int gp_size;			/* size of saved GP registers */
      57    int fp_size;			/* size of saved FP registers */
      58    int altivec_size;		/* size of saved AltiVec registers */
      59    int rop_hash_size;		/* size of ROP hash slot */
      60    int cr_size;			/* size to hold CR if not in fixed area */
      61    int vrsave_size;		/* size to hold VRSAVE */
      62    int altivec_padding_size;	/* size of altivec alignment padding */
      63    HOST_WIDE_INT total_size;	/* total bytes allocated for stack */
      64    int savres_strategy;
      65  } rs6000_stack_t;
      66  
      67  
      68  extern int need_toc_init;
      69  extern char toc_label_name[10];
      70  extern int rs6000_pic_labelno;
      71  
      72  #ifdef USING_ELFOS_H
      73  extern const char *rs6000_machine;
      74  #endif
      75  
      76  
      77  /* The VRSAVE bitmask puts bit %v0 as the most significant bit.  */
      78  #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
      79  
      80  
      81  /* Declare functions in rs6000-logue.cc or called in rs6000.cc
      82     from rs6000-logue.cc  */
      83  
      84  extern int uses_TOC (void);
      85  extern void rs6000_output_function_prologue (FILE *file);
      86  extern void rs6000_output_function_epilogue (FILE *file);
      87  extern bool rs6000_function_ok_for_sibcall (tree decl, tree exp);
      88  extern sbitmap rs6000_get_separate_components (void);
      89  extern sbitmap rs6000_components_for_bb (basic_block bb);
      90  extern void rs6000_disqualify_components (sbitmap components, edge e,
      91  					  sbitmap edge_components,
      92  					  bool /*is_prologue*/);
      93  extern void rs6000_emit_prologue_components (sbitmap components);
      94  extern void rs6000_emit_epilogue_components (sbitmap components);
      95  extern void rs6000_set_handled_components (sbitmap components);
      96  extern rs6000_stack_t * rs6000_stack_info (void);
      97  extern rtx rs6000_got_sym (void);
      98  extern struct machine_function *rs6000_init_machine_status (void);
      99  extern bool save_reg_p (int reg);
     100  extern const char * rs6000_machine_from_flags (void);
     101  extern void emit_asm_machine (void);
     102  extern bool rs6000_global_entry_point_prologue_needed_p (void);
     103  extern bool rs6000_keep_leaf_when_profiled (void);
     104  extern void rs6000_live_on_entry (bitmap regs);
     105  
     106  /* Return true if the OFFSET is valid for the quad address instructions that
     107     use d-form (register + offset) addressing.  */
     108  
     109  static inline bool
     110  quad_address_offset_p (HOST_WIDE_INT offset)
     111  {
     112    return (IN_RANGE (offset, -32768, 32767) && ((offset) & 0xf) == 0);
     113  }
     114  
     115  /* Mach-O (Darwin) support for longcalls, emitted from  rs6000-logue.cc.  */
     116  
     117  #if TARGET_MACHO
     118  
     119  typedef struct branch_island_d {
     120    tree function_name;
     121    tree label_name;
     122    int line_number;
     123   } branch_island;
     124  
     125  extern vec<branch_island, va_gc> *branch_islands;
     126  
     127  #endif
     128  
     129  /* Declare functions in rs6000-call.cc or called in rs6000.cc
     130     from rs6000-call.cc  */
     131  extern int rs6000_darwin64_struct_check_p (machine_mode mode, const_tree type);
     132  extern bool rs6000_discover_homogeneous_aggregate (machine_mode mode,
     133  						   const_tree type,
     134  						   machine_mode *elt_mode,
     135  						   int *n_elts);
     136  extern void rs6000_output_mi_thunk (FILE *file,
     137  				    tree thunk_fndecl ATTRIBUTE_UNUSED,
     138  				    HOST_WIDE_INT delta,
     139  				    HOST_WIDE_INT vcall_offset,
     140  				    tree function);
     141  extern bool rs6000_output_addr_const_extra (FILE *file, rtx x);
     142  extern bool rs6000_gimple_fold_builtin (gimple_stmt_iterator *gsi);
     143  extern tree rs6000_build_builtin_va_list (void);
     144  extern void rs6000_invalid_builtin (rs6000_gen_builtins fncode);
     145  extern void rs6000_va_start (tree valist, rtx nextarg);
     146  extern tree rs6000_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
     147  				    gimple_seq *post_p);
     148  extern machine_mode rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
     149  						  machine_mode mode,
     150  						  int *punsignedp ATTRIBUTE_UNUSED,
     151  						  const_tree, int);
     152  extern bool rs6000_return_in_memory (const_tree type, 
     153  				     const_tree fntype ATTRIBUTE_UNUSED);
     154  extern bool rs6000_return_in_msb (const_tree valtype);
     155  extern bool rs6000_pass_by_reference (cumulative_args_t,
     156  				      const function_arg_info &);
     157  extern void setup_incoming_varargs (cumulative_args_t,
     158  				    const function_arg_info &, int *, int);
     159  extern unsigned int rs6000_function_arg_boundary (machine_mode mode,
     160  						  const_tree type);
     161  extern bool rs6000_must_pass_in_stack (const function_arg_info &);
     162  extern int rs6000_arg_partial_bytes (cumulative_args_t,
     163  				     const function_arg_info &);
     164  extern void rs6000_function_arg_advance (cumulative_args_t,
     165  					 const function_arg_info &);
     166  extern pad_direction rs6000_function_arg_padding (machine_mode mode,
     167  						  const_tree type);
     168  extern rtx rs6000_function_arg (cumulative_args_t, const function_arg_info &);
     169  extern rtx rs6000_darwin64_record_arg (CUMULATIVE_ARGS *, const_tree,
     170  				       bool, bool);
     171  extern rtx rs6000_internal_arg_pointer (void);
     172  
     173  extern void rs6000_init_builtins (void);
     174  extern tree rs6000_builtin_decl (unsigned code,
     175  				 bool initialize_p ATTRIBUTE_UNUSED);
     176  extern rtx rs6000_expand_builtin (tree exp, rtx target,
     177  				  rtx subtarget ATTRIBUTE_UNUSED,
     178  				  machine_mode mode ATTRIBUTE_UNUSED,
     179  				  int ignore ATTRIBUTE_UNUSED);
     180  extern tree rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED,
     181  			         int n_args ATTRIBUTE_UNUSED,
     182  			         tree *args ATTRIBUTE_UNUSED,
     183  			         bool ignore ATTRIBUTE_UNUSED);
     184  
     185  extern void rs6000_print_patchable_function_entry (FILE *,
     186  						   unsigned HOST_WIDE_INT,
     187  						   bool);
     188  
     189  extern bool rs6000_passes_float;
     190  extern bool rs6000_passes_long_double;
     191  extern bool rs6000_passes_vector;
     192  extern bool rs6000_returns_struct;
     193  extern bool cpu_builtin_p;
     194  
     195  #endif