1 /* Internal to rs6000 type, variable, and function declarations and
2 definitons shared between the various rs6000 source files.
3 Copyright (C) 1991-2019 Free Software Foundation, Inc.
4 Contributed by Richard Kenner (kenner@vlsi1.ultra.nyu.edu)
6 This file is part of GCC.
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.
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.
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/>. */
22 #ifndef GCC_RS6000_INTERNAL_H
23 #define GCC_RS6000_INTERNAL_H
25 /* Structure used to define the rs6000 stack */
26 typedef struct rs6000_stack
{
27 int reload_completed
; /* stack info won't change from here on */
28 int first_gp_reg_save
; /* first callee saved GP register used */
29 int first_fp_reg_save
; /* first callee saved FP register used */
30 int first_altivec_reg_save
; /* first callee saved AltiVec register used */
31 int lr_save_p
; /* true if the link reg needs to be saved */
32 int cr_save_p
; /* true if the CR reg needs to be saved */
33 unsigned int vrsave_mask
; /* mask of vec registers to save */
34 int push_p
; /* true if we need to allocate stack space */
35 int calls_p
; /* true if the function makes any calls */
36 int world_save_p
; /* true if we're saving *everything*:
37 r13-r31, cr, f14-f31, vrsave, v20-v31 */
38 enum rs6000_abi abi
; /* which ABI to use */
39 int gp_save_offset
; /* offset to save GP regs from initial SP */
40 int fp_save_offset
; /* offset to save FP regs from initial SP */
41 int altivec_save_offset
; /* offset to save AltiVec regs from initial SP */
42 int lr_save_offset
; /* offset to save LR from initial SP */
43 int cr_save_offset
; /* offset to save CR from initial SP */
44 int vrsave_save_offset
; /* offset to save VRSAVE from initial SP */
45 int varargs_save_offset
; /* offset to save the varargs registers */
46 int ehrd_offset
; /* offset to EH return data */
47 int ehcr_offset
; /* offset to EH CR field data */
48 int reg_size
; /* register size (4 or 8) */
49 HOST_WIDE_INT vars_size
; /* variable save area size */
50 int parm_size
; /* outgoing parameter size */
51 int save_size
; /* save area size */
52 int fixed_size
; /* fixed size of stack frame */
53 int gp_size
; /* size of saved GP registers */
54 int fp_size
; /* size of saved FP registers */
55 int altivec_size
; /* size of saved AltiVec registers */
56 int cr_size
; /* size to hold CR if not in fixed area */
57 int vrsave_size
; /* size to hold VRSAVE */
58 int altivec_padding_size
; /* size of altivec alignment padding */
59 HOST_WIDE_INT total_size
; /* total bytes allocated for stack */
64 extern int need_toc_init
;
65 extern char toc_label_name
[10];
66 extern int rs6000_pic_labelno
;
67 extern section
*toc_section
;
70 extern const char *rs6000_machine
;
74 /* The VRSAVE bitmask puts bit %v0 as the most significant bit. */
75 #define ALTIVEC_REG_BIT(REGNO) (0x80000000 >> ((REGNO) - FIRST_ALTIVEC_REGNO))
78 /* Declare functions in rs6000-logue.c or called in rs6000.c
79 from rs6000-logue.c */
81 extern int uses_TOC (void);
82 extern bool rs6000_global_entry_point_needed_p (void);
83 extern void rs6000_output_function_prologue (FILE *file
);
84 extern void rs6000_output_function_epilogue (FILE *file
);
85 extern bool rs6000_function_ok_for_sibcall (tree decl
, tree exp
);
86 extern sbitmap
rs6000_get_separate_components (void);
87 extern sbitmap
rs6000_components_for_bb (basic_block bb
);
88 extern void rs6000_disqualify_components (sbitmap components
, edge e
,
89 sbitmap edge_components
,
90 bool /*is_prologue*/);
91 extern void rs6000_emit_prologue_components (sbitmap components
);
92 extern void rs6000_emit_epilogue_components (sbitmap components
);
93 extern void rs6000_set_handled_components (sbitmap components
);
94 extern rs6000_stack_t
* rs6000_stack_info (void);
95 extern rtx
rs6000_got_sym (void);
96 extern struct machine_function
*rs6000_init_machine_status (void);
97 extern bool save_reg_p (int reg
);
98 extern const char * rs6000_machine_from_flags (void);
99 extern void emit_asm_machine (void);
100 extern bool rs6000_global_entry_point_prologue_needed_p (void);
101 extern bool rs6000_keep_leaf_when_profiled (void);
102 extern void rs6000_live_on_entry (bitmap regs
);
104 /* Return true if the OFFSET is valid for the quad address instructions that
105 use d-form (register + offset) addressing. */
108 quad_address_offset_p (HOST_WIDE_INT offset
)
110 return (IN_RANGE (offset
, -32768, 32767) && ((offset
) & 0xf) == 0);
113 /* Mach-O (Darwin) support for longcalls, emitted from rs6000-logue.c. */
117 typedef struct branch_island_d
{
123 extern vec
<branch_island
, va_gc
> *branch_islands
;
127 /* Declare functions in rs6000-call.c or called in rs6000.c
128 from rs6000-call.c */
129 extern int rs6000_darwin64_struct_check_p (machine_mode mode
, const_tree type
);
130 extern bool rs6000_discover_homogeneous_aggregate (machine_mode mode
,
132 machine_mode
*elt_mode
,
134 extern void rs6000_output_mi_thunk (FILE *file
,
135 tree thunk_fndecl ATTRIBUTE_UNUSED
,
137 HOST_WIDE_INT vcall_offset
,
139 extern bool rs6000_output_addr_const_extra (FILE *file
, rtx x
);
140 extern bool rs6000_gimple_fold_builtin (gimple_stmt_iterator
*gsi
);
141 extern void rs6000_invalid_builtin (enum rs6000_builtins fncode
);
142 extern tree
rs6000_build_builtin_va_list (void);
143 extern void rs6000_va_start (tree valist
, rtx nextarg
);
144 extern tree
rs6000_gimplify_va_arg (tree valist
, tree type
, gimple_seq
*pre_p
,
146 extern machine_mode
rs6000_promote_function_mode (const_tree type ATTRIBUTE_UNUSED
,
148 int *punsignedp ATTRIBUTE_UNUSED
,
150 extern bool rs6000_return_in_memory (const_tree type
,
151 const_tree fntype ATTRIBUTE_UNUSED
);
152 extern bool rs6000_return_in_msb (const_tree valtype
);
153 extern bool rs6000_pass_by_reference (cumulative_args_t
,
154 const function_arg_info
&);
155 extern void setup_incoming_varargs (cumulative_args_t
,
156 const function_arg_info
&, int *, int);
157 extern unsigned int rs6000_function_arg_boundary (machine_mode mode
,
159 extern bool rs6000_must_pass_in_stack (machine_mode mode
, const_tree type
);
160 extern int rs6000_arg_partial_bytes (cumulative_args_t
,
161 const function_arg_info
&);
162 extern void rs6000_function_arg_advance (cumulative_args_t
,
163 const function_arg_info
&);
164 extern pad_direction
rs6000_function_arg_padding (machine_mode mode
,
166 extern rtx
rs6000_function_arg (cumulative_args_t
, const function_arg_info
&);
167 extern rtx
rs6000_darwin64_record_arg (CUMULATIVE_ARGS
*, const_tree
,
169 extern rtx
rs6000_internal_arg_pointer (void);
171 extern void rs6000_init_builtins (void);
172 extern tree
rs6000_builtin_decl (unsigned code
,
173 bool initialize_p ATTRIBUTE_UNUSED
);
174 extern rtx
rs6000_expand_builtin (tree exp
, rtx target
,
175 rtx subtarget ATTRIBUTE_UNUSED
,
176 machine_mode mode ATTRIBUTE_UNUSED
,
177 int ignore ATTRIBUTE_UNUSED
);
178 extern tree
rs6000_fold_builtin (tree fndecl ATTRIBUTE_UNUSED
,
179 int n_args ATTRIBUTE_UNUSED
,
180 tree
*args ATTRIBUTE_UNUSED
,
181 bool ignore ATTRIBUTE_UNUSED
);
184 extern bool rs6000_passes_ieee128
;
186 extern bool rs6000_passes_float
;
187 extern bool rs6000_passes_long_double
;
188 extern bool rs6000_passes_vector
;
189 extern bool rs6000_returns_struct
;
190 extern bool cpu_builtin_p
;
191 extern GTY(()) tree builtin_mode_to_type
[MAX_MACHINE_MODE
][2];
192 extern GTY(()) tree altivec_builtin_mask_for_load
;