annotate gcc/config/aarch64/aarch64-protos.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Machine description for AArch64 architecture.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2009-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by ARM Ltd.
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it
kono
parents:
diff changeset
8 under the terms of the GNU General Public License as published by
kono
parents:
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
kono
parents:
diff changeset
10 any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but
kono
parents:
diff changeset
13 WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
kono
parents:
diff changeset
15 General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21
kono
parents:
diff changeset
22 #ifndef GCC_AARCH64_PROTOS_H
kono
parents:
diff changeset
23 #define GCC_AARCH64_PROTOS_H
kono
parents:
diff changeset
24
kono
parents:
diff changeset
25 #include "input.h"
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 /* SYMBOL_SMALL_ABSOLUTE: Generate symbol accesses through
kono
parents:
diff changeset
28 high and lo relocs that calculate the base address using a PC
kono
parents:
diff changeset
29 relative reloc.
kono
parents:
diff changeset
30 So to get the address of foo, we generate
kono
parents:
diff changeset
31 adrp x0, foo
kono
parents:
diff changeset
32 add x0, x0, :lo12:foo
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 To load or store something to foo, we could use the corresponding
kono
parents:
diff changeset
35 load store variants that generate an
kono
parents:
diff changeset
36 ldr x0, [x0,:lo12:foo]
kono
parents:
diff changeset
37 or
kono
parents:
diff changeset
38 str x1, [x0, :lo12:foo]
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 This corresponds to the small code model of the compiler.
kono
parents:
diff changeset
41
kono
parents:
diff changeset
42 SYMBOL_SMALL_GOT_4G: Similar to the one above but this
kono
parents:
diff changeset
43 gives us the GOT entry of the symbol being referred to :
kono
parents:
diff changeset
44 Thus calculating the GOT entry for foo is done using the
kono
parents:
diff changeset
45 following sequence of instructions. The ADRP instruction
kono
parents:
diff changeset
46 gets us to the page containing the GOT entry of the symbol
kono
parents:
diff changeset
47 and the got_lo12 gets us the actual offset in it, together
kono
parents:
diff changeset
48 the base and offset, we can address 4G size GOT table.
kono
parents:
diff changeset
49
kono
parents:
diff changeset
50 adrp x0, :got:foo
kono
parents:
diff changeset
51 ldr x0, [x0, :gotoff_lo12:foo]
kono
parents:
diff changeset
52
kono
parents:
diff changeset
53 This corresponds to the small PIC model of the compiler.
kono
parents:
diff changeset
54
kono
parents:
diff changeset
55 SYMBOL_SMALL_GOT_28K: Similar to SYMBOL_SMALL_GOT_4G, but used for symbol
kono
parents:
diff changeset
56 restricted within 28K GOT table size.
kono
parents:
diff changeset
57
kono
parents:
diff changeset
58 ldr reg, [gp, #:gotpage_lo15:sym]
kono
parents:
diff changeset
59
kono
parents:
diff changeset
60 This corresponds to -fpic model for small memory model of the compiler.
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 SYMBOL_SMALL_TLSGD
kono
parents:
diff changeset
63 SYMBOL_SMALL_TLSDESC
kono
parents:
diff changeset
64 SYMBOL_SMALL_TLSIE
kono
parents:
diff changeset
65 SYMBOL_TINY_TLSIE
kono
parents:
diff changeset
66 SYMBOL_TLSLE12
kono
parents:
diff changeset
67 SYMBOL_TLSLE24
kono
parents:
diff changeset
68 SYMBOL_TLSLE32
kono
parents:
diff changeset
69 SYMBOL_TLSLE48
kono
parents:
diff changeset
70 Each of these represents a thread-local symbol, and corresponds to the
kono
parents:
diff changeset
71 thread local storage relocation operator for the symbol being referred to.
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 SYMBOL_TINY_ABSOLUTE
kono
parents:
diff changeset
74
kono
parents:
diff changeset
75 Generate symbol accesses as a PC relative address using a single
kono
parents:
diff changeset
76 instruction. To compute the address of symbol foo, we generate:
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 ADR x0, foo
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 SYMBOL_TINY_GOT
kono
parents:
diff changeset
81
kono
parents:
diff changeset
82 Generate symbol accesses via the GOT using a single PC relative
kono
parents:
diff changeset
83 instruction. To compute the address of symbol foo, we generate:
kono
parents:
diff changeset
84
kono
parents:
diff changeset
85 ldr t0, :got:foo
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 The value of foo can subsequently read using:
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 ldrb t0, [t0]
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 SYMBOL_FORCE_TO_MEM : Global variables are addressed using
kono
parents:
diff changeset
92 constant pool. All variable addresses are spilled into constant
kono
parents:
diff changeset
93 pools. The constant pools themselves are addressed using PC
kono
parents:
diff changeset
94 relative accesses. This only works for the large code model.
kono
parents:
diff changeset
95 */
kono
parents:
diff changeset
96 enum aarch64_symbol_type
kono
parents:
diff changeset
97 {
kono
parents:
diff changeset
98 SYMBOL_SMALL_ABSOLUTE,
kono
parents:
diff changeset
99 SYMBOL_SMALL_GOT_28K,
kono
parents:
diff changeset
100 SYMBOL_SMALL_GOT_4G,
kono
parents:
diff changeset
101 SYMBOL_SMALL_TLSGD,
kono
parents:
diff changeset
102 SYMBOL_SMALL_TLSDESC,
kono
parents:
diff changeset
103 SYMBOL_SMALL_TLSIE,
kono
parents:
diff changeset
104 SYMBOL_TINY_ABSOLUTE,
kono
parents:
diff changeset
105 SYMBOL_TINY_GOT,
kono
parents:
diff changeset
106 SYMBOL_TINY_TLSIE,
kono
parents:
diff changeset
107 SYMBOL_TLSLE12,
kono
parents:
diff changeset
108 SYMBOL_TLSLE24,
kono
parents:
diff changeset
109 SYMBOL_TLSLE32,
kono
parents:
diff changeset
110 SYMBOL_TLSLE48,
kono
parents:
diff changeset
111 SYMBOL_FORCE_TO_MEM
kono
parents:
diff changeset
112 };
kono
parents:
diff changeset
113
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
114 /* Classifies the type of an address query.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
115
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
116 ADDR_QUERY_M
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
117 Query what is valid for an "m" constraint and a memory_operand
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
118 (the rules are the same for both).
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 ADDR_QUERY_LDP_STP
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 Query what is valid for a load/store pair.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 ADDR_QUERY_LDP_STP_N
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 Query what is valid for a load/store pair, but narrow the incoming mode
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 for address checking. This is used for the store_pair_lanes patterns.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 ADDR_QUERY_ANY
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 Query what is valid for at least one memory constraint, which may
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129 allow things that "m" doesn't. For example, the SVE LDR and STR
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
130 addressing modes allow a wider range of immediate offsets than "m"
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
131 does. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
132 enum aarch64_addr_query_type {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
133 ADDR_QUERY_M,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
134 ADDR_QUERY_LDP_STP,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
135 ADDR_QUERY_LDP_STP_N,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
136 ADDR_QUERY_ANY
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
137 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
138
111
kono
parents:
diff changeset
139 /* A set of tuning parameters contains references to size and time
kono
parents:
diff changeset
140 cost models and vectors for address cost calculations, register
kono
parents:
diff changeset
141 move costs and memory move costs. */
kono
parents:
diff changeset
142
kono
parents:
diff changeset
143 /* Scaled addressing modes can vary cost depending on the mode of the
kono
parents:
diff changeset
144 value to be loaded/stored. QImode values cannot use scaled
kono
parents:
diff changeset
145 addressing modes. */
kono
parents:
diff changeset
146
kono
parents:
diff changeset
147 struct scale_addr_mode_cost
kono
parents:
diff changeset
148 {
kono
parents:
diff changeset
149 const int hi;
kono
parents:
diff changeset
150 const int si;
kono
parents:
diff changeset
151 const int di;
kono
parents:
diff changeset
152 const int ti;
kono
parents:
diff changeset
153 };
kono
parents:
diff changeset
154
kono
parents:
diff changeset
155 /* Additional cost for addresses. */
kono
parents:
diff changeset
156 struct cpu_addrcost_table
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 const struct scale_addr_mode_cost addr_scale_costs;
kono
parents:
diff changeset
159 const int pre_modify;
kono
parents:
diff changeset
160 const int post_modify;
kono
parents:
diff changeset
161 const int register_offset;
kono
parents:
diff changeset
162 const int register_sextend;
kono
parents:
diff changeset
163 const int register_zextend;
kono
parents:
diff changeset
164 const int imm_offset;
kono
parents:
diff changeset
165 };
kono
parents:
diff changeset
166
kono
parents:
diff changeset
167 /* Additional costs for register copies. Cost is for one register. */
kono
parents:
diff changeset
168 struct cpu_regmove_cost
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 const int GP2GP;
kono
parents:
diff changeset
171 const int GP2FP;
kono
parents:
diff changeset
172 const int FP2GP;
kono
parents:
diff changeset
173 const int FP2FP;
kono
parents:
diff changeset
174 };
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 /* Cost for vector insn classes. */
kono
parents:
diff changeset
177 struct cpu_vector_cost
kono
parents:
diff changeset
178 {
kono
parents:
diff changeset
179 const int scalar_int_stmt_cost; /* Cost of any int scalar operation,
kono
parents:
diff changeset
180 excluding load and store. */
kono
parents:
diff changeset
181 const int scalar_fp_stmt_cost; /* Cost of any fp scalar operation,
kono
parents:
diff changeset
182 excluding load and store. */
kono
parents:
diff changeset
183 const int scalar_load_cost; /* Cost of scalar load. */
kono
parents:
diff changeset
184 const int scalar_store_cost; /* Cost of scalar store. */
kono
parents:
diff changeset
185 const int vec_int_stmt_cost; /* Cost of any int vector operation,
kono
parents:
diff changeset
186 excluding load, store, permute,
kono
parents:
diff changeset
187 vector-to-scalar and
kono
parents:
diff changeset
188 scalar-to-vector operation. */
kono
parents:
diff changeset
189 const int vec_fp_stmt_cost; /* Cost of any fp vector operation,
kono
parents:
diff changeset
190 excluding load, store, permute,
kono
parents:
diff changeset
191 vector-to-scalar and
kono
parents:
diff changeset
192 scalar-to-vector operation. */
kono
parents:
diff changeset
193 const int vec_permute_cost; /* Cost of permute operation. */
kono
parents:
diff changeset
194 const int vec_to_scalar_cost; /* Cost of vec-to-scalar operation. */
kono
parents:
diff changeset
195 const int scalar_to_vec_cost; /* Cost of scalar-to-vector
kono
parents:
diff changeset
196 operation. */
kono
parents:
diff changeset
197 const int vec_align_load_cost; /* Cost of aligned vector load. */
kono
parents:
diff changeset
198 const int vec_unalign_load_cost; /* Cost of unaligned vector load. */
kono
parents:
diff changeset
199 const int vec_unalign_store_cost; /* Cost of unaligned vector store. */
kono
parents:
diff changeset
200 const int vec_store_cost; /* Cost of vector store. */
kono
parents:
diff changeset
201 const int cond_taken_branch_cost; /* Cost of taken branch. */
kono
parents:
diff changeset
202 const int cond_not_taken_branch_cost; /* Cost of not taken branch. */
kono
parents:
diff changeset
203 };
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 /* Branch costs. */
kono
parents:
diff changeset
206 struct cpu_branch_cost
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 const int predictable; /* Predictable branch or optimizing for size. */
kono
parents:
diff changeset
209 const int unpredictable; /* Unpredictable branch or optimizing for speed. */
kono
parents:
diff changeset
210 };
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 /* Control approximate alternatives to certain FP operators. */
kono
parents:
diff changeset
213 #define AARCH64_APPROX_MODE(MODE) \
kono
parents:
diff changeset
214 ((MIN_MODE_FLOAT <= (MODE) && (MODE) <= MAX_MODE_FLOAT) \
kono
parents:
diff changeset
215 ? (1 << ((MODE) - MIN_MODE_FLOAT)) \
kono
parents:
diff changeset
216 : (MIN_MODE_VECTOR_FLOAT <= (MODE) && (MODE) <= MAX_MODE_VECTOR_FLOAT) \
kono
parents:
diff changeset
217 ? (1 << ((MODE) - MIN_MODE_VECTOR_FLOAT \
kono
parents:
diff changeset
218 + MAX_MODE_FLOAT - MIN_MODE_FLOAT + 1)) \
kono
parents:
diff changeset
219 : (0))
kono
parents:
diff changeset
220 #define AARCH64_APPROX_NONE (0)
kono
parents:
diff changeset
221 #define AARCH64_APPROX_ALL (-1)
kono
parents:
diff changeset
222
kono
parents:
diff changeset
223 /* Allowed modes for approximations. */
kono
parents:
diff changeset
224 struct cpu_approx_modes
kono
parents:
diff changeset
225 {
kono
parents:
diff changeset
226 const unsigned int division; /* Division. */
kono
parents:
diff changeset
227 const unsigned int sqrt; /* Square root. */
kono
parents:
diff changeset
228 const unsigned int recip_sqrt; /* Reciprocal square root. */
kono
parents:
diff changeset
229 };
kono
parents:
diff changeset
230
kono
parents:
diff changeset
231 /* Cache prefetch settings for prefetch-loop-arrays. */
kono
parents:
diff changeset
232 struct cpu_prefetch_tune
kono
parents:
diff changeset
233 {
kono
parents:
diff changeset
234 const int num_slots;
kono
parents:
diff changeset
235 const int l1_cache_size;
kono
parents:
diff changeset
236 const int l1_cache_line_size;
kono
parents:
diff changeset
237 const int l2_cache_size;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
238 /* Whether software prefetch hints should be issued for non-constant
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
239 strides. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
240 const bool prefetch_dynamic_strides;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
241 /* The minimum constant stride beyond which we should use prefetch
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
242 hints for. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
243 const int minimum_stride;
111
kono
parents:
diff changeset
244 const int default_opt_level;
kono
parents:
diff changeset
245 };
kono
parents:
diff changeset
246
kono
parents:
diff changeset
247 struct tune_params
kono
parents:
diff changeset
248 {
kono
parents:
diff changeset
249 const struct cpu_cost_table *insn_extra_cost;
kono
parents:
diff changeset
250 const struct cpu_addrcost_table *addr_cost;
kono
parents:
diff changeset
251 const struct cpu_regmove_cost *regmove_cost;
kono
parents:
diff changeset
252 const struct cpu_vector_cost *vec_costs;
kono
parents:
diff changeset
253 const struct cpu_branch_cost *branch_costs;
kono
parents:
diff changeset
254 const struct cpu_approx_modes *approx_modes;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 /* Width of the SVE registers or SVE_NOT_IMPLEMENTED if not applicable.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
256 Only used for tuning decisions, does not disable VLA
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
257 vectorization. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
258 enum aarch64_sve_vector_bits_enum sve_width;
111
kono
parents:
diff changeset
259 int memmov_cost;
kono
parents:
diff changeset
260 int issue_rate;
kono
parents:
diff changeset
261 unsigned int fusible_ops;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
262 const char *function_align;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
263 const char *jump_align;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
264 const char *loop_align;
111
kono
parents:
diff changeset
265 int int_reassoc_width;
kono
parents:
diff changeset
266 int fp_reassoc_width;
kono
parents:
diff changeset
267 int vec_reassoc_width;
kono
parents:
diff changeset
268 int min_div_recip_mul_sf;
kono
parents:
diff changeset
269 int min_div_recip_mul_df;
kono
parents:
diff changeset
270 /* Value for aarch64_case_values_threshold; or 0 for the default. */
kono
parents:
diff changeset
271 unsigned int max_case_values;
kono
parents:
diff changeset
272 /* An enum specifying how to take into account CPU autoprefetch capabilities
kono
parents:
diff changeset
273 during instruction scheduling:
kono
parents:
diff changeset
274 - AUTOPREFETCHER_OFF: Do not take autoprefetch capabilities into account.
kono
parents:
diff changeset
275 - AUTOPREFETCHER_WEAK: Attempt to sort sequences of loads/store in order of
kono
parents:
diff changeset
276 offsets but allow the pipeline hazard recognizer to alter that order to
kono
parents:
diff changeset
277 maximize multi-issue opportunities.
kono
parents:
diff changeset
278 - AUTOPREFETCHER_STRONG: Attempt to sort sequences of loads/store in order of
kono
parents:
diff changeset
279 offsets and prefer this even if it restricts multi-issue opportunities. */
kono
parents:
diff changeset
280
kono
parents:
diff changeset
281 enum aarch64_autoprefetch_model
kono
parents:
diff changeset
282 {
kono
parents:
diff changeset
283 AUTOPREFETCHER_OFF,
kono
parents:
diff changeset
284 AUTOPREFETCHER_WEAK,
kono
parents:
diff changeset
285 AUTOPREFETCHER_STRONG
kono
parents:
diff changeset
286 } autoprefetcher_model;
kono
parents:
diff changeset
287
kono
parents:
diff changeset
288 unsigned int extra_tuning_flags;
kono
parents:
diff changeset
289
kono
parents:
diff changeset
290 /* Place prefetch struct pointer at the end to enable type checking
kono
parents:
diff changeset
291 errors when tune_params misses elements (e.g., from erroneous merges). */
kono
parents:
diff changeset
292 const struct cpu_prefetch_tune *prefetch;
kono
parents:
diff changeset
293 };
kono
parents:
diff changeset
294
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
295 /* Classifies an address.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
296
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
297 ADDRESS_REG_IMM
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
298 A simple base register plus immediate offset.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
299
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
300 ADDRESS_REG_WB
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
301 A base register indexed by immediate offset with writeback.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
302
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
303 ADDRESS_REG_REG
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
304 A base register indexed by (optionally scaled) register.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
305
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
306 ADDRESS_REG_UXTW
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
307 A base register indexed by (optionally scaled) zero-extended register.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
308
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
309 ADDRESS_REG_SXTW
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
310 A base register indexed by (optionally scaled) sign-extended register.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
311
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
312 ADDRESS_LO_SUM
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
313 A LO_SUM rtx with a base register and "LO12" symbol relocation.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
314
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
315 ADDRESS_SYMBOLIC:
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
316 A constant symbolic address, in pc-relative literal pool. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
317
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
318 enum aarch64_address_type {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
319 ADDRESS_REG_IMM,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
320 ADDRESS_REG_WB,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
321 ADDRESS_REG_REG,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
322 ADDRESS_REG_UXTW,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
323 ADDRESS_REG_SXTW,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
324 ADDRESS_LO_SUM,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
325 ADDRESS_SYMBOLIC
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
326 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
327
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
328 /* Address information. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
329 struct aarch64_address_info {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
330 enum aarch64_address_type type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
331 rtx base;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
332 rtx offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
333 poly_int64 const_offset;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
334 int shift;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
335 enum aarch64_symbol_type symbol_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
336 };
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
337
111
kono
parents:
diff changeset
338 #define AARCH64_FUSION_PAIR(x, name) \
kono
parents:
diff changeset
339 AARCH64_FUSE_##name##_index,
kono
parents:
diff changeset
340 /* Supported fusion operations. */
kono
parents:
diff changeset
341 enum aarch64_fusion_pairs_index
kono
parents:
diff changeset
342 {
kono
parents:
diff changeset
343 #include "aarch64-fusion-pairs.def"
kono
parents:
diff changeset
344 AARCH64_FUSE_index_END
kono
parents:
diff changeset
345 };
kono
parents:
diff changeset
346
kono
parents:
diff changeset
347 #define AARCH64_FUSION_PAIR(x, name) \
kono
parents:
diff changeset
348 AARCH64_FUSE_##name = (1u << AARCH64_FUSE_##name##_index),
kono
parents:
diff changeset
349 /* Supported fusion operations. */
kono
parents:
diff changeset
350 enum aarch64_fusion_pairs
kono
parents:
diff changeset
351 {
kono
parents:
diff changeset
352 AARCH64_FUSE_NOTHING = 0,
kono
parents:
diff changeset
353 #include "aarch64-fusion-pairs.def"
kono
parents:
diff changeset
354 AARCH64_FUSE_ALL = (1u << AARCH64_FUSE_index_END) - 1
kono
parents:
diff changeset
355 };
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 #define AARCH64_EXTRA_TUNING_OPTION(x, name) \
kono
parents:
diff changeset
358 AARCH64_EXTRA_TUNE_##name##_index,
kono
parents:
diff changeset
359 /* Supported tuning flags indexes. */
kono
parents:
diff changeset
360 enum aarch64_extra_tuning_flags_index
kono
parents:
diff changeset
361 {
kono
parents:
diff changeset
362 #include "aarch64-tuning-flags.def"
kono
parents:
diff changeset
363 AARCH64_EXTRA_TUNE_index_END
kono
parents:
diff changeset
364 };
kono
parents:
diff changeset
365
kono
parents:
diff changeset
366
kono
parents:
diff changeset
367 #define AARCH64_EXTRA_TUNING_OPTION(x, name) \
kono
parents:
diff changeset
368 AARCH64_EXTRA_TUNE_##name = (1u << AARCH64_EXTRA_TUNE_##name##_index),
kono
parents:
diff changeset
369 /* Supported tuning flags. */
kono
parents:
diff changeset
370 enum aarch64_extra_tuning_flags
kono
parents:
diff changeset
371 {
kono
parents:
diff changeset
372 AARCH64_EXTRA_TUNE_NONE = 0,
kono
parents:
diff changeset
373 #include "aarch64-tuning-flags.def"
kono
parents:
diff changeset
374 AARCH64_EXTRA_TUNE_ALL = (1u << AARCH64_EXTRA_TUNE_index_END) - 1
kono
parents:
diff changeset
375 };
kono
parents:
diff changeset
376
kono
parents:
diff changeset
377 /* Enum describing the various ways that the
kono
parents:
diff changeset
378 aarch64_parse_{arch,tune,cpu,extension} functions can fail.
kono
parents:
diff changeset
379 This way their callers can choose what kind of error to give. */
kono
parents:
diff changeset
380
kono
parents:
diff changeset
381 enum aarch64_parse_opt_result
kono
parents:
diff changeset
382 {
kono
parents:
diff changeset
383 AARCH64_PARSE_OK, /* Parsing was successful. */
kono
parents:
diff changeset
384 AARCH64_PARSE_MISSING_ARG, /* Missing argument. */
kono
parents:
diff changeset
385 AARCH64_PARSE_INVALID_FEATURE, /* Invalid feature modifier. */
kono
parents:
diff changeset
386 AARCH64_PARSE_INVALID_ARG /* Invalid arch, tune, cpu arg. */
kono
parents:
diff changeset
387 };
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 /* Enum to distinguish which type of check is to be done in
kono
parents:
diff changeset
390 aarch64_simd_valid_immediate. This is used as a bitmask where
kono
parents:
diff changeset
391 AARCH64_CHECK_MOV has both bits set. Thus AARCH64_CHECK_MOV will
kono
parents:
diff changeset
392 perform all checks. Adding new types would require changes accordingly. */
kono
parents:
diff changeset
393 enum simd_immediate_check {
kono
parents:
diff changeset
394 AARCH64_CHECK_ORR = 1 << 0,
kono
parents:
diff changeset
395 AARCH64_CHECK_BIC = 1 << 1,
kono
parents:
diff changeset
396 AARCH64_CHECK_MOV = AARCH64_CHECK_ORR | AARCH64_CHECK_BIC
kono
parents:
diff changeset
397 };
kono
parents:
diff changeset
398
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
399 /* The key type that -msign-return-address should use. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
400 enum aarch64_key_type {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
401 AARCH64_KEY_A,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
402 AARCH64_KEY_B
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
404
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
405 extern enum aarch64_key_type aarch64_ra_sign_key;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406
111
kono
parents:
diff changeset
407 extern struct tune_params aarch64_tune_params;
kono
parents:
diff changeset
408
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 /* The available SVE predicate patterns, known in the ACLE as "svpattern". */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410 #define AARCH64_FOR_SVPATTERN(T) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 T (POW2, pow2, 0) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412 T (VL1, vl1, 1) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413 T (VL2, vl2, 2) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414 T (VL3, vl3, 3) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 T (VL4, vl4, 4) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 T (VL5, vl5, 5) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 T (VL6, vl6, 6) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 T (VL7, vl7, 7) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419 T (VL8, vl8, 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
420 T (VL16, vl16, 9) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421 T (VL32, vl32, 10) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 T (VL64, vl64, 11) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423 T (VL128, vl128, 12) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 T (VL256, vl256, 13) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 T (MUL4, mul4, 29) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 T (MUL3, mul3, 30) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427 T (ALL, all, 31)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
429 /* The available SVE prefetch operations, known in the ACLE as "svprfop". */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 #define AARCH64_FOR_SVPRFOP(T) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431 T (PLDL1KEEP, pldl1keep, 0) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
432 T (PLDL1STRM, pldl1strm, 1) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 T (PLDL2KEEP, pldl2keep, 2) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
434 T (PLDL2STRM, pldl2strm, 3) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 T (PLDL3KEEP, pldl3keep, 4) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
436 T (PLDL3STRM, pldl3strm, 5) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
437 T (PSTL1KEEP, pstl1keep, 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 T (PSTL1STRM, pstl1strm, 9) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 T (PSTL2KEEP, pstl2keep, 10) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
440 T (PSTL2STRM, pstl2strm, 11) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
441 T (PSTL3KEEP, pstl3keep, 12) \
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 T (PSTL3STRM, pstl3strm, 13)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
443
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
444 #define AARCH64_SVENUM(UPPER, LOWER, VALUE) AARCH64_SV_##UPPER = VALUE,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
445 enum aarch64_svpattern {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
446 AARCH64_FOR_SVPATTERN (AARCH64_SVENUM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
447 AARCH64_NUM_SVPATTERNS
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
448 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
449
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
450 enum aarch64_svprfop {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
451 AARCH64_FOR_SVPRFOP (AARCH64_SVENUM)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
452 AARCH64_NUM_SVPRFOPS
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
453 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
454 #undef AARCH64_SVENUM
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
455
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
456 /* It's convenient to divide the built-in function codes into groups,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
457 rather than having everything in a single enum. This type enumerates
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
458 those groups. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
459 enum aarch64_builtin_class
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
460 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
461 AARCH64_BUILTIN_GENERAL,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
462 AARCH64_BUILTIN_SVE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
463 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
464
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
465 /* Built-in function codes are structured so that the low
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
466 AARCH64_BUILTIN_SHIFT bits contain the aarch64_builtin_class
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
467 and the upper bits contain a group-specific subcode. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
468 const unsigned int AARCH64_BUILTIN_SHIFT = 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
469
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
470 /* Mask that selects the aarch64_builtin_class part of a function code. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
471 const unsigned int AARCH64_BUILTIN_CLASS = (1 << AARCH64_BUILTIN_SHIFT) - 1;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
473 void aarch64_post_cfi_startproc (void);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
474 poly_int64 aarch64_initial_elimination_offset (unsigned, unsigned);
111
kono
parents:
diff changeset
475 int aarch64_get_condition_code (rtx);
kono
parents:
diff changeset
476 bool aarch64_address_valid_for_prefetch_p (rtx, bool);
kono
parents:
diff changeset
477 bool aarch64_bitmask_imm (HOST_WIDE_INT val, machine_mode);
kono
parents:
diff changeset
478 unsigned HOST_WIDE_INT aarch64_and_split_imm1 (HOST_WIDE_INT val_in);
kono
parents:
diff changeset
479 unsigned HOST_WIDE_INT aarch64_and_split_imm2 (HOST_WIDE_INT val_in);
kono
parents:
diff changeset
480 bool aarch64_and_bitmask_imm (unsigned HOST_WIDE_INT val_in, machine_mode mode);
kono
parents:
diff changeset
481 int aarch64_branch_cost (bool, bool);
kono
parents:
diff changeset
482 enum aarch64_symbol_type aarch64_classify_symbolic_expression (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
483 opt_machine_mode aarch64_vq_mode (scalar_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
484 opt_machine_mode aarch64_full_sve_mode (scalar_mode);
111
kono
parents:
diff changeset
485 bool aarch64_can_const_movi_rtx_p (rtx x, machine_mode mode);
kono
parents:
diff changeset
486 bool aarch64_const_vec_all_same_int_p (rtx, HOST_WIDE_INT);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
487 bool aarch64_const_vec_all_same_in_range_p (rtx, HOST_WIDE_INT,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
488 HOST_WIDE_INT);
111
kono
parents:
diff changeset
489 bool aarch64_constant_address_p (rtx);
kono
parents:
diff changeset
490 bool aarch64_emit_approx_div (rtx, rtx, rtx);
kono
parents:
diff changeset
491 bool aarch64_emit_approx_sqrt (rtx, rtx, bool);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
492 void aarch64_expand_call (rtx, rtx, rtx, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
493 bool aarch64_expand_cpymem (rtx *);
111
kono
parents:
diff changeset
494 bool aarch64_float_const_zero_rtx_p (rtx);
kono
parents:
diff changeset
495 bool aarch64_float_const_rtx_p (rtx);
kono
parents:
diff changeset
496 bool aarch64_function_arg_regno_p (unsigned);
kono
parents:
diff changeset
497 bool aarch64_fusion_enabled_p (enum aarch64_fusion_pairs);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
498 bool aarch64_gen_cpymemqi (rtx *);
111
kono
parents:
diff changeset
499 bool aarch64_is_extend_from_extract (scalar_int_mode, rtx, rtx);
kono
parents:
diff changeset
500 bool aarch64_is_long_call_p (rtx);
kono
parents:
diff changeset
501 bool aarch64_is_noplt_call_p (rtx);
kono
parents:
diff changeset
502 bool aarch64_label_mentioned_p (rtx);
kono
parents:
diff changeset
503 void aarch64_declare_function_name (FILE *, const char*, tree);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
504 void aarch64_asm_output_alias (FILE *, const tree, const tree);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
505 void aarch64_asm_output_external (FILE *, tree, const char*);
111
kono
parents:
diff changeset
506 bool aarch64_legitimate_pic_operand_p (rtx);
kono
parents:
diff changeset
507 bool aarch64_mask_and_shift_for_ubfiz_p (scalar_int_mode, rtx, rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
508 bool aarch64_masks_and_shift_for_bfi_p (scalar_int_mode, unsigned HOST_WIDE_INT,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
509 unsigned HOST_WIDE_INT,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
510 unsigned HOST_WIDE_INT);
111
kono
parents:
diff changeset
511 bool aarch64_zero_extend_const_eq (machine_mode, rtx, machine_mode, rtx);
kono
parents:
diff changeset
512 bool aarch64_move_imm (HOST_WIDE_INT, machine_mode);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
513 machine_mode aarch64_sve_int_mode (machine_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
514 opt_machine_mode aarch64_sve_pred_mode (unsigned int);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
515 machine_mode aarch64_sve_pred_mode (machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
516 opt_machine_mode aarch64_sve_data_mode (scalar_mode, poly_uint64);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
517 bool aarch64_sve_mode_p (machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
518 HOST_WIDE_INT aarch64_fold_sve_cnt_pat (aarch64_svpattern, unsigned int);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
519 bool aarch64_sve_cnt_immediate_p (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520 bool aarch64_sve_scalar_inc_dec_immediate_p (rtx);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
521 bool aarch64_sve_addvl_addpl_immediate_p (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
522 bool aarch64_sve_vector_inc_dec_immediate_p (rtx);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
523 int aarch64_add_offset_temporaries (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
524 void aarch64_split_add_offset (scalar_int_mode, rtx, rtx, rtx, rtx, rtx);
111
kono
parents:
diff changeset
525 bool aarch64_mov_operand_p (rtx, machine_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
526 rtx aarch64_reverse_mask (machine_mode, unsigned int);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
527 bool aarch64_offset_7bit_signed_scaled_p (machine_mode, poly_int64);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
528 bool aarch64_offset_9bit_signed_unscaled_p (machine_mode, poly_int64);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
529 char *aarch64_output_sve_prefetch (const char *, rtx, const char *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
530 char *aarch64_output_sve_cnt_immediate (const char *, const char *, rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
531 char *aarch64_output_sve_cnt_pat_immediate (const char *, const char *, rtx *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
532 char *aarch64_output_sve_scalar_inc_dec (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
533 char *aarch64_output_sve_addvl_addpl (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
534 char *aarch64_output_sve_vector_inc_dec (const char *, rtx);
111
kono
parents:
diff changeset
535 char *aarch64_output_scalar_simd_mov_immediate (rtx, scalar_int_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
536 char *aarch64_output_simd_mov_immediate (rtx, unsigned,
111
kono
parents:
diff changeset
537 enum simd_immediate_check w = AARCH64_CHECK_MOV);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
538 char *aarch64_output_sve_mov_immediate (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
539 char *aarch64_output_sve_ptrues (rtx);
111
kono
parents:
diff changeset
540 bool aarch64_pad_reg_upward (machine_mode, const_tree, bool);
kono
parents:
diff changeset
541 bool aarch64_regno_ok_for_base_p (int, bool);
kono
parents:
diff changeset
542 bool aarch64_regno_ok_for_index_p (int, bool);
kono
parents:
diff changeset
543 bool aarch64_reinterpret_float_as_int (rtx value, unsigned HOST_WIDE_INT *fail);
kono
parents:
diff changeset
544 bool aarch64_simd_check_vect_par_cnst_half (rtx op, machine_mode mode,
kono
parents:
diff changeset
545 bool high);
kono
parents:
diff changeset
546 bool aarch64_simd_scalar_immediate_valid_for_move (rtx, scalar_int_mode);
kono
parents:
diff changeset
547 bool aarch64_simd_shift_imm_p (rtx, machine_mode, bool);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548 bool aarch64_sve_ptrue_svpattern_p (rtx, struct simd_immediate_info *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
549 bool aarch64_simd_valid_immediate (rtx, struct simd_immediate_info *,
111
kono
parents:
diff changeset
550 enum simd_immediate_check w = AARCH64_CHECK_MOV);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
551 rtx aarch64_check_zero_based_sve_index_immediate (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
552 bool aarch64_sve_index_immediate_p (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 bool aarch64_sve_arith_immediate_p (machine_mode, rtx, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554 bool aarch64_sve_sqadd_sqsub_immediate_p (machine_mode, rtx, bool);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
555 bool aarch64_sve_bitmask_immediate_p (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
556 bool aarch64_sve_dup_immediate_p (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
557 bool aarch64_sve_cmp_immediate_p (rtx, bool);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
558 bool aarch64_sve_float_arith_immediate_p (rtx, bool);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
559 bool aarch64_sve_float_mul_immediate_p (rtx);
111
kono
parents:
diff changeset
560 bool aarch64_split_dimode_const_store (rtx, rtx);
kono
parents:
diff changeset
561 bool aarch64_symbolic_address_p (rtx);
kono
parents:
diff changeset
562 bool aarch64_uimm12_shift (HOST_WIDE_INT);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 int aarch64_movk_shift (const wide_int_ref &, const wide_int_ref &);
111
kono
parents:
diff changeset
564 bool aarch64_use_return_insn_p (void);
kono
parents:
diff changeset
565 const char *aarch64_output_casesi (rtx *);
kono
parents:
diff changeset
566
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 unsigned int aarch64_tlsdesc_abi_id ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
568 enum aarch64_symbol_type aarch64_classify_symbol (rtx, HOST_WIDE_INT);
111
kono
parents:
diff changeset
569 enum aarch64_symbol_type aarch64_classify_tls_symbol (rtx);
kono
parents:
diff changeset
570 enum reg_class aarch64_regno_regclass (unsigned);
kono
parents:
diff changeset
571 int aarch64_asm_preferred_eh_data_format (int, int);
kono
parents:
diff changeset
572 int aarch64_fpconst_pow_of_2 (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 int aarch64_fpconst_pow2_recip (rtx);
111
kono
parents:
diff changeset
574 machine_mode aarch64_hard_regno_caller_save_mode (unsigned, unsigned,
kono
parents:
diff changeset
575 machine_mode);
kono
parents:
diff changeset
576 int aarch64_uxt_size (int, HOST_WIDE_INT);
kono
parents:
diff changeset
577 int aarch64_vec_fpconst_pow_of_2 (rtx);
kono
parents:
diff changeset
578 rtx aarch64_eh_return_handler_rtx (void);
kono
parents:
diff changeset
579 rtx aarch64_mask_from_zextract_ops (rtx, rtx);
kono
parents:
diff changeset
580 const char *aarch64_output_move_struct (rtx *operands);
kono
parents:
diff changeset
581 rtx aarch64_return_addr (int, rtx);
kono
parents:
diff changeset
582 rtx aarch64_simd_gen_const_vector_dup (machine_mode, HOST_WIDE_INT);
kono
parents:
diff changeset
583 bool aarch64_simd_mem_operand_p (rtx);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
584 bool aarch64_sve_ld1r_operand_p (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585 bool aarch64_sve_ld1rq_operand_p (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 bool aarch64_sve_ld1ro_operand_p (rtx, scalar_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587 bool aarch64_sve_ldff1_operand_p (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 bool aarch64_sve_ldnf1_operand_p (rtx);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
589 bool aarch64_sve_ldr_operand_p (rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 bool aarch64_sve_prefetch_operand_p (rtx, machine_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
591 bool aarch64_sve_struct_memory_operand_p (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
592 rtx aarch64_simd_vect_par_cnst_half (machine_mode, int, bool);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 rtx aarch64_gen_stepped_int_parallel (unsigned int, int, int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
594 bool aarch64_stepped_int_parallel_p (rtx, int);
111
kono
parents:
diff changeset
595 rtx aarch64_tls_get_addr (void);
kono
parents:
diff changeset
596 unsigned aarch64_dbx_register_number (unsigned);
kono
parents:
diff changeset
597 unsigned aarch64_trampoline_size (void);
kono
parents:
diff changeset
598 void aarch64_asm_output_labelref (FILE *, const char *);
kono
parents:
diff changeset
599 void aarch64_cpu_cpp_builtins (cpp_reader *);
kono
parents:
diff changeset
600 const char * aarch64_gen_far_branch (rtx *, int, const char *, const char *);
kono
parents:
diff changeset
601 const char * aarch64_output_probe_stack_range (rtx, rtx);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
602 const char * aarch64_output_probe_sve_stack_clash (rtx, rtx, rtx, rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
603 void aarch64_err_no_fpadvsimd (machine_mode);
111
kono
parents:
diff changeset
604 void aarch64_expand_epilogue (bool);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
605 rtx aarch64_ptrue_all (unsigned int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
606 opt_machine_mode aarch64_ptrue_all_mode (rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
607 rtx aarch64_convert_sve_data_to_pred (rtx, machine_mode, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
608 rtx aarch64_expand_sve_dupq (rtx, machine_mode, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 void aarch64_expand_mov_immediate (rtx, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
610 rtx aarch64_ptrue_reg (machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
611 rtx aarch64_pfalse_reg (machine_mode);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
612 bool aarch64_sve_pred_dominates_p (rtx *, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 bool aarch64_sve_same_pred_for_ptest_p (rtx *, rtx *);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
614 void aarch64_emit_sve_pred_move (rtx, rtx, rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
615 void aarch64_expand_sve_mem_move (rtx, rtx, machine_mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
616 bool aarch64_maybe_expand_sve_subreg_move (rtx, rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
617 rtx aarch64_replace_reg_mode (rtx, machine_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
618 void aarch64_split_sve_subreg_move (rtx, rtx, rtx);
111
kono
parents:
diff changeset
619 void aarch64_expand_prologue (void);
kono
parents:
diff changeset
620 void aarch64_expand_vector_init (rtx, rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 void aarch64_sve_expand_vector_init (rtx, rtx);
111
kono
parents:
diff changeset
622 void aarch64_init_cumulative_args (CUMULATIVE_ARGS *, const_tree, rtx,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 const_tree, unsigned, bool = false);
111
kono
parents:
diff changeset
624 void aarch64_init_expanders (void);
kono
parents:
diff changeset
625 void aarch64_init_simd_builtins (void);
kono
parents:
diff changeset
626 void aarch64_emit_call_insn (rtx);
kono
parents:
diff changeset
627 void aarch64_register_pragmas (void);
kono
parents:
diff changeset
628 void aarch64_relayout_simd_types (void);
kono
parents:
diff changeset
629 void aarch64_reset_previous_fndecl (void);
kono
parents:
diff changeset
630 bool aarch64_return_address_signing_enabled (void);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
631 bool aarch64_bti_enabled (void);
111
kono
parents:
diff changeset
632 void aarch64_save_restore_target_globals (tree);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
633 void aarch64_addti_scratch_regs (rtx, rtx, rtx *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
634 rtx *, rtx *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
635 rtx *, rtx *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
636 rtx *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 void aarch64_subvti_scratch_regs (rtx, rtx, rtx *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 rtx *, rtx *,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 rtx *, rtx *, rtx *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
640 void aarch64_expand_subvti (rtx, rtx, rtx,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
641 rtx, rtx, rtx, rtx, bool);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642
111
kono
parents:
diff changeset
643
kono
parents:
diff changeset
644 /* Initialize builtins for SIMD intrinsics. */
kono
parents:
diff changeset
645 void init_aarch64_simd_builtins (void);
kono
parents:
diff changeset
646
kono
parents:
diff changeset
647 void aarch64_simd_emit_reg_reg_move (rtx *, machine_mode, unsigned int);
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 /* Expand builtins for SIMD intrinsics. */
kono
parents:
diff changeset
650 rtx aarch64_simd_expand_builtin (int, tree, rtx);
kono
parents:
diff changeset
651
kono
parents:
diff changeset
652 void aarch64_simd_lane_bounds (rtx, HOST_WIDE_INT, HOST_WIDE_INT, const_tree);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 rtx aarch64_endian_lane_rtx (machine_mode, unsigned int);
111
kono
parents:
diff changeset
654
kono
parents:
diff changeset
655 void aarch64_split_128bit_move (rtx, rtx);
kono
parents:
diff changeset
656
kono
parents:
diff changeset
657 bool aarch64_split_128bit_move_p (rtx, rtx);
kono
parents:
diff changeset
658
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 bool aarch64_mov128_immediate (rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660
111
kono
parents:
diff changeset
661 void aarch64_split_simd_combine (rtx, rtx, rtx);
kono
parents:
diff changeset
662
kono
parents:
diff changeset
663 void aarch64_split_simd_move (rtx, rtx);
kono
parents:
diff changeset
664
kono
parents:
diff changeset
665 /* Check for a legitimate floating point constant for FMOV. */
kono
parents:
diff changeset
666 bool aarch64_float_const_representable_p (rtx);
kono
parents:
diff changeset
667
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
668 extern int aarch64_epilogue_uses (int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
669
111
kono
parents:
diff changeset
670 #if defined (RTX_CODE)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
671 void aarch64_gen_unlikely_cbranch (enum rtx_code, machine_mode cc_mode,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 rtx label_ref);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
673 bool aarch64_legitimate_address_p (machine_mode, rtx, bool,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
674 aarch64_addr_query_type = ADDR_QUERY_M);
111
kono
parents:
diff changeset
675 machine_mode aarch64_select_cc_mode (RTX_CODE, rtx, rtx);
kono
parents:
diff changeset
676 rtx aarch64_gen_compare_reg (RTX_CODE, rtx, rtx);
kono
parents:
diff changeset
677 rtx aarch64_load_tp (rtx);
kono
parents:
diff changeset
678
kono
parents:
diff changeset
679 void aarch64_expand_compare_and_swap (rtx op[]);
kono
parents:
diff changeset
680 void aarch64_split_compare_and_swap (rtx op[]);
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 void aarch64_split_atomic_op (enum rtx_code, rtx, rtx, rtx, rtx, rtx, rtx);
kono
parents:
diff changeset
683
kono
parents:
diff changeset
684 bool aarch64_gen_adjusted_ldpstp (rtx *, bool, scalar_mode, RTX_CODE);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
685
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
686 void aarch64_expand_sve_vec_cmp_int (rtx, rtx_code, rtx, rtx);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
687 bool aarch64_expand_sve_vec_cmp_float (rtx, rtx_code, rtx, rtx, bool);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
688 void aarch64_expand_sve_vcond (machine_mode, machine_mode, rtx *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 bool aarch64_prepare_sve_int_fma (rtx *, rtx_code);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 bool aarch64_prepare_sve_cond_int_fma (rtx *, rtx_code);
111
kono
parents:
diff changeset
692 #endif /* RTX_CODE */
kono
parents:
diff changeset
693
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
694 bool aarch64_process_target_attr (tree);
111
kono
parents:
diff changeset
695 void aarch64_override_options_internal (struct gcc_options *);
kono
parents:
diff changeset
696
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
697 const char *aarch64_general_mangle_builtin_type (const_tree);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
698 void aarch64_general_init_builtins (void);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
699 tree aarch64_general_fold_builtin (unsigned int, tree, unsigned int, tree *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
700 gimple *aarch64_general_gimple_fold_builtin (unsigned int, gcall *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
701 rtx aarch64_general_expand_builtin (unsigned int, tree, rtx, int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
702 tree aarch64_general_builtin_decl (unsigned, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
703 tree aarch64_general_builtin_rsqrt (unsigned int);
111
kono
parents:
diff changeset
704 tree aarch64_builtin_vectorized_function (unsigned int, tree, tree);
kono
parents:
diff changeset
705
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
706 namespace aarch64_sve {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 void init_builtins ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 void handle_arm_sve_h ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
709 tree builtin_decl (unsigned, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
710 bool builtin_type_p (const_tree);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
711 bool builtin_type_p (const_tree, unsigned int *, unsigned int *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 const char *mangle_builtin_type (const_tree);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
713 tree resolve_overloaded_builtin (location_t, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
714 vec<tree, va_gc> *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
715 bool check_builtin_call (location_t, vec<location_t>, unsigned int,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
716 tree, unsigned int, tree *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
717 gimple *gimple_fold_builtin (unsigned int, gimple_stmt_iterator *, gcall *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
718 rtx expand_builtin (unsigned int, tree, rtx);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
719 #ifdef GCC_TARGET_H
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 bool verify_type_context (location_t, type_context_kind, const_tree, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
721 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
722 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
723
111
kono
parents:
diff changeset
724 extern void aarch64_split_combinev16qi (rtx operands[3]);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 extern void aarch64_expand_vec_perm (rtx, rtx, rtx, rtx, unsigned int);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 extern void aarch64_expand_sve_vec_perm (rtx, rtx, rtx, rtx);
111
kono
parents:
diff changeset
727 extern bool aarch64_madd_needs_nop (rtx_insn *);
kono
parents:
diff changeset
728 extern void aarch64_final_prescan_insn (rtx_insn *);
kono
parents:
diff changeset
729 void aarch64_atomic_assign_expand_fenv (tree *, tree *, tree *);
kono
parents:
diff changeset
730 int aarch64_ccmp_mode_to_code (machine_mode mode);
kono
parents:
diff changeset
731
kono
parents:
diff changeset
732 bool extract_base_offset_in_addr (rtx mem, rtx *base, rtx *offset);
kono
parents:
diff changeset
733 bool aarch64_operands_ok_for_ldpstp (rtx *, bool, machine_mode);
kono
parents:
diff changeset
734 bool aarch64_operands_adjust_ok_for_ldpstp (rtx *, bool, scalar_mode);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735 void aarch64_swap_ldrstr_operands (rtx *, bool);
111
kono
parents:
diff changeset
736
kono
parents:
diff changeset
737 extern void aarch64_asm_output_pool_epilogue (FILE *, const char *,
kono
parents:
diff changeset
738 tree, HOST_WIDE_INT);
kono
parents:
diff changeset
739
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 extern bool aarch64_classify_address (struct aarch64_address_info *, rtx,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 machine_mode, bool,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
743 aarch64_addr_query_type = ADDR_QUERY_M);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
744
111
kono
parents:
diff changeset
745 /* Defined in common/config/aarch64-common.c. */
kono
parents:
diff changeset
746 bool aarch64_handle_option (struct gcc_options *, struct gcc_options *,
kono
parents:
diff changeset
747 const struct cl_decoded_option *, location_t);
kono
parents:
diff changeset
748 const char *aarch64_rewrite_selected_cpu (const char *name);
kono
parents:
diff changeset
749 enum aarch64_parse_opt_result aarch64_parse_extension (const char *,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
750 uint64_t *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 std::string *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
752 void aarch64_get_all_extension_candidates (auto_vec<const char *> *candidates);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 std::string aarch64_get_extension_string_for_isa_flags (uint64_t, uint64_t);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
754
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
755 /* Defined in aarch64-d.c */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
756 extern void aarch64_d_target_versions (void);
111
kono
parents:
diff changeset
757
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
758 rtl_opt_pass *make_pass_fma_steering (gcc::context *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
759 rtl_opt_pass *make_pass_track_speculation (gcc::context *);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
760 rtl_opt_pass *make_pass_tag_collision_avoidance (gcc::context *);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 rtl_opt_pass *make_pass_insert_bti (gcc::context *ctxt);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
762
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
763 poly_uint64 aarch64_regmode_natural_size (machine_mode);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
764
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
765 bool aarch64_high_bits_all_ones_p (HOST_WIDE_INT);
111
kono
parents:
diff changeset
766
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 struct atomic_ool_names
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 const char *str[5][4];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772 rtx aarch64_atomic_ool_func(machine_mode mode, rtx model_rtx,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 const atomic_ool_names *names);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 extern const atomic_ool_names aarch64_ool_swp_names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775 extern const atomic_ool_names aarch64_ool_ldadd_names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 extern const atomic_ool_names aarch64_ool_ldset_names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
777 extern const atomic_ool_names aarch64_ool_ldclr_names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
778 extern const atomic_ool_names aarch64_ool_ldeor_names;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
779
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
780 tree aarch64_resolve_overloaded_builtin_general (location_t, tree, void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
781
111
kono
parents:
diff changeset
782 #endif /* GCC_AARCH64_PROTOS_H */