riscv.cc revision 1.1 1 1.1 mrg /* Subroutines used for code generation for RISC-V.
2 1.1 mrg Copyright (C) 2011-2022 Free Software Foundation, Inc.
3 1.1 mrg Contributed by Andrew Waterman (andrew (at) sifive.com).
4 1.1 mrg Based on MIPS target for GNU compiler.
5 1.1 mrg
6 1.1 mrg This file is part of GCC.
7 1.1 mrg
8 1.1 mrg GCC is free software; you can redistribute it and/or modify
9 1.1 mrg it under the terms of the GNU General Public License as published by
10 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
11 1.1 mrg any later version.
12 1.1 mrg
13 1.1 mrg GCC is distributed in the hope that it will be useful,
14 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
15 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 1.1 mrg GNU General Public License for more details.
17 1.1 mrg
18 1.1 mrg You should have received a copy of the GNU General Public License
19 1.1 mrg along with GCC; see the file COPYING3. If not see
20 1.1 mrg <http://www.gnu.org/licenses/>. */
21 1.1 mrg
22 1.1 mrg #define IN_TARGET_CODE 1
23 1.1 mrg
24 1.1 mrg #define INCLUDE_STRING
25 1.1 mrg #include "config.h"
26 1.1 mrg #include "system.h"
27 1.1 mrg #include "coretypes.h"
28 1.1 mrg #include "tm.h"
29 1.1 mrg #include "rtl.h"
30 1.1 mrg #include "regs.h"
31 1.1 mrg #include "insn-config.h"
32 1.1 mrg #include "insn-attr.h"
33 1.1 mrg #include "recog.h"
34 1.1 mrg #include "output.h"
35 1.1 mrg #include "alias.h"
36 1.1 mrg #include "tree.h"
37 1.1 mrg #include "stringpool.h"
38 1.1 mrg #include "attribs.h"
39 1.1 mrg #include "varasm.h"
40 1.1 mrg #include "stor-layout.h"
41 1.1 mrg #include "calls.h"
42 1.1 mrg #include "function.h"
43 1.1 mrg #include "explow.h"
44 1.1 mrg #include "memmodel.h"
45 1.1 mrg #include "emit-rtl.h"
46 1.1 mrg #include "reload.h"
47 1.1 mrg #include "tm_p.h"
48 1.1 mrg #include "target.h"
49 1.1 mrg #include "target-def.h"
50 1.1 mrg #include "basic-block.h"
51 1.1 mrg #include "expr.h"
52 1.1 mrg #include "optabs.h"
53 1.1 mrg #include "bitmap.h"
54 1.1 mrg #include "df.h"
55 1.1 mrg #include "diagnostic.h"
56 1.1 mrg #include "builtins.h"
57 1.1 mrg #include "predict.h"
58 1.1 mrg #include "tree-pass.h"
59 1.1 mrg #include "opts.h"
60 1.1 mrg
61 1.1 mrg /* True if X is an UNSPEC wrapper around a SYMBOL_REF or LABEL_REF. */
62 1.1 mrg #define UNSPEC_ADDRESS_P(X) \
63 1.1 mrg (GET_CODE (X) == UNSPEC \
64 1.1 mrg && XINT (X, 1) >= UNSPEC_ADDRESS_FIRST \
65 1.1 mrg && XINT (X, 1) < UNSPEC_ADDRESS_FIRST + NUM_SYMBOL_TYPES)
66 1.1 mrg
67 1.1 mrg /* Extract the symbol or label from UNSPEC wrapper X. */
68 1.1 mrg #define UNSPEC_ADDRESS(X) \
69 1.1 mrg XVECEXP (X, 0, 0)
70 1.1 mrg
71 1.1 mrg /* Extract the symbol type from UNSPEC wrapper X. */
72 1.1 mrg #define UNSPEC_ADDRESS_TYPE(X) \
73 1.1 mrg ((enum riscv_symbol_type) (XINT (X, 1) - UNSPEC_ADDRESS_FIRST))
74 1.1 mrg
75 1.1 mrg /* True if bit BIT is set in VALUE. */
76 1.1 mrg #define BITSET_P(VALUE, BIT) (((VALUE) & (1ULL << (BIT))) != 0)
77 1.1 mrg
78 1.1 mrg /* Classifies an address.
79 1.1 mrg
80 1.1 mrg ADDRESS_REG
81 1.1 mrg A natural register + offset address. The register satisfies
82 1.1 mrg riscv_valid_base_register_p and the offset is a const_arith_operand.
83 1.1 mrg
84 1.1 mrg ADDRESS_LO_SUM
85 1.1 mrg A LO_SUM rtx. The first operand is a valid base register and
86 1.1 mrg the second operand is a symbolic address.
87 1.1 mrg
88 1.1 mrg ADDRESS_CONST_INT
89 1.1 mrg A signed 16-bit constant address.
90 1.1 mrg
91 1.1 mrg ADDRESS_SYMBOLIC:
92 1.1 mrg A constant symbolic address. */
93 1.1 mrg enum riscv_address_type {
94 1.1 mrg ADDRESS_REG,
95 1.1 mrg ADDRESS_LO_SUM,
96 1.1 mrg ADDRESS_CONST_INT,
97 1.1 mrg ADDRESS_SYMBOLIC
98 1.1 mrg };
99 1.1 mrg
100 1.1 mrg /* Information about a function's frame layout. */
101 1.1 mrg struct GTY(()) riscv_frame_info {
102 1.1 mrg /* The size of the frame in bytes. */
103 1.1 mrg HOST_WIDE_INT total_size;
104 1.1 mrg
105 1.1 mrg /* Bit X is set if the function saves or restores GPR X. */
106 1.1 mrg unsigned int mask;
107 1.1 mrg
108 1.1 mrg /* Likewise FPR X. */
109 1.1 mrg unsigned int fmask;
110 1.1 mrg
111 1.1 mrg /* How much the GPR save/restore routines adjust sp (or 0 if unused). */
112 1.1 mrg unsigned save_libcall_adjustment;
113 1.1 mrg
114 1.1 mrg /* Offsets of fixed-point and floating-point save areas from frame bottom */
115 1.1 mrg HOST_WIDE_INT gp_sp_offset;
116 1.1 mrg HOST_WIDE_INT fp_sp_offset;
117 1.1 mrg
118 1.1 mrg /* Offset of virtual frame pointer from stack pointer/frame bottom */
119 1.1 mrg HOST_WIDE_INT frame_pointer_offset;
120 1.1 mrg
121 1.1 mrg /* Offset of hard frame pointer from stack pointer/frame bottom */
122 1.1 mrg HOST_WIDE_INT hard_frame_pointer_offset;
123 1.1 mrg
124 1.1 mrg /* The offset of arg_pointer_rtx from the bottom of the frame. */
125 1.1 mrg HOST_WIDE_INT arg_pointer_offset;
126 1.1 mrg };
127 1.1 mrg
128 1.1 mrg enum riscv_privilege_levels {
129 1.1 mrg UNKNOWN_MODE, USER_MODE, SUPERVISOR_MODE, MACHINE_MODE
130 1.1 mrg };
131 1.1 mrg
132 1.1 mrg struct GTY(()) machine_function {
133 1.1 mrg /* The number of extra stack bytes taken up by register varargs.
134 1.1 mrg This area is allocated by the callee at the very top of the frame. */
135 1.1 mrg int varargs_size;
136 1.1 mrg
137 1.1 mrg /* True if current function is a naked function. */
138 1.1 mrg bool naked_p;
139 1.1 mrg
140 1.1 mrg /* True if current function is an interrupt function. */
141 1.1 mrg bool interrupt_handler_p;
142 1.1 mrg /* For an interrupt handler, indicates the privilege level. */
143 1.1 mrg enum riscv_privilege_levels interrupt_mode;
144 1.1 mrg
145 1.1 mrg /* True if attributes on current function have been checked. */
146 1.1 mrg bool attributes_checked_p;
147 1.1 mrg
148 1.1 mrg /* The current frame information, calculated by riscv_compute_frame_info. */
149 1.1 mrg struct riscv_frame_info frame;
150 1.1 mrg };
151 1.1 mrg
152 1.1 mrg /* Information about a single argument. */
153 1.1 mrg struct riscv_arg_info {
154 1.1 mrg /* True if the argument is at least partially passed on the stack. */
155 1.1 mrg bool stack_p;
156 1.1 mrg
157 1.1 mrg /* The number of integer registers allocated to this argument. */
158 1.1 mrg unsigned int num_gprs;
159 1.1 mrg
160 1.1 mrg /* The offset of the first register used, provided num_gprs is nonzero.
161 1.1 mrg If passed entirely on the stack, the value is MAX_ARGS_IN_REGISTERS. */
162 1.1 mrg unsigned int gpr_offset;
163 1.1 mrg
164 1.1 mrg /* The number of floating-point registers allocated to this argument. */
165 1.1 mrg unsigned int num_fprs;
166 1.1 mrg
167 1.1 mrg /* The offset of the first register used, provided num_fprs is nonzero. */
168 1.1 mrg unsigned int fpr_offset;
169 1.1 mrg };
170 1.1 mrg
171 1.1 mrg /* Information about an address described by riscv_address_type.
172 1.1 mrg
173 1.1 mrg ADDRESS_CONST_INT
174 1.1 mrg No fields are used.
175 1.1 mrg
176 1.1 mrg ADDRESS_REG
177 1.1 mrg REG is the base register and OFFSET is the constant offset.
178 1.1 mrg
179 1.1 mrg ADDRESS_LO_SUM
180 1.1 mrg REG and OFFSET are the operands to the LO_SUM and SYMBOL_TYPE
181 1.1 mrg is the type of symbol it references.
182 1.1 mrg
183 1.1 mrg ADDRESS_SYMBOLIC
184 1.1 mrg SYMBOL_TYPE is the type of symbol that the address references. */
185 1.1 mrg struct riscv_address_info {
186 1.1 mrg enum riscv_address_type type;
187 1.1 mrg rtx reg;
188 1.1 mrg rtx offset;
189 1.1 mrg enum riscv_symbol_type symbol_type;
190 1.1 mrg };
191 1.1 mrg
192 1.1 mrg /* One stage in a constant building sequence. These sequences have
193 1.1 mrg the form:
194 1.1 mrg
195 1.1 mrg A = VALUE[0]
196 1.1 mrg A = A CODE[1] VALUE[1]
197 1.1 mrg A = A CODE[2] VALUE[2]
198 1.1 mrg ...
199 1.1 mrg
200 1.1 mrg where A is an accumulator, each CODE[i] is a binary rtl operation
201 1.1 mrg and each VALUE[i] is a constant integer. CODE[0] is undefined. */
202 1.1 mrg struct riscv_integer_op {
203 1.1 mrg enum rtx_code code;
204 1.1 mrg unsigned HOST_WIDE_INT value;
205 1.1 mrg };
206 1.1 mrg
207 1.1 mrg /* The largest number of operations needed to load an integer constant.
208 1.1 mrg The worst case is LUI, ADDI, SLLI, ADDI, SLLI, ADDI, SLLI, ADDI. */
209 1.1 mrg #define RISCV_MAX_INTEGER_OPS 8
210 1.1 mrg
211 1.1 mrg /* Costs of various operations on the different architectures. */
212 1.1 mrg
213 1.1 mrg struct riscv_tune_param
214 1.1 mrg {
215 1.1 mrg unsigned short fp_add[2];
216 1.1 mrg unsigned short fp_mul[2];
217 1.1 mrg unsigned short fp_div[2];
218 1.1 mrg unsigned short int_mul[2];
219 1.1 mrg unsigned short int_div[2];
220 1.1 mrg unsigned short issue_rate;
221 1.1 mrg unsigned short branch_cost;
222 1.1 mrg unsigned short memory_cost;
223 1.1 mrg unsigned short fmv_cost;
224 1.1 mrg bool slow_unaligned_access;
225 1.1 mrg };
226 1.1 mrg
227 1.1 mrg /* Information about one micro-arch we know about. */
228 1.1 mrg struct riscv_tune_info {
229 1.1 mrg /* This micro-arch canonical name. */
230 1.1 mrg const char *name;
231 1.1 mrg
232 1.1 mrg /* Which automaton to use for tuning. */
233 1.1 mrg enum riscv_microarchitecture_type microarchitecture;
234 1.1 mrg
235 1.1 mrg /* Tuning parameters for this micro-arch. */
236 1.1 mrg const struct riscv_tune_param *tune_param;
237 1.1 mrg };
238 1.1 mrg
239 1.1 mrg /* Global variables for machine-dependent things. */
240 1.1 mrg
241 1.1 mrg /* Whether unaligned accesses execute very slowly. */
242 1.1 mrg bool riscv_slow_unaligned_access_p;
243 1.1 mrg
244 1.1 mrg /* Stack alignment to assume/maintain. */
245 1.1 mrg unsigned riscv_stack_boundary;
246 1.1 mrg
247 1.1 mrg /* If non-zero, this is an offset to be added to SP to redefine the CFA
248 1.1 mrg when restoring the FP register from the stack. Only valid when generating
249 1.1 mrg the epilogue. */
250 1.1 mrg static int epilogue_cfa_sp_offset;
251 1.1 mrg
252 1.1 mrg /* Which tuning parameters to use. */
253 1.1 mrg static const struct riscv_tune_param *tune_param;
254 1.1 mrg
255 1.1 mrg /* Which automaton to use for tuning. */
256 1.1 mrg enum riscv_microarchitecture_type riscv_microarchitecture;
257 1.1 mrg
258 1.1 mrg /* Index R is the smallest register class that contains register R. */
259 1.1 mrg const enum reg_class riscv_regno_to_class[FIRST_PSEUDO_REGISTER] = {
260 1.1 mrg GR_REGS, GR_REGS, GR_REGS, GR_REGS,
261 1.1 mrg GR_REGS, GR_REGS, SIBCALL_REGS, SIBCALL_REGS,
262 1.1 mrg JALR_REGS, JALR_REGS, SIBCALL_REGS, SIBCALL_REGS,
263 1.1 mrg SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS,
264 1.1 mrg SIBCALL_REGS, SIBCALL_REGS, JALR_REGS, JALR_REGS,
265 1.1 mrg JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
266 1.1 mrg JALR_REGS, JALR_REGS, JALR_REGS, JALR_REGS,
267 1.1 mrg SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS, SIBCALL_REGS,
268 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
269 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
270 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
271 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
272 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
273 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
274 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
275 1.1 mrg FP_REGS, FP_REGS, FP_REGS, FP_REGS,
276 1.1 mrg FRAME_REGS, FRAME_REGS,
277 1.1 mrg };
278 1.1 mrg
279 1.1 mrg /* Costs to use when optimizing for rocket. */
280 1.1 mrg static const struct riscv_tune_param rocket_tune_info = {
281 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */
282 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */
283 1.1 mrg {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */
284 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */
285 1.1 mrg {COSTS_N_INSNS (6), COSTS_N_INSNS (6)}, /* int_div */
286 1.1 mrg 1, /* issue_rate */
287 1.1 mrg 3, /* branch_cost */
288 1.1 mrg 5, /* memory_cost */
289 1.1 mrg 8, /* fmv_cost */
290 1.1 mrg true, /* slow_unaligned_access */
291 1.1 mrg };
292 1.1 mrg
293 1.1 mrg /* Costs to use when optimizing for Sifive 7 Series. */
294 1.1 mrg static const struct riscv_tune_param sifive_7_tune_info = {
295 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */
296 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */
297 1.1 mrg {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */
298 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */
299 1.1 mrg {COSTS_N_INSNS (6), COSTS_N_INSNS (6)}, /* int_div */
300 1.1 mrg 2, /* issue_rate */
301 1.1 mrg 4, /* branch_cost */
302 1.1 mrg 3, /* memory_cost */
303 1.1 mrg 8, /* fmv_cost */
304 1.1 mrg true, /* slow_unaligned_access */
305 1.1 mrg };
306 1.1 mrg
307 1.1 mrg /* Costs to use when optimizing for T-HEAD c906. */
308 1.1 mrg static const struct riscv_tune_param thead_c906_tune_info = {
309 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_add */
310 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (5)}, /* fp_mul */
311 1.1 mrg {COSTS_N_INSNS (20), COSTS_N_INSNS (20)}, /* fp_div */
312 1.1 mrg {COSTS_N_INSNS (4), COSTS_N_INSNS (4)}, /* int_mul */
313 1.1 mrg {COSTS_N_INSNS (6), COSTS_N_INSNS (6)}, /* int_div */
314 1.1 mrg 1, /* issue_rate */
315 1.1 mrg 3, /* branch_cost */
316 1.1 mrg 5, /* memory_cost */
317 1.1 mrg 8, /* fmv_cost */
318 1.1 mrg false, /* slow_unaligned_access */
319 1.1 mrg };
320 1.1 mrg
321 1.1 mrg /* Costs to use when optimizing for size. */
322 1.1 mrg static const struct riscv_tune_param optimize_size_tune_info = {
323 1.1 mrg {COSTS_N_INSNS (1), COSTS_N_INSNS (1)}, /* fp_add */
324 1.1 mrg {COSTS_N_INSNS (1), COSTS_N_INSNS (1)}, /* fp_mul */
325 1.1 mrg {COSTS_N_INSNS (1), COSTS_N_INSNS (1)}, /* fp_div */
326 1.1 mrg {COSTS_N_INSNS (1), COSTS_N_INSNS (1)}, /* int_mul */
327 1.1 mrg {COSTS_N_INSNS (1), COSTS_N_INSNS (1)}, /* int_div */
328 1.1 mrg 1, /* issue_rate */
329 1.1 mrg 1, /* branch_cost */
330 1.1 mrg 2, /* memory_cost */
331 1.1 mrg 8, /* fmv_cost */
332 1.1 mrg false, /* slow_unaligned_access */
333 1.1 mrg };
334 1.1 mrg
335 1.1 mrg static tree riscv_handle_fndecl_attribute (tree *, tree, tree, int, bool *);
336 1.1 mrg static tree riscv_handle_type_attribute (tree *, tree, tree, int, bool *);
337 1.1 mrg
338 1.1 mrg /* Defining target-specific uses of __attribute__. */
339 1.1 mrg static const struct attribute_spec riscv_attribute_table[] =
340 1.1 mrg {
341 1.1 mrg /* Syntax: { name, min_len, max_len, decl_required, type_required,
342 1.1 mrg function_type_required, affects_type_identity, handler,
343 1.1 mrg exclude } */
344 1.1 mrg
345 1.1 mrg /* The attribute telling no prologue/epilogue. */
346 1.1 mrg { "naked", 0, 0, true, false, false, false,
347 1.1 mrg riscv_handle_fndecl_attribute, NULL },
348 1.1 mrg /* This attribute generates prologue/epilogue for interrupt handlers. */
349 1.1 mrg { "interrupt", 0, 1, false, true, true, false,
350 1.1 mrg riscv_handle_type_attribute, NULL },
351 1.1 mrg
352 1.1 mrg /* The last attribute spec is set to be NULL. */
353 1.1 mrg { NULL, 0, 0, false, false, false, false, NULL, NULL }
354 1.1 mrg };
355 1.1 mrg
356 1.1 mrg /* Order for the CLOBBERs/USEs of gpr_save. */
357 1.1 mrg static const unsigned gpr_save_reg_order[] = {
358 1.1 mrg INVALID_REGNUM, T0_REGNUM, T1_REGNUM, RETURN_ADDR_REGNUM,
359 1.1 mrg S0_REGNUM, S1_REGNUM, S2_REGNUM, S3_REGNUM, S4_REGNUM,
360 1.1 mrg S5_REGNUM, S6_REGNUM, S7_REGNUM, S8_REGNUM, S9_REGNUM,
361 1.1 mrg S10_REGNUM, S11_REGNUM
362 1.1 mrg };
363 1.1 mrg
364 1.1 mrg /* A table describing all the processors GCC knows about. */
365 1.1 mrg static const struct riscv_tune_info riscv_tune_info_table[] = {
366 1.1 mrg { "rocket", generic, &rocket_tune_info },
367 1.1 mrg { "sifive-3-series", generic, &rocket_tune_info },
368 1.1 mrg { "sifive-5-series", generic, &rocket_tune_info },
369 1.1 mrg { "sifive-7-series", sifive_7, &sifive_7_tune_info },
370 1.1 mrg { "thead-c906", generic, &thead_c906_tune_info },
371 1.1 mrg { "size", generic, &optimize_size_tune_info },
372 1.1 mrg };
373 1.1 mrg
374 1.1 mrg /* Implement TARGET_MIN_ARITHMETIC_PRECISION. */
375 1.1 mrg
376 1.1 mrg static unsigned int
377 1.1 mrg riscv_min_arithmetic_precision (void)
378 1.1 mrg {
379 1.1 mrg return 32;
380 1.1 mrg }
381 1.1 mrg
382 1.1 mrg /* Return the riscv_tune_info entry for the given name string. */
383 1.1 mrg
384 1.1 mrg static const struct riscv_tune_info *
385 1.1 mrg riscv_parse_tune (const char *tune_string)
386 1.1 mrg {
387 1.1 mrg const riscv_cpu_info *cpu = riscv_find_cpu (tune_string);
388 1.1 mrg
389 1.1 mrg if (cpu)
390 1.1 mrg tune_string = cpu->tune;
391 1.1 mrg
392 1.1 mrg for (unsigned i = 0; i < ARRAY_SIZE (riscv_tune_info_table); i++)
393 1.1 mrg if (strcmp (riscv_tune_info_table[i].name, tune_string) == 0)
394 1.1 mrg return riscv_tune_info_table + i;
395 1.1 mrg
396 1.1 mrg error ("unknown cpu %qs for %<-mtune%>", tune_string);
397 1.1 mrg return riscv_tune_info_table;
398 1.1 mrg }
399 1.1 mrg
400 1.1 mrg /* Helper function for riscv_build_integer; arguments are as for
401 1.1 mrg riscv_build_integer. */
402 1.1 mrg
403 1.1 mrg static int
404 1.1 mrg riscv_build_integer_1 (struct riscv_integer_op codes[RISCV_MAX_INTEGER_OPS],
405 1.1 mrg HOST_WIDE_INT value, machine_mode mode)
406 1.1 mrg {
407 1.1 mrg HOST_WIDE_INT low_part = CONST_LOW_PART (value);
408 1.1 mrg int cost = RISCV_MAX_INTEGER_OPS + 1, alt_cost;
409 1.1 mrg struct riscv_integer_op alt_codes[RISCV_MAX_INTEGER_OPS];
410 1.1 mrg
411 1.1 mrg if (SMALL_OPERAND (value) || LUI_OPERAND (value))
412 1.1 mrg {
413 1.1 mrg /* Simply ADDI or LUI. */
414 1.1 mrg codes[0].code = UNKNOWN;
415 1.1 mrg codes[0].value = value;
416 1.1 mrg return 1;
417 1.1 mrg }
418 1.1 mrg if (TARGET_ZBS && SINGLE_BIT_MASK_OPERAND (value))
419 1.1 mrg {
420 1.1 mrg /* Simply BSETI. */
421 1.1 mrg codes[0].code = UNKNOWN;
422 1.1 mrg codes[0].value = value;
423 1.1 mrg
424 1.1 mrg /* RISC-V sign-extends all 32bit values that live in a 32bit
425 1.1 mrg register. To avoid paradoxes, we thus need to use the
426 1.1 mrg sign-extended (negative) representation (-1 << 31) for the
427 1.1 mrg value, if we want to build (1 << 31) in SImode. This will
428 1.1 mrg then expand to an LUI instruction. */
429 1.1 mrg if (mode == SImode && value == (HOST_WIDE_INT_1U << 31))
430 1.1 mrg codes[0].value = (HOST_WIDE_INT_M1U << 31);
431 1.1 mrg
432 1.1 mrg return 1;
433 1.1 mrg }
434 1.1 mrg
435 1.1 mrg /* End with ADDI. When constructing HImode constants, do not generate any
436 1.1 mrg intermediate value that is not itself a valid HImode constant. The
437 1.1 mrg XORI case below will handle those remaining HImode constants. */
438 1.1 mrg if (low_part != 0
439 1.1 mrg && (mode != HImode
440 1.1 mrg || value - low_part <= ((1 << (GET_MODE_BITSIZE (HImode) - 1)) - 1)))
441 1.1 mrg {
442 1.1 mrg alt_cost = 1 + riscv_build_integer_1 (alt_codes, value - low_part, mode);
443 1.1 mrg if (alt_cost < cost)
444 1.1 mrg {
445 1.1 mrg alt_codes[alt_cost-1].code = PLUS;
446 1.1 mrg alt_codes[alt_cost-1].value = low_part;
447 1.1 mrg memcpy (codes, alt_codes, sizeof (alt_codes));
448 1.1 mrg cost = alt_cost;
449 1.1 mrg }
450 1.1 mrg }
451 1.1 mrg
452 1.1 mrg /* End with XORI. */
453 1.1 mrg if (cost > 2 && (low_part < 0 || mode == HImode))
454 1.1 mrg {
455 1.1 mrg alt_cost = 1 + riscv_build_integer_1 (alt_codes, value ^ low_part, mode);
456 1.1 mrg if (alt_cost < cost)
457 1.1 mrg {
458 1.1 mrg alt_codes[alt_cost-1].code = XOR;
459 1.1 mrg alt_codes[alt_cost-1].value = low_part;
460 1.1 mrg memcpy (codes, alt_codes, sizeof (alt_codes));
461 1.1 mrg cost = alt_cost;
462 1.1 mrg }
463 1.1 mrg }
464 1.1 mrg
465 1.1 mrg /* Eliminate trailing zeros and end with SLLI. */
466 1.1 mrg if (cost > 2 && (value & 1) == 0)
467 1.1 mrg {
468 1.1 mrg int shift = ctz_hwi (value);
469 1.1 mrg unsigned HOST_WIDE_INT x = value;
470 1.1 mrg x = sext_hwi (x >> shift, HOST_BITS_PER_WIDE_INT - shift);
471 1.1 mrg
472 1.1 mrg /* Don't eliminate the lower 12 bits if LUI might apply. */
473 1.1 mrg if (shift > IMM_BITS && !SMALL_OPERAND (x) && LUI_OPERAND (x << IMM_BITS))
474 1.1 mrg shift -= IMM_BITS, x <<= IMM_BITS;
475 1.1 mrg
476 1.1 mrg alt_cost = 1 + riscv_build_integer_1 (alt_codes, x, mode);
477 1.1 mrg if (alt_cost < cost)
478 1.1 mrg {
479 1.1 mrg alt_codes[alt_cost-1].code = ASHIFT;
480 1.1 mrg alt_codes[alt_cost-1].value = shift;
481 1.1 mrg memcpy (codes, alt_codes, sizeof (alt_codes));
482 1.1 mrg cost = alt_cost;
483 1.1 mrg }
484 1.1 mrg }
485 1.1 mrg
486 1.1 mrg if (cost > 2 && TARGET_64BIT && TARGET_ZBB)
487 1.1 mrg {
488 1.1 mrg int leading_ones = clz_hwi (~value);
489 1.1 mrg int trailing_ones = ctz_hwi (~value);
490 1.1 mrg
491 1.1 mrg /* If all bits are one except a few that are zero, and the zero bits
492 1.1 mrg are within a range of 11 bits, and at least one of the upper 32-bits
493 1.1 mrg is a zero, then we can generate a constant by loading a small
494 1.1 mrg negative constant and rotating. */
495 1.1 mrg if (leading_ones < 32
496 1.1 mrg && ((64 - leading_ones - trailing_ones) < 12))
497 1.1 mrg {
498 1.1 mrg codes[0].code = UNKNOWN;
499 1.1 mrg /* The sign-bit might be zero, so just rotate to be safe. */
500 1.1 mrg codes[0].value = (((unsigned HOST_WIDE_INT) value >> trailing_ones)
501 1.1 mrg | (value << (64 - trailing_ones)));
502 1.1 mrg codes[1].code = ROTATERT;
503 1.1 mrg codes[1].value = 64 - trailing_ones;
504 1.1 mrg cost = 2;
505 1.1 mrg }
506 1.1 mrg /* Handle the case where the 11 bit range of zero bits wraps around. */
507 1.1 mrg else
508 1.1 mrg {
509 1.1 mrg int upper_trailing_ones = ctz_hwi (~value >> 32);
510 1.1 mrg int lower_leading_ones = clz_hwi (~value << 32);
511 1.1 mrg
512 1.1 mrg if (upper_trailing_ones < 32 && lower_leading_ones < 32
513 1.1 mrg && ((64 - upper_trailing_ones - lower_leading_ones) < 12))
514 1.1 mrg {
515 1.1 mrg codes[0].code = UNKNOWN;
516 1.1 mrg /* The sign-bit might be zero, so just rotate to be safe. */
517 1.1 mrg codes[0].value = ((value << (32 - upper_trailing_ones))
518 1.1 mrg | ((unsigned HOST_WIDE_INT) value
519 1.1 mrg >> (32 + upper_trailing_ones)));
520 1.1 mrg codes[1].code = ROTATERT;
521 1.1 mrg codes[1].value = 32 - upper_trailing_ones;
522 1.1 mrg cost = 2;
523 1.1 mrg }
524 1.1 mrg }
525 1.1 mrg }
526 1.1 mrg
527 1.1 mrg gcc_assert (cost <= RISCV_MAX_INTEGER_OPS);
528 1.1 mrg return cost;
529 1.1 mrg }
530 1.1 mrg
531 1.1 mrg /* Fill CODES with a sequence of rtl operations to load VALUE.
532 1.1 mrg Return the number of operations needed. */
533 1.1 mrg
534 1.1 mrg static int
535 1.1 mrg riscv_build_integer (struct riscv_integer_op *codes, HOST_WIDE_INT value,
536 1.1 mrg machine_mode mode)
537 1.1 mrg {
538 1.1 mrg int cost = riscv_build_integer_1 (codes, value, mode);
539 1.1 mrg
540 1.1 mrg /* Eliminate leading zeros and end with SRLI. */
541 1.1 mrg if (value > 0 && cost > 2)
542 1.1 mrg {
543 1.1 mrg struct riscv_integer_op alt_codes[RISCV_MAX_INTEGER_OPS];
544 1.1 mrg int alt_cost, shift = clz_hwi (value);
545 1.1 mrg HOST_WIDE_INT shifted_val;
546 1.1 mrg
547 1.1 mrg /* Try filling trailing bits with 1s. */
548 1.1 mrg shifted_val = (value << shift) | ((((HOST_WIDE_INT) 1) << shift) - 1);
549 1.1 mrg alt_cost = 1 + riscv_build_integer_1 (alt_codes, shifted_val, mode);
550 1.1 mrg if (alt_cost < cost)
551 1.1 mrg {
552 1.1 mrg alt_codes[alt_cost-1].code = LSHIFTRT;
553 1.1 mrg alt_codes[alt_cost-1].value = shift;
554 1.1 mrg memcpy (codes, alt_codes, sizeof (alt_codes));
555 1.1 mrg cost = alt_cost;
556 1.1 mrg }
557 1.1 mrg
558 1.1 mrg /* Try filling trailing bits with 0s. */
559 1.1 mrg shifted_val = value << shift;
560 1.1 mrg alt_cost = 1 + riscv_build_integer_1 (alt_codes, shifted_val, mode);
561 1.1 mrg if (alt_cost < cost)
562 1.1 mrg {
563 1.1 mrg alt_codes[alt_cost-1].code = LSHIFTRT;
564 1.1 mrg alt_codes[alt_cost-1].value = shift;
565 1.1 mrg memcpy (codes, alt_codes, sizeof (alt_codes));
566 1.1 mrg cost = alt_cost;
567 1.1 mrg }
568 1.1 mrg }
569 1.1 mrg
570 1.1 mrg return cost;
571 1.1 mrg }
572 1.1 mrg
573 1.1 mrg /* Return the cost of constructing VAL in the event that a scratch
574 1.1 mrg register is available. */
575 1.1 mrg
576 1.1 mrg static int
577 1.1 mrg riscv_split_integer_cost (HOST_WIDE_INT val)
578 1.1 mrg {
579 1.1 mrg int cost;
580 1.1 mrg unsigned HOST_WIDE_INT loval = sext_hwi (val, 32);
581 1.1 mrg unsigned HOST_WIDE_INT hival = sext_hwi ((val - loval) >> 32, 32);
582 1.1 mrg struct riscv_integer_op codes[RISCV_MAX_INTEGER_OPS];
583 1.1 mrg
584 1.1 mrg cost = 2 + riscv_build_integer (codes, loval, VOIDmode);
585 1.1 mrg if (loval != hival)
586 1.1 mrg cost += riscv_build_integer (codes, hival, VOIDmode);
587 1.1 mrg
588 1.1 mrg return cost;
589 1.1 mrg }
590 1.1 mrg
591 1.1 mrg /* Return the cost of constructing the integer constant VAL. */
592 1.1 mrg
593 1.1 mrg static int
594 1.1 mrg riscv_integer_cost (HOST_WIDE_INT val)
595 1.1 mrg {
596 1.1 mrg struct riscv_integer_op codes[RISCV_MAX_INTEGER_OPS];
597 1.1 mrg return MIN (riscv_build_integer (codes, val, VOIDmode),
598 1.1 mrg riscv_split_integer_cost (val));
599 1.1 mrg }
600 1.1 mrg
601 1.1 mrg /* Try to split a 64b integer into 32b parts, then reassemble. */
602 1.1 mrg
603 1.1 mrg static rtx
604 1.1 mrg riscv_split_integer (HOST_WIDE_INT val, machine_mode mode)
605 1.1 mrg {
606 1.1 mrg unsigned HOST_WIDE_INT loval = sext_hwi (val, 32);
607 1.1 mrg unsigned HOST_WIDE_INT hival = sext_hwi ((val - loval) >> 32, 32);
608 1.1 mrg rtx hi = gen_reg_rtx (mode), lo = gen_reg_rtx (mode);
609 1.1 mrg
610 1.1 mrg riscv_move_integer (hi, hi, hival, mode, FALSE);
611 1.1 mrg riscv_move_integer (lo, lo, loval, mode, FALSE);
612 1.1 mrg
613 1.1 mrg hi = gen_rtx_fmt_ee (ASHIFT, mode, hi, GEN_INT (32));
614 1.1 mrg hi = force_reg (mode, hi);
615 1.1 mrg
616 1.1 mrg return gen_rtx_fmt_ee (PLUS, mode, hi, lo);
617 1.1 mrg }
618 1.1 mrg
619 1.1 mrg /* Return true if X is a thread-local symbol. */
620 1.1 mrg
621 1.1 mrg static bool
622 1.1 mrg riscv_tls_symbol_p (const_rtx x)
623 1.1 mrg {
624 1.1 mrg return SYMBOL_REF_P (x) && SYMBOL_REF_TLS_MODEL (x) != 0;
625 1.1 mrg }
626 1.1 mrg
627 1.1 mrg /* Return true if symbol X binds locally. */
628 1.1 mrg
629 1.1 mrg static bool
630 1.1 mrg riscv_symbol_binds_local_p (const_rtx x)
631 1.1 mrg {
632 1.1 mrg if (SYMBOL_REF_P (x))
633 1.1 mrg return (SYMBOL_REF_DECL (x)
634 1.1 mrg ? targetm.binds_local_p (SYMBOL_REF_DECL (x))
635 1.1 mrg : SYMBOL_REF_LOCAL_P (x));
636 1.1 mrg else
637 1.1 mrg return false;
638 1.1 mrg }
639 1.1 mrg
640 1.1 mrg /* Return the method that should be used to access SYMBOL_REF or
641 1.1 mrg LABEL_REF X. */
642 1.1 mrg
643 1.1 mrg static enum riscv_symbol_type
644 1.1 mrg riscv_classify_symbol (const_rtx x)
645 1.1 mrg {
646 1.1 mrg if (riscv_tls_symbol_p (x))
647 1.1 mrg return SYMBOL_TLS;
648 1.1 mrg
649 1.1 mrg if (GET_CODE (x) == SYMBOL_REF && flag_pic && !riscv_symbol_binds_local_p (x))
650 1.1 mrg return SYMBOL_GOT_DISP;
651 1.1 mrg
652 1.1 mrg return riscv_cmodel == CM_MEDLOW ? SYMBOL_ABSOLUTE : SYMBOL_PCREL;
653 1.1 mrg }
654 1.1 mrg
655 1.1 mrg /* Classify the base of symbolic expression X. */
656 1.1 mrg
657 1.1 mrg enum riscv_symbol_type
658 1.1 mrg riscv_classify_symbolic_expression (rtx x)
659 1.1 mrg {
660 1.1 mrg rtx offset;
661 1.1 mrg
662 1.1 mrg split_const (x, &x, &offset);
663 1.1 mrg if (UNSPEC_ADDRESS_P (x))
664 1.1 mrg return UNSPEC_ADDRESS_TYPE (x);
665 1.1 mrg
666 1.1 mrg return riscv_classify_symbol (x);
667 1.1 mrg }
668 1.1 mrg
669 1.1 mrg /* Return true if X is a symbolic constant. If it is, store the type of
670 1.1 mrg the symbol in *SYMBOL_TYPE. */
671 1.1 mrg
672 1.1 mrg bool
673 1.1 mrg riscv_symbolic_constant_p (rtx x, enum riscv_symbol_type *symbol_type)
674 1.1 mrg {
675 1.1 mrg rtx offset;
676 1.1 mrg
677 1.1 mrg split_const (x, &x, &offset);
678 1.1 mrg if (UNSPEC_ADDRESS_P (x))
679 1.1 mrg {
680 1.1 mrg *symbol_type = UNSPEC_ADDRESS_TYPE (x);
681 1.1 mrg x = UNSPEC_ADDRESS (x);
682 1.1 mrg }
683 1.1 mrg else if (GET_CODE (x) == SYMBOL_REF || GET_CODE (x) == LABEL_REF)
684 1.1 mrg *symbol_type = riscv_classify_symbol (x);
685 1.1 mrg else
686 1.1 mrg return false;
687 1.1 mrg
688 1.1 mrg if (offset == const0_rtx)
689 1.1 mrg return true;
690 1.1 mrg
691 1.1 mrg /* Nonzero offsets are only valid for references that don't use the GOT. */
692 1.1 mrg switch (*symbol_type)
693 1.1 mrg {
694 1.1 mrg case SYMBOL_ABSOLUTE:
695 1.1 mrg case SYMBOL_PCREL:
696 1.1 mrg case SYMBOL_TLS_LE:
697 1.1 mrg /* GAS rejects offsets outside the range [-2^31, 2^31-1]. */
698 1.1 mrg return sext_hwi (INTVAL (offset), 32) == INTVAL (offset);
699 1.1 mrg
700 1.1 mrg default:
701 1.1 mrg return false;
702 1.1 mrg }
703 1.1 mrg }
704 1.1 mrg
705 1.1 mrg /* Returns the number of instructions necessary to reference a symbol. */
706 1.1 mrg
707 1.1 mrg static int riscv_symbol_insns (enum riscv_symbol_type type)
708 1.1 mrg {
709 1.1 mrg switch (type)
710 1.1 mrg {
711 1.1 mrg case SYMBOL_TLS: return 0; /* Depends on the TLS model. */
712 1.1 mrg case SYMBOL_ABSOLUTE: return 2; /* LUI + the reference. */
713 1.1 mrg case SYMBOL_PCREL: return 2; /* AUIPC + the reference. */
714 1.1 mrg case SYMBOL_TLS_LE: return 3; /* LUI + ADD TP + the reference. */
715 1.1 mrg case SYMBOL_GOT_DISP: return 3; /* AUIPC + LD GOT + the reference. */
716 1.1 mrg default: gcc_unreachable ();
717 1.1 mrg }
718 1.1 mrg }
719 1.1 mrg
720 1.1 mrg /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
721 1.1 mrg
722 1.1 mrg static bool
723 1.1 mrg riscv_legitimate_constant_p (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
724 1.1 mrg {
725 1.1 mrg return riscv_const_insns (x) > 0;
726 1.1 mrg }
727 1.1 mrg
728 1.1 mrg /* Implement TARGET_CANNOT_FORCE_CONST_MEM. */
729 1.1 mrg
730 1.1 mrg static bool
731 1.1 mrg riscv_cannot_force_const_mem (machine_mode mode ATTRIBUTE_UNUSED, rtx x)
732 1.1 mrg {
733 1.1 mrg enum riscv_symbol_type type;
734 1.1 mrg rtx base, offset;
735 1.1 mrg
736 1.1 mrg /* There is no assembler syntax for expressing an address-sized
737 1.1 mrg high part. */
738 1.1 mrg if (GET_CODE (x) == HIGH)
739 1.1 mrg return true;
740 1.1 mrg
741 1.1 mrg split_const (x, &base, &offset);
742 1.1 mrg if (riscv_symbolic_constant_p (base, &type))
743 1.1 mrg {
744 1.1 mrg /* As an optimization, don't spill symbolic constants that are as
745 1.1 mrg cheap to rematerialize as to access in the constant pool. */
746 1.1 mrg if (SMALL_OPERAND (INTVAL (offset)) && riscv_symbol_insns (type) > 0)
747 1.1 mrg return true;
748 1.1 mrg
749 1.1 mrg /* As an optimization, avoid needlessly generate dynamic relocations. */
750 1.1 mrg if (flag_pic)
751 1.1 mrg return true;
752 1.1 mrg }
753 1.1 mrg
754 1.1 mrg /* TLS symbols must be computed by riscv_legitimize_move. */
755 1.1 mrg if (tls_referenced_p (x))
756 1.1 mrg return true;
757 1.1 mrg
758 1.1 mrg return false;
759 1.1 mrg }
760 1.1 mrg
761 1.1 mrg /* Return true if register REGNO is a valid base register for mode MODE.
762 1.1 mrg STRICT_P is true if REG_OK_STRICT is in effect. */
763 1.1 mrg
764 1.1 mrg int
765 1.1 mrg riscv_regno_mode_ok_for_base_p (int regno,
766 1.1 mrg machine_mode mode ATTRIBUTE_UNUSED,
767 1.1 mrg bool strict_p)
768 1.1 mrg {
769 1.1 mrg if (!HARD_REGISTER_NUM_P (regno))
770 1.1 mrg {
771 1.1 mrg if (!strict_p)
772 1.1 mrg return true;
773 1.1 mrg regno = reg_renumber[regno];
774 1.1 mrg }
775 1.1 mrg
776 1.1 mrg /* These fake registers will be eliminated to either the stack or
777 1.1 mrg hard frame pointer, both of which are usually valid base registers.
778 1.1 mrg Reload deals with the cases where the eliminated form isn't valid. */
779 1.1 mrg if (regno == ARG_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM)
780 1.1 mrg return true;
781 1.1 mrg
782 1.1 mrg return GP_REG_P (regno);
783 1.1 mrg }
784 1.1 mrg
785 1.1 mrg /* Return true if X is a valid base register for mode MODE.
786 1.1 mrg STRICT_P is true if REG_OK_STRICT is in effect. */
787 1.1 mrg
788 1.1 mrg static bool
789 1.1 mrg riscv_valid_base_register_p (rtx x, machine_mode mode, bool strict_p)
790 1.1 mrg {
791 1.1 mrg if (!strict_p && GET_CODE (x) == SUBREG)
792 1.1 mrg x = SUBREG_REG (x);
793 1.1 mrg
794 1.1 mrg return (REG_P (x)
795 1.1 mrg && riscv_regno_mode_ok_for_base_p (REGNO (x), mode, strict_p));
796 1.1 mrg }
797 1.1 mrg
798 1.1 mrg /* Return true if, for every base register BASE_REG, (plus BASE_REG X)
799 1.1 mrg can address a value of mode MODE. */
800 1.1 mrg
801 1.1 mrg static bool
802 1.1 mrg riscv_valid_offset_p (rtx x, machine_mode mode)
803 1.1 mrg {
804 1.1 mrg /* Check that X is a signed 12-bit number. */
805 1.1 mrg if (!const_arith_operand (x, Pmode))
806 1.1 mrg return false;
807 1.1 mrg
808 1.1 mrg /* We may need to split multiword moves, so make sure that every word
809 1.1 mrg is accessible. */
810 1.1 mrg if (GET_MODE_SIZE (mode) > UNITS_PER_WORD
811 1.1 mrg && !SMALL_OPERAND (INTVAL (x) + GET_MODE_SIZE (mode) - UNITS_PER_WORD))
812 1.1 mrg return false;
813 1.1 mrg
814 1.1 mrg return true;
815 1.1 mrg }
816 1.1 mrg
817 1.1 mrg /* Should a symbol of type SYMBOL_TYPE should be split in two? */
818 1.1 mrg
819 1.1 mrg bool
820 1.1 mrg riscv_split_symbol_type (enum riscv_symbol_type symbol_type)
821 1.1 mrg {
822 1.1 mrg if (symbol_type == SYMBOL_TLS_LE)
823 1.1 mrg return true;
824 1.1 mrg
825 1.1 mrg if (!TARGET_EXPLICIT_RELOCS)
826 1.1 mrg return false;
827 1.1 mrg
828 1.1 mrg return symbol_type == SYMBOL_ABSOLUTE || symbol_type == SYMBOL_PCREL;
829 1.1 mrg }
830 1.1 mrg
831 1.1 mrg /* Return true if a LO_SUM can address a value of mode MODE when the
832 1.1 mrg LO_SUM symbol has type SYM_TYPE. X is the LO_SUM second operand, which
833 1.1 mrg is used when the mode is BLKmode. */
834 1.1 mrg
835 1.1 mrg static bool
836 1.1 mrg riscv_valid_lo_sum_p (enum riscv_symbol_type sym_type, machine_mode mode,
837 1.1 mrg rtx x)
838 1.1 mrg {
839 1.1 mrg int align, size;
840 1.1 mrg
841 1.1 mrg /* Check that symbols of type SYMBOL_TYPE can be used to access values
842 1.1 mrg of mode MODE. */
843 1.1 mrg if (riscv_symbol_insns (sym_type) == 0)
844 1.1 mrg return false;
845 1.1 mrg
846 1.1 mrg /* Check that there is a known low-part relocation. */
847 1.1 mrg if (!riscv_split_symbol_type (sym_type))
848 1.1 mrg return false;
849 1.1 mrg
850 1.1 mrg /* We can't tell size or alignment when we have BLKmode, so try extracing a
851 1.1 mrg decl from the symbol if possible. */
852 1.1 mrg if (mode == BLKmode)
853 1.1 mrg {
854 1.1 mrg rtx offset;
855 1.1 mrg
856 1.1 mrg /* Extract the symbol from the LO_SUM operand, if any. */
857 1.1 mrg split_const (x, &x, &offset);
858 1.1 mrg
859 1.1 mrg /* Might be a CODE_LABEL. We can compute align but not size for that,
860 1.1 mrg so don't bother trying to handle it. */
861 1.1 mrg if (!SYMBOL_REF_P (x))
862 1.1 mrg return false;
863 1.1 mrg
864 1.1 mrg /* Use worst case assumptions if we don't have a SYMBOL_REF_DECL. */
865 1.1 mrg align = (SYMBOL_REF_DECL (x)
866 1.1 mrg ? DECL_ALIGN (SYMBOL_REF_DECL (x))
867 1.1 mrg : 1);
868 1.1 mrg size = (SYMBOL_REF_DECL (x) && DECL_SIZE (SYMBOL_REF_DECL (x))
869 1.1 mrg ? tree_to_uhwi (DECL_SIZE (SYMBOL_REF_DECL (x)))
870 1.1 mrg : 2*BITS_PER_WORD);
871 1.1 mrg }
872 1.1 mrg else
873 1.1 mrg {
874 1.1 mrg align = GET_MODE_ALIGNMENT (mode);
875 1.1 mrg size = GET_MODE_BITSIZE (mode);
876 1.1 mrg }
877 1.1 mrg
878 1.1 mrg /* We may need to split multiword moves, so make sure that each word
879 1.1 mrg can be accessed without inducing a carry. */
880 1.1 mrg if (size > BITS_PER_WORD
881 1.1 mrg && (!TARGET_STRICT_ALIGN || size > align))
882 1.1 mrg return false;
883 1.1 mrg
884 1.1 mrg return true;
885 1.1 mrg }
886 1.1 mrg
887 1.1 mrg /* Return true if X is a valid address for machine mode MODE. If it is,
888 1.1 mrg fill in INFO appropriately. STRICT_P is true if REG_OK_STRICT is in
889 1.1 mrg effect. */
890 1.1 mrg
891 1.1 mrg static bool
892 1.1 mrg riscv_classify_address (struct riscv_address_info *info, rtx x,
893 1.1 mrg machine_mode mode, bool strict_p)
894 1.1 mrg {
895 1.1 mrg switch (GET_CODE (x))
896 1.1 mrg {
897 1.1 mrg case REG:
898 1.1 mrg case SUBREG:
899 1.1 mrg info->type = ADDRESS_REG;
900 1.1 mrg info->reg = x;
901 1.1 mrg info->offset = const0_rtx;
902 1.1 mrg return riscv_valid_base_register_p (info->reg, mode, strict_p);
903 1.1 mrg
904 1.1 mrg case PLUS:
905 1.1 mrg info->type = ADDRESS_REG;
906 1.1 mrg info->reg = XEXP (x, 0);
907 1.1 mrg info->offset = XEXP (x, 1);
908 1.1 mrg return (riscv_valid_base_register_p (info->reg, mode, strict_p)
909 1.1 mrg && riscv_valid_offset_p (info->offset, mode));
910 1.1 mrg
911 1.1 mrg case LO_SUM:
912 1.1 mrg info->type = ADDRESS_LO_SUM;
913 1.1 mrg info->reg = XEXP (x, 0);
914 1.1 mrg info->offset = XEXP (x, 1);
915 1.1 mrg /* We have to trust the creator of the LO_SUM to do something vaguely
916 1.1 mrg sane. Target-independent code that creates a LO_SUM should also
917 1.1 mrg create and verify the matching HIGH. Target-independent code that
918 1.1 mrg adds an offset to a LO_SUM must prove that the offset will not
919 1.1 mrg induce a carry. Failure to do either of these things would be
920 1.1 mrg a bug, and we are not required to check for it here. The RISC-V
921 1.1 mrg backend itself should only create LO_SUMs for valid symbolic
922 1.1 mrg constants, with the high part being either a HIGH or a copy
923 1.1 mrg of _gp. */
924 1.1 mrg info->symbol_type
925 1.1 mrg = riscv_classify_symbolic_expression (info->offset);
926 1.1 mrg return (riscv_valid_base_register_p (info->reg, mode, strict_p)
927 1.1 mrg && riscv_valid_lo_sum_p (info->symbol_type, mode, info->offset));
928 1.1 mrg
929 1.1 mrg case CONST_INT:
930 1.1 mrg /* Small-integer addresses don't occur very often, but they
931 1.1 mrg are legitimate if x0 is a valid base register. */
932 1.1 mrg info->type = ADDRESS_CONST_INT;
933 1.1 mrg return SMALL_OPERAND (INTVAL (x));
934 1.1 mrg
935 1.1 mrg default:
936 1.1 mrg return false;
937 1.1 mrg }
938 1.1 mrg }
939 1.1 mrg
940 1.1 mrg /* Implement TARGET_LEGITIMATE_ADDRESS_P. */
941 1.1 mrg
942 1.1 mrg static bool
943 1.1 mrg riscv_legitimate_address_p (machine_mode mode, rtx x, bool strict_p)
944 1.1 mrg {
945 1.1 mrg struct riscv_address_info addr;
946 1.1 mrg
947 1.1 mrg return riscv_classify_address (&addr, x, mode, strict_p);
948 1.1 mrg }
949 1.1 mrg
950 1.1 mrg /* Return true if hard reg REGNO can be used in compressed instructions. */
951 1.1 mrg
952 1.1 mrg static bool
953 1.1 mrg riscv_compressed_reg_p (int regno)
954 1.1 mrg {
955 1.1 mrg /* x8-x15/f8-f15 are compressible registers. */
956 1.1 mrg return (TARGET_RVC && (IN_RANGE (regno, GP_REG_FIRST + 8, GP_REG_FIRST + 15)
957 1.1 mrg || IN_RANGE (regno, FP_REG_FIRST + 8, FP_REG_FIRST + 15)));
958 1.1 mrg }
959 1.1 mrg
960 1.1 mrg /* Return true if x is an unsigned 5-bit immediate scaled by 4. */
961 1.1 mrg
962 1.1 mrg static bool
963 1.1 mrg riscv_compressed_lw_offset_p (rtx x)
964 1.1 mrg {
965 1.1 mrg return (CONST_INT_P (x)
966 1.1 mrg && (INTVAL (x) & 3) == 0
967 1.1 mrg && IN_RANGE (INTVAL (x), 0, CSW_MAX_OFFSET));
968 1.1 mrg }
969 1.1 mrg
970 1.1 mrg /* Return true if load/store from/to address x can be compressed. */
971 1.1 mrg
972 1.1 mrg static bool
973 1.1 mrg riscv_compressed_lw_address_p (rtx x)
974 1.1 mrg {
975 1.1 mrg struct riscv_address_info addr;
976 1.1 mrg bool result = riscv_classify_address (&addr, x, GET_MODE (x),
977 1.1 mrg reload_completed);
978 1.1 mrg
979 1.1 mrg /* Return false if address is not compressed_reg + small_offset. */
980 1.1 mrg if (!result
981 1.1 mrg || addr.type != ADDRESS_REG
982 1.1 mrg /* Before reload, assume all registers are OK. */
983 1.1 mrg || (reload_completed
984 1.1 mrg && !riscv_compressed_reg_p (REGNO (addr.reg))
985 1.1 mrg && addr.reg != stack_pointer_rtx)
986 1.1 mrg || !riscv_compressed_lw_offset_p (addr.offset))
987 1.1 mrg return false;
988 1.1 mrg
989 1.1 mrg return result;
990 1.1 mrg }
991 1.1 mrg
992 1.1 mrg /* Return the number of instructions needed to load or store a value
993 1.1 mrg of mode MODE at address X. Return 0 if X isn't valid for MODE.
994 1.1 mrg Assume that multiword moves may need to be split into word moves
995 1.1 mrg if MIGHT_SPLIT_P, otherwise assume that a single load or store is
996 1.1 mrg enough. */
997 1.1 mrg
998 1.1 mrg int
999 1.1 mrg riscv_address_insns (rtx x, machine_mode mode, bool might_split_p)
1000 1.1 mrg {
1001 1.1 mrg struct riscv_address_info addr = {};
1002 1.1 mrg int n = 1;
1003 1.1 mrg
1004 1.1 mrg if (!riscv_classify_address (&addr, x, mode, false))
1005 1.1 mrg {
1006 1.1 mrg /* This could be a pattern from the pic.md file. In which case we want
1007 1.1 mrg this address to always have a cost of 3 to make it as expensive as the
1008 1.1 mrg most expensive symbol. This prevents constant propagation from
1009 1.1 mrg preferring symbols over register plus offset. */
1010 1.1 mrg return 3;
1011 1.1 mrg }
1012 1.1 mrg
1013 1.1 mrg /* BLKmode is used for single unaligned loads and stores and should
1014 1.1 mrg not count as a multiword mode. */
1015 1.1 mrg if (mode != BLKmode && might_split_p)
1016 1.1 mrg n += (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
1017 1.1 mrg
1018 1.1 mrg if (addr.type == ADDRESS_LO_SUM)
1019 1.1 mrg n += riscv_symbol_insns (addr.symbol_type) - 1;
1020 1.1 mrg
1021 1.1 mrg return n;
1022 1.1 mrg }
1023 1.1 mrg
1024 1.1 mrg /* Return the number of instructions needed to load constant X.
1025 1.1 mrg Return 0 if X isn't a valid constant. */
1026 1.1 mrg
1027 1.1 mrg int
1028 1.1 mrg riscv_const_insns (rtx x)
1029 1.1 mrg {
1030 1.1 mrg enum riscv_symbol_type symbol_type;
1031 1.1 mrg rtx offset;
1032 1.1 mrg
1033 1.1 mrg switch (GET_CODE (x))
1034 1.1 mrg {
1035 1.1 mrg case HIGH:
1036 1.1 mrg if (!riscv_symbolic_constant_p (XEXP (x, 0), &symbol_type)
1037 1.1 mrg || !riscv_split_symbol_type (symbol_type))
1038 1.1 mrg return 0;
1039 1.1 mrg
1040 1.1 mrg /* This is simply an LUI. */
1041 1.1 mrg return 1;
1042 1.1 mrg
1043 1.1 mrg case CONST_INT:
1044 1.1 mrg {
1045 1.1 mrg int cost = riscv_integer_cost (INTVAL (x));
1046 1.1 mrg /* Force complicated constants to memory. */
1047 1.1 mrg return cost < 4 ? cost : 0;
1048 1.1 mrg }
1049 1.1 mrg
1050 1.1 mrg case CONST_DOUBLE:
1051 1.1 mrg case CONST_VECTOR:
1052 1.1 mrg /* We can use x0 to load floating-point zero. */
1053 1.1 mrg return x == CONST0_RTX (GET_MODE (x)) ? 1 : 0;
1054 1.1 mrg
1055 1.1 mrg case CONST:
1056 1.1 mrg /* See if we can refer to X directly. */
1057 1.1 mrg if (riscv_symbolic_constant_p (x, &symbol_type))
1058 1.1 mrg return riscv_symbol_insns (symbol_type);
1059 1.1 mrg
1060 1.1 mrg /* Otherwise try splitting the constant into a base and offset. */
1061 1.1 mrg split_const (x, &x, &offset);
1062 1.1 mrg if (offset != 0)
1063 1.1 mrg {
1064 1.1 mrg int n = riscv_const_insns (x);
1065 1.1 mrg if (n != 0)
1066 1.1 mrg return n + riscv_integer_cost (INTVAL (offset));
1067 1.1 mrg }
1068 1.1 mrg return 0;
1069 1.1 mrg
1070 1.1 mrg case SYMBOL_REF:
1071 1.1 mrg case LABEL_REF:
1072 1.1 mrg return riscv_symbol_insns (riscv_classify_symbol (x));
1073 1.1 mrg
1074 1.1 mrg default:
1075 1.1 mrg return 0;
1076 1.1 mrg }
1077 1.1 mrg }
1078 1.1 mrg
1079 1.1 mrg /* X is a doubleword constant that can be handled by splitting it into
1080 1.1 mrg two words and loading each word separately. Return the number of
1081 1.1 mrg instructions required to do this. */
1082 1.1 mrg
1083 1.1 mrg int
1084 1.1 mrg riscv_split_const_insns (rtx x)
1085 1.1 mrg {
1086 1.1 mrg unsigned int low, high;
1087 1.1 mrg
1088 1.1 mrg low = riscv_const_insns (riscv_subword (x, false));
1089 1.1 mrg high = riscv_const_insns (riscv_subword (x, true));
1090 1.1 mrg gcc_assert (low > 0 && high > 0);
1091 1.1 mrg return low + high;
1092 1.1 mrg }
1093 1.1 mrg
1094 1.1 mrg /* Return the number of instructions needed to implement INSN,
1095 1.1 mrg given that it loads from or stores to MEM. */
1096 1.1 mrg
1097 1.1 mrg int
1098 1.1 mrg riscv_load_store_insns (rtx mem, rtx_insn *insn)
1099 1.1 mrg {
1100 1.1 mrg machine_mode mode;
1101 1.1 mrg bool might_split_p;
1102 1.1 mrg rtx set;
1103 1.1 mrg
1104 1.1 mrg gcc_assert (MEM_P (mem));
1105 1.1 mrg mode = GET_MODE (mem);
1106 1.1 mrg
1107 1.1 mrg /* Try to prove that INSN does not need to be split. */
1108 1.1 mrg might_split_p = true;
1109 1.1 mrg if (GET_MODE_BITSIZE (mode) <= 32)
1110 1.1 mrg might_split_p = false;
1111 1.1 mrg else if (GET_MODE_BITSIZE (mode) == 64)
1112 1.1 mrg {
1113 1.1 mrg set = single_set (insn);
1114 1.1 mrg if (set && !riscv_split_64bit_move_p (SET_DEST (set), SET_SRC (set)))
1115 1.1 mrg might_split_p = false;
1116 1.1 mrg }
1117 1.1 mrg
1118 1.1 mrg return riscv_address_insns (XEXP (mem, 0), mode, might_split_p);
1119 1.1 mrg }
1120 1.1 mrg
1121 1.1 mrg /* Emit a move from SRC to DEST. Assume that the move expanders can
1122 1.1 mrg handle all moves if !can_create_pseudo_p (). The distinction is
1123 1.1 mrg important because, unlike emit_move_insn, the move expanders know
1124 1.1 mrg how to force Pmode objects into the constant pool even when the
1125 1.1 mrg constant pool address is not itself legitimate. */
1126 1.1 mrg
1127 1.1 mrg rtx
1128 1.1 mrg riscv_emit_move (rtx dest, rtx src)
1129 1.1 mrg {
1130 1.1 mrg return (can_create_pseudo_p ()
1131 1.1 mrg ? emit_move_insn (dest, src)
1132 1.1 mrg : emit_move_insn_1 (dest, src));
1133 1.1 mrg }
1134 1.1 mrg
1135 1.1 mrg /* Emit an instruction of the form (set TARGET SRC). */
1136 1.1 mrg
1137 1.1 mrg static rtx
1138 1.1 mrg riscv_emit_set (rtx target, rtx src)
1139 1.1 mrg {
1140 1.1 mrg emit_insn (gen_rtx_SET (target, src));
1141 1.1 mrg return target;
1142 1.1 mrg }
1143 1.1 mrg
1144 1.1 mrg /* Emit an instruction of the form (set DEST (CODE X Y)). */
1145 1.1 mrg
1146 1.1 mrg static rtx
1147 1.1 mrg riscv_emit_binary (enum rtx_code code, rtx dest, rtx x, rtx y)
1148 1.1 mrg {
1149 1.1 mrg return riscv_emit_set (dest, gen_rtx_fmt_ee (code, GET_MODE (dest), x, y));
1150 1.1 mrg }
1151 1.1 mrg
1152 1.1 mrg /* Compute (CODE X Y) and store the result in a new register
1153 1.1 mrg of mode MODE. Return that new register. */
1154 1.1 mrg
1155 1.1 mrg static rtx
1156 1.1 mrg riscv_force_binary (machine_mode mode, enum rtx_code code, rtx x, rtx y)
1157 1.1 mrg {
1158 1.1 mrg return riscv_emit_binary (code, gen_reg_rtx (mode), x, y);
1159 1.1 mrg }
1160 1.1 mrg
1161 1.1 mrg static rtx
1162 1.1 mrg riscv_swap_instruction (rtx inst)
1163 1.1 mrg {
1164 1.1 mrg gcc_assert (GET_MODE (inst) == SImode);
1165 1.1 mrg if (BYTES_BIG_ENDIAN)
1166 1.1 mrg inst = expand_unop (SImode, bswap_optab, inst, gen_reg_rtx (SImode), 1);
1167 1.1 mrg return inst;
1168 1.1 mrg }
1169 1.1 mrg
1170 1.1 mrg /* Copy VALUE to a register and return that register. If new pseudos
1171 1.1 mrg are allowed, copy it into a new register, otherwise use DEST. */
1172 1.1 mrg
1173 1.1 mrg static rtx
1174 1.1 mrg riscv_force_temporary (rtx dest, rtx value, bool in_splitter)
1175 1.1 mrg {
1176 1.1 mrg /* We can't call gen_reg_rtx from a splitter, because this might realloc
1177 1.1 mrg the regno_reg_rtx array, which would invalidate reg rtx pointers in the
1178 1.1 mrg combine undo buffer. */
1179 1.1 mrg if (can_create_pseudo_p () && !in_splitter)
1180 1.1 mrg return force_reg (Pmode, value);
1181 1.1 mrg else
1182 1.1 mrg {
1183 1.1 mrg riscv_emit_move (dest, value);
1184 1.1 mrg return dest;
1185 1.1 mrg }
1186 1.1 mrg }
1187 1.1 mrg
1188 1.1 mrg /* Wrap symbol or label BASE in an UNSPEC address of type SYMBOL_TYPE,
1189 1.1 mrg then add CONST_INT OFFSET to the result. */
1190 1.1 mrg
1191 1.1 mrg static rtx
1192 1.1 mrg riscv_unspec_address_offset (rtx base, rtx offset,
1193 1.1 mrg enum riscv_symbol_type symbol_type)
1194 1.1 mrg {
1195 1.1 mrg base = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, base),
1196 1.1 mrg UNSPEC_ADDRESS_FIRST + symbol_type);
1197 1.1 mrg if (offset != const0_rtx)
1198 1.1 mrg base = gen_rtx_PLUS (Pmode, base, offset);
1199 1.1 mrg return gen_rtx_CONST (Pmode, base);
1200 1.1 mrg }
1201 1.1 mrg
1202 1.1 mrg /* Return an UNSPEC address with underlying address ADDRESS and symbol
1203 1.1 mrg type SYMBOL_TYPE. */
1204 1.1 mrg
1205 1.1 mrg rtx
1206 1.1 mrg riscv_unspec_address (rtx address, enum riscv_symbol_type symbol_type)
1207 1.1 mrg {
1208 1.1 mrg rtx base, offset;
1209 1.1 mrg
1210 1.1 mrg split_const (address, &base, &offset);
1211 1.1 mrg return riscv_unspec_address_offset (base, offset, symbol_type);
1212 1.1 mrg }
1213 1.1 mrg
1214 1.1 mrg /* If OP is an UNSPEC address, return the address to which it refers,
1215 1.1 mrg otherwise return OP itself. */
1216 1.1 mrg
1217 1.1 mrg static rtx
1218 1.1 mrg riscv_strip_unspec_address (rtx op)
1219 1.1 mrg {
1220 1.1 mrg rtx base, offset;
1221 1.1 mrg
1222 1.1 mrg split_const (op, &base, &offset);
1223 1.1 mrg if (UNSPEC_ADDRESS_P (base))
1224 1.1 mrg op = plus_constant (Pmode, UNSPEC_ADDRESS (base), INTVAL (offset));
1225 1.1 mrg return op;
1226 1.1 mrg }
1227 1.1 mrg
1228 1.1 mrg /* If riscv_unspec_address (ADDR, SYMBOL_TYPE) is a 32-bit value, add the
1229 1.1 mrg high part to BASE and return the result. Just return BASE otherwise.
1230 1.1 mrg TEMP is as for riscv_force_temporary.
1231 1.1 mrg
1232 1.1 mrg The returned expression can be used as the first operand to a LO_SUM. */
1233 1.1 mrg
1234 1.1 mrg static rtx
1235 1.1 mrg riscv_unspec_offset_high (rtx temp, rtx addr, enum riscv_symbol_type symbol_type)
1236 1.1 mrg {
1237 1.1 mrg addr = gen_rtx_HIGH (Pmode, riscv_unspec_address (addr, symbol_type));
1238 1.1 mrg return riscv_force_temporary (temp, addr, FALSE);
1239 1.1 mrg }
1240 1.1 mrg
1241 1.1 mrg /* Load an entry from the GOT for a TLS GD access. */
1242 1.1 mrg
1243 1.1 mrg static rtx riscv_got_load_tls_gd (rtx dest, rtx sym)
1244 1.1 mrg {
1245 1.1 mrg if (Pmode == DImode)
1246 1.1 mrg return gen_got_load_tls_gddi (dest, sym);
1247 1.1 mrg else
1248 1.1 mrg return gen_got_load_tls_gdsi (dest, sym);
1249 1.1 mrg }
1250 1.1 mrg
1251 1.1 mrg /* Load an entry from the GOT for a TLS IE access. */
1252 1.1 mrg
1253 1.1 mrg static rtx riscv_got_load_tls_ie (rtx dest, rtx sym)
1254 1.1 mrg {
1255 1.1 mrg if (Pmode == DImode)
1256 1.1 mrg return gen_got_load_tls_iedi (dest, sym);
1257 1.1 mrg else
1258 1.1 mrg return gen_got_load_tls_iesi (dest, sym);
1259 1.1 mrg }
1260 1.1 mrg
1261 1.1 mrg /* Add in the thread pointer for a TLS LE access. */
1262 1.1 mrg
1263 1.1 mrg static rtx riscv_tls_add_tp_le (rtx dest, rtx base, rtx sym)
1264 1.1 mrg {
1265 1.1 mrg rtx tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
1266 1.1 mrg if (Pmode == DImode)
1267 1.1 mrg return gen_tls_add_tp_ledi (dest, base, tp, sym);
1268 1.1 mrg else
1269 1.1 mrg return gen_tls_add_tp_lesi (dest, base, tp, sym);
1270 1.1 mrg }
1271 1.1 mrg
1272 1.1 mrg /* If MODE is MAX_MACHINE_MODE, ADDR appears as a move operand, otherwise
1273 1.1 mrg it appears in a MEM of that mode. Return true if ADDR is a legitimate
1274 1.1 mrg constant in that context and can be split into high and low parts.
1275 1.1 mrg If so, and if LOW_OUT is nonnull, emit the high part and store the
1276 1.1 mrg low part in *LOW_OUT. Leave *LOW_OUT unchanged otherwise.
1277 1.1 mrg
1278 1.1 mrg TEMP is as for riscv_force_temporary and is used to load the high
1279 1.1 mrg part into a register.
1280 1.1 mrg
1281 1.1 mrg When MODE is MAX_MACHINE_MODE, the low part is guaranteed to be
1282 1.1 mrg a legitimize SET_SRC for an .md pattern, otherwise the low part
1283 1.1 mrg is guaranteed to be a legitimate address for mode MODE. */
1284 1.1 mrg
1285 1.1 mrg bool
1286 1.1 mrg riscv_split_symbol (rtx temp, rtx addr, machine_mode mode, rtx *low_out,
1287 1.1 mrg bool in_splitter)
1288 1.1 mrg {
1289 1.1 mrg enum riscv_symbol_type symbol_type;
1290 1.1 mrg
1291 1.1 mrg if ((GET_CODE (addr) == HIGH && mode == MAX_MACHINE_MODE)
1292 1.1 mrg || !riscv_symbolic_constant_p (addr, &symbol_type)
1293 1.1 mrg || riscv_symbol_insns (symbol_type) == 0
1294 1.1 mrg || !riscv_split_symbol_type (symbol_type))
1295 1.1 mrg return false;
1296 1.1 mrg
1297 1.1 mrg if (low_out)
1298 1.1 mrg switch (symbol_type)
1299 1.1 mrg {
1300 1.1 mrg case SYMBOL_ABSOLUTE:
1301 1.1 mrg {
1302 1.1 mrg rtx high = gen_rtx_HIGH (Pmode, copy_rtx (addr));
1303 1.1 mrg high = riscv_force_temporary (temp, high, in_splitter);
1304 1.1 mrg *low_out = gen_rtx_LO_SUM (Pmode, high, addr);
1305 1.1 mrg }
1306 1.1 mrg break;
1307 1.1 mrg
1308 1.1 mrg case SYMBOL_PCREL:
1309 1.1 mrg {
1310 1.1 mrg static unsigned seqno;
1311 1.1 mrg char buf[32];
1312 1.1 mrg rtx label;
1313 1.1 mrg
1314 1.1 mrg ssize_t bytes = snprintf (buf, sizeof (buf), ".LA%u", seqno);
1315 1.1 mrg gcc_assert ((size_t) bytes < sizeof (buf));
1316 1.1 mrg
1317 1.1 mrg label = gen_rtx_SYMBOL_REF (Pmode, ggc_strdup (buf));
1318 1.1 mrg SYMBOL_REF_FLAGS (label) |= SYMBOL_FLAG_LOCAL;
1319 1.1 mrg /* ??? Ugly hack to make weak symbols work. May need to change the
1320 1.1 mrg RTL for the auipc and/or low patterns to get a better fix for
1321 1.1 mrg this. */
1322 1.1 mrg if (! nonzero_address_p (addr))
1323 1.1 mrg SYMBOL_REF_WEAK (label) = 1;
1324 1.1 mrg
1325 1.1 mrg if (temp == NULL)
1326 1.1 mrg temp = gen_reg_rtx (Pmode);
1327 1.1 mrg
1328 1.1 mrg if (Pmode == DImode)
1329 1.1 mrg emit_insn (gen_auipcdi (temp, copy_rtx (addr), GEN_INT (seqno)));
1330 1.1 mrg else
1331 1.1 mrg emit_insn (gen_auipcsi (temp, copy_rtx (addr), GEN_INT (seqno)));
1332 1.1 mrg
1333 1.1 mrg *low_out = gen_rtx_LO_SUM (Pmode, temp, label);
1334 1.1 mrg
1335 1.1 mrg seqno++;
1336 1.1 mrg }
1337 1.1 mrg break;
1338 1.1 mrg
1339 1.1 mrg default:
1340 1.1 mrg gcc_unreachable ();
1341 1.1 mrg }
1342 1.1 mrg
1343 1.1 mrg return true;
1344 1.1 mrg }
1345 1.1 mrg
1346 1.1 mrg /* Return a legitimate address for REG + OFFSET. TEMP is as for
1347 1.1 mrg riscv_force_temporary; it is only needed when OFFSET is not a
1348 1.1 mrg SMALL_OPERAND. */
1349 1.1 mrg
1350 1.1 mrg static rtx
1351 1.1 mrg riscv_add_offset (rtx temp, rtx reg, HOST_WIDE_INT offset)
1352 1.1 mrg {
1353 1.1 mrg if (!SMALL_OPERAND (offset))
1354 1.1 mrg {
1355 1.1 mrg rtx high;
1356 1.1 mrg
1357 1.1 mrg /* Leave OFFSET as a 16-bit offset and put the excess in HIGH.
1358 1.1 mrg The addition inside the macro CONST_HIGH_PART may cause an
1359 1.1 mrg overflow, so we need to force a sign-extension check. */
1360 1.1 mrg high = gen_int_mode (CONST_HIGH_PART (offset), Pmode);
1361 1.1 mrg offset = CONST_LOW_PART (offset);
1362 1.1 mrg high = riscv_force_temporary (temp, high, FALSE);
1363 1.1 mrg reg = riscv_force_temporary (temp, gen_rtx_PLUS (Pmode, high, reg),
1364 1.1 mrg FALSE);
1365 1.1 mrg }
1366 1.1 mrg return plus_constant (Pmode, reg, offset);
1367 1.1 mrg }
1368 1.1 mrg
1369 1.1 mrg /* The __tls_get_attr symbol. */
1370 1.1 mrg static GTY(()) rtx riscv_tls_symbol;
1371 1.1 mrg
1372 1.1 mrg /* Return an instruction sequence that calls __tls_get_addr. SYM is
1373 1.1 mrg the TLS symbol we are referencing and TYPE is the symbol type to use
1374 1.1 mrg (either global dynamic or local dynamic). RESULT is an RTX for the
1375 1.1 mrg return value location. */
1376 1.1 mrg
1377 1.1 mrg static rtx_insn *
1378 1.1 mrg riscv_call_tls_get_addr (rtx sym, rtx result)
1379 1.1 mrg {
1380 1.1 mrg rtx a0 = gen_rtx_REG (Pmode, GP_ARG_FIRST), func;
1381 1.1 mrg rtx_insn *insn;
1382 1.1 mrg
1383 1.1 mrg if (!riscv_tls_symbol)
1384 1.1 mrg riscv_tls_symbol = init_one_libfunc ("__tls_get_addr");
1385 1.1 mrg func = gen_rtx_MEM (FUNCTION_MODE, riscv_tls_symbol);
1386 1.1 mrg
1387 1.1 mrg start_sequence ();
1388 1.1 mrg
1389 1.1 mrg emit_insn (riscv_got_load_tls_gd (a0, sym));
1390 1.1 mrg insn = emit_call_insn (gen_call_value (result, func, const0_rtx, NULL));
1391 1.1 mrg RTL_CONST_CALL_P (insn) = 1;
1392 1.1 mrg use_reg (&CALL_INSN_FUNCTION_USAGE (insn), a0);
1393 1.1 mrg insn = get_insns ();
1394 1.1 mrg
1395 1.1 mrg end_sequence ();
1396 1.1 mrg
1397 1.1 mrg return insn;
1398 1.1 mrg }
1399 1.1 mrg
1400 1.1 mrg /* Generate the code to access LOC, a thread-local SYMBOL_REF, and return
1401 1.1 mrg its address. The return value will be both a valid address and a valid
1402 1.1 mrg SET_SRC (either a REG or a LO_SUM). */
1403 1.1 mrg
1404 1.1 mrg static rtx
1405 1.1 mrg riscv_legitimize_tls_address (rtx loc)
1406 1.1 mrg {
1407 1.1 mrg rtx dest, tp, tmp;
1408 1.1 mrg enum tls_model model = SYMBOL_REF_TLS_MODEL (loc);
1409 1.1 mrg
1410 1.1 mrg #if 0
1411 1.1 mrg /* TLS copy relocs are now deprecated and should not be used. */
1412 1.1 mrg /* Since we support TLS copy relocs, non-PIC TLS accesses may all use LE. */
1413 1.1 mrg if (!flag_pic)
1414 1.1 mrg model = TLS_MODEL_LOCAL_EXEC;
1415 1.1 mrg #endif
1416 1.1 mrg
1417 1.1 mrg switch (model)
1418 1.1 mrg {
1419 1.1 mrg case TLS_MODEL_LOCAL_DYNAMIC:
1420 1.1 mrg /* Rely on section anchors for the optimization that LDM TLS
1421 1.1 mrg provides. The anchor's address is loaded with GD TLS. */
1422 1.1 mrg case TLS_MODEL_GLOBAL_DYNAMIC:
1423 1.1 mrg tmp = gen_rtx_REG (Pmode, GP_RETURN);
1424 1.1 mrg dest = gen_reg_rtx (Pmode);
1425 1.1 mrg emit_libcall_block (riscv_call_tls_get_addr (loc, tmp), dest, tmp, loc);
1426 1.1 mrg break;
1427 1.1 mrg
1428 1.1 mrg case TLS_MODEL_INITIAL_EXEC:
1429 1.1 mrg /* la.tls.ie; tp-relative add */
1430 1.1 mrg tp = gen_rtx_REG (Pmode, THREAD_POINTER_REGNUM);
1431 1.1 mrg tmp = gen_reg_rtx (Pmode);
1432 1.1 mrg emit_insn (riscv_got_load_tls_ie (tmp, loc));
1433 1.1 mrg dest = gen_reg_rtx (Pmode);
1434 1.1 mrg emit_insn (gen_add3_insn (dest, tmp, tp));
1435 1.1 mrg break;
1436 1.1 mrg
1437 1.1 mrg case TLS_MODEL_LOCAL_EXEC:
1438 1.1 mrg tmp = riscv_unspec_offset_high (NULL, loc, SYMBOL_TLS_LE);
1439 1.1 mrg dest = gen_reg_rtx (Pmode);
1440 1.1 mrg emit_insn (riscv_tls_add_tp_le (dest, tmp, loc));
1441 1.1 mrg dest = gen_rtx_LO_SUM (Pmode, dest,
1442 1.1 mrg riscv_unspec_address (loc, SYMBOL_TLS_LE));
1443 1.1 mrg break;
1444 1.1 mrg
1445 1.1 mrg default:
1446 1.1 mrg gcc_unreachable ();
1447 1.1 mrg }
1448 1.1 mrg return dest;
1449 1.1 mrg }
1450 1.1 mrg
1451 1.1 mrg /* If X is not a valid address for mode MODE, force it into a register. */
1453 1.1 mrg
1454 1.1 mrg static rtx
1455 1.1 mrg riscv_force_address (rtx x, machine_mode mode)
1456 1.1 mrg {
1457 1.1 mrg if (!riscv_legitimate_address_p (mode, x, false))
1458 1.1 mrg x = force_reg (Pmode, x);
1459 1.1 mrg return x;
1460 1.1 mrg }
1461 1.1 mrg
1462 1.1 mrg /* Modify base + offset so that offset fits within a compressed load/store insn
1463 1.1 mrg and the excess is added to base. */
1464 1.1 mrg
1465 1.1 mrg static rtx
1466 1.1 mrg riscv_shorten_lw_offset (rtx base, HOST_WIDE_INT offset)
1467 1.1 mrg {
1468 1.1 mrg rtx addr, high;
1469 1.1 mrg /* Leave OFFSET as an unsigned 5-bit offset scaled by 4 and put the excess
1470 1.1 mrg into HIGH. */
1471 1.1 mrg high = GEN_INT (offset & ~CSW_MAX_OFFSET);
1472 1.1 mrg offset &= CSW_MAX_OFFSET;
1473 1.1 mrg if (!SMALL_OPERAND (INTVAL (high)))
1474 1.1 mrg high = force_reg (Pmode, high);
1475 1.1 mrg base = force_reg (Pmode, gen_rtx_PLUS (Pmode, high, base));
1476 1.1 mrg addr = plus_constant (Pmode, base, offset);
1477 1.1 mrg return addr;
1478 1.1 mrg }
1479 1.1 mrg
1480 1.1 mrg /* This function is used to implement LEGITIMIZE_ADDRESS. If X can
1481 1.1 mrg be legitimized in a way that the generic machinery might not expect,
1482 1.1 mrg return a new address, otherwise return NULL. MODE is the mode of
1483 1.1 mrg the memory being accessed. */
1484 1.1 mrg
1485 1.1 mrg static rtx
1486 1.1 mrg riscv_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED,
1487 1.1 mrg machine_mode mode)
1488 1.1 mrg {
1489 1.1 mrg rtx addr;
1490 1.1 mrg
1491 1.1 mrg if (riscv_tls_symbol_p (x))
1492 1.1 mrg return riscv_legitimize_tls_address (x);
1493 1.1 mrg
1494 1.1 mrg /* See if the address can split into a high part and a LO_SUM. */
1495 1.1 mrg if (riscv_split_symbol (NULL, x, mode, &addr, FALSE))
1496 1.1 mrg return riscv_force_address (addr, mode);
1497 1.1 mrg
1498 1.1 mrg /* Handle BASE + OFFSET. */
1499 1.1 mrg if (GET_CODE (x) == PLUS && CONST_INT_P (XEXP (x, 1))
1500 1.1 mrg && INTVAL (XEXP (x, 1)) != 0)
1501 1.1 mrg {
1502 1.1 mrg rtx base = XEXP (x, 0);
1503 1.1 mrg HOST_WIDE_INT offset = INTVAL (XEXP (x, 1));
1504 1.1 mrg
1505 1.1 mrg if (!riscv_valid_base_register_p (base, mode, false))
1506 1.1 mrg base = copy_to_mode_reg (Pmode, base);
1507 1.1 mrg if (optimize_function_for_size_p (cfun)
1508 1.1 mrg && (strcmp (current_pass->name, "shorten_memrefs") == 0)
1509 1.1 mrg && mode == SImode)
1510 1.1 mrg /* Convert BASE + LARGE_OFFSET into NEW_BASE + SMALL_OFFSET to allow
1511 1.1 mrg possible compressed load/store. */
1512 1.1 mrg addr = riscv_shorten_lw_offset (base, offset);
1513 1.1 mrg else
1514 1.1 mrg addr = riscv_add_offset (NULL, base, offset);
1515 1.1 mrg return riscv_force_address (addr, mode);
1516 1.1 mrg }
1517 1.1 mrg
1518 1.1 mrg return x;
1519 1.1 mrg }
1520 1.1 mrg
1521 1.1 mrg /* Load VALUE into DEST. TEMP is as for riscv_force_temporary. ORIG_MODE
1522 1.1 mrg is the original src mode before promotion. */
1523 1.1 mrg
1524 1.1 mrg void
1525 1.1 mrg riscv_move_integer (rtx temp, rtx dest, HOST_WIDE_INT value,
1526 1.1 mrg machine_mode orig_mode, bool in_splitter)
1527 1.1 mrg {
1528 1.1 mrg struct riscv_integer_op codes[RISCV_MAX_INTEGER_OPS];
1529 1.1 mrg machine_mode mode;
1530 1.1 mrg int i, num_ops;
1531 1.1 mrg rtx x;
1532 1.1 mrg
1533 1.1 mrg /* We can't call gen_reg_rtx from a splitter, because this might realloc
1534 1.1 mrg the regno_reg_rtx array, which would invalidate reg rtx pointers in the
1535 1.1 mrg combine undo buffer. */
1536 1.1 mrg bool can_create_pseudo = can_create_pseudo_p () && ! in_splitter;
1537 1.1 mrg
1538 1.1 mrg mode = GET_MODE (dest);
1539 1.1 mrg /* We use the original mode for the riscv_build_integer call, because HImode
1540 1.1 mrg values are given special treatment. */
1541 1.1 mrg num_ops = riscv_build_integer (codes, value, orig_mode);
1542 1.1 mrg
1543 1.1 mrg if (can_create_pseudo && num_ops > 2 /* not a simple constant */
1544 1.1 mrg && num_ops >= riscv_split_integer_cost (value))
1545 1.1 mrg x = riscv_split_integer (value, mode);
1546 1.1 mrg else
1547 1.1 mrg {
1548 1.1 mrg /* Apply each binary operation to X. */
1549 1.1 mrg x = GEN_INT (codes[0].value);
1550 1.1 mrg
1551 1.1 mrg for (i = 1; i < num_ops; i++)
1552 1.1 mrg {
1553 1.1 mrg if (!can_create_pseudo)
1554 1.1 mrg x = riscv_emit_set (temp, x);
1555 1.1 mrg else
1556 1.1 mrg x = force_reg (mode, x);
1557 1.1 mrg
1558 1.1 mrg x = gen_rtx_fmt_ee (codes[i].code, mode, x, GEN_INT (codes[i].value));
1559 1.1 mrg }
1560 1.1 mrg }
1561 1.1 mrg
1562 1.1 mrg riscv_emit_set (dest, x);
1563 1.1 mrg }
1564 1.1 mrg
1565 1.1 mrg /* Subroutine of riscv_legitimize_move. Move constant SRC into register
1566 1.1 mrg DEST given that SRC satisfies immediate_operand but doesn't satisfy
1567 1.1 mrg move_operand. */
1568 1.1 mrg
1569 1.1 mrg static void
1570 1.1 mrg riscv_legitimize_const_move (machine_mode mode, rtx dest, rtx src)
1571 1.1 mrg {
1572 1.1 mrg rtx base, offset;
1573 1.1 mrg
1574 1.1 mrg /* Split moves of big integers into smaller pieces. */
1575 1.1 mrg if (splittable_const_int_operand (src, mode))
1576 1.1 mrg {
1577 1.1 mrg riscv_move_integer (dest, dest, INTVAL (src), mode, FALSE);
1578 1.1 mrg return;
1579 1.1 mrg }
1580 1.1 mrg
1581 1.1 mrg /* Split moves of symbolic constants into high/low pairs. */
1582 1.1 mrg if (riscv_split_symbol (dest, src, MAX_MACHINE_MODE, &src, FALSE))
1583 1.1 mrg {
1584 1.1 mrg riscv_emit_set (dest, src);
1585 1.1 mrg return;
1586 1.1 mrg }
1587 1.1 mrg
1588 1.1 mrg /* Generate the appropriate access sequences for TLS symbols. */
1589 1.1 mrg if (riscv_tls_symbol_p (src))
1590 1.1 mrg {
1591 1.1 mrg riscv_emit_move (dest, riscv_legitimize_tls_address (src));
1592 1.1 mrg return;
1593 1.1 mrg }
1594 1.1 mrg
1595 1.1 mrg /* If we have (const (plus symbol offset)), and that expression cannot
1596 1.1 mrg be forced into memory, load the symbol first and add in the offset. Also
1597 1.1 mrg prefer to do this even if the constant _can_ be forced into memory, as it
1598 1.1 mrg usually produces better code. */
1599 1.1 mrg split_const (src, &base, &offset);
1600 1.1 mrg if (offset != const0_rtx
1601 1.1 mrg && (targetm.cannot_force_const_mem (mode, src) || can_create_pseudo_p ()))
1602 1.1 mrg {
1603 1.1 mrg base = riscv_force_temporary (dest, base, FALSE);
1604 1.1 mrg riscv_emit_move (dest, riscv_add_offset (NULL, base, INTVAL (offset)));
1605 1.1 mrg return;
1606 1.1 mrg }
1607 1.1 mrg
1608 1.1 mrg src = force_const_mem (mode, src);
1609 1.1 mrg
1610 1.1 mrg /* When using explicit relocs, constant pool references are sometimes
1611 1.1 mrg not legitimate addresses. */
1612 1.1 mrg riscv_split_symbol (dest, XEXP (src, 0), mode, &XEXP (src, 0), FALSE);
1613 1.1 mrg riscv_emit_move (dest, src);
1614 1.1 mrg }
1615 1.1 mrg
1616 1.1 mrg /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
1617 1.1 mrg sequence that is valid. */
1618 1.1 mrg
1619 1.1 mrg bool
1620 1.1 mrg riscv_legitimize_move (machine_mode mode, rtx dest, rtx src)
1621 1.1 mrg {
1622 1.1 mrg /* Expand
1623 1.1 mrg (set (reg:QI target) (mem:QI (address)))
1624 1.1 mrg to
1625 1.1 mrg (set (reg:DI temp) (zero_extend:DI (mem:QI (address))))
1626 1.1 mrg (set (reg:QI target) (subreg:QI (reg:DI temp) 0))
1627 1.1 mrg with auto-sign/zero extend. */
1628 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_INT
1629 1.1 mrg && GET_MODE_SIZE (mode) < UNITS_PER_WORD
1630 1.1 mrg && can_create_pseudo_p ()
1631 1.1 mrg && MEM_P (src))
1632 1.1 mrg {
1633 1.1 mrg rtx temp_reg;
1634 1.1 mrg int zero_extend_p;
1635 1.1 mrg
1636 1.1 mrg temp_reg = gen_reg_rtx (word_mode);
1637 1.1 mrg zero_extend_p = (LOAD_EXTEND_OP (mode) == ZERO_EXTEND);
1638 1.1 mrg emit_insn (gen_extend_insn (temp_reg, src, word_mode, mode,
1639 1.1 mrg zero_extend_p));
1640 1.1 mrg riscv_emit_move (dest, gen_lowpart (mode, temp_reg));
1641 1.1 mrg return true;
1642 1.1 mrg }
1643 1.1 mrg
1644 1.1 mrg if (!register_operand (dest, mode) && !reg_or_0_operand (src, mode))
1645 1.1 mrg {
1646 1.1 mrg rtx reg;
1647 1.1 mrg
1648 1.1 mrg if (GET_CODE (src) == CONST_INT)
1649 1.1 mrg {
1650 1.1 mrg /* Apply the equivalent of PROMOTE_MODE here for constants to
1651 1.1 mrg improve cse. */
1652 1.1 mrg machine_mode promoted_mode = mode;
1653 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_INT
1654 1.1 mrg && GET_MODE_SIZE (mode) < UNITS_PER_WORD)
1655 1.1 mrg promoted_mode = word_mode;
1656 1.1 mrg
1657 1.1 mrg if (splittable_const_int_operand (src, mode))
1658 1.1 mrg {
1659 1.1 mrg reg = gen_reg_rtx (promoted_mode);
1660 1.1 mrg riscv_move_integer (reg, reg, INTVAL (src), mode, FALSE);
1661 1.1 mrg }
1662 1.1 mrg else
1663 1.1 mrg reg = force_reg (promoted_mode, src);
1664 1.1 mrg
1665 1.1 mrg if (promoted_mode != mode)
1666 1.1 mrg reg = gen_lowpart (mode, reg);
1667 1.1 mrg }
1668 1.1 mrg else
1669 1.1 mrg reg = force_reg (mode, src);
1670 1.1 mrg riscv_emit_move (dest, reg);
1671 1.1 mrg return true;
1672 1.1 mrg }
1673 1.1 mrg
1674 1.1 mrg /* We need to deal with constants that would be legitimate
1675 1.1 mrg immediate_operands but aren't legitimate move_operands. */
1676 1.1 mrg if (CONSTANT_P (src) && !move_operand (src, mode))
1677 1.1 mrg {
1678 1.1 mrg riscv_legitimize_const_move (mode, dest, src);
1679 1.1 mrg set_unique_reg_note (get_last_insn (), REG_EQUAL, copy_rtx (src));
1680 1.1 mrg return true;
1681 1.1 mrg }
1682 1.1 mrg
1683 1.1 mrg /* RISC-V GCC may generate non-legitimate address due to we provide some
1684 1.1 mrg pattern for optimize access PIC local symbol and it's make GCC generate
1685 1.1 mrg unrecognizable instruction during optmizing. */
1686 1.1 mrg
1687 1.1 mrg if (MEM_P (dest) && !riscv_legitimate_address_p (mode, XEXP (dest, 0),
1688 1.1 mrg reload_completed))
1689 1.1 mrg {
1690 1.1 mrg XEXP (dest, 0) = riscv_force_address (XEXP (dest, 0), mode);
1691 1.1 mrg }
1692 1.1 mrg
1693 1.1 mrg if (MEM_P (src) && !riscv_legitimate_address_p (mode, XEXP (src, 0),
1694 1.1 mrg reload_completed))
1695 1.1 mrg {
1696 1.1 mrg XEXP (src, 0) = riscv_force_address (XEXP (src, 0), mode);
1697 1.1 mrg }
1698 1.1 mrg
1699 1.1 mrg return false;
1700 1.1 mrg }
1701 1.1 mrg
1702 1.1 mrg /* Return true if there is an instruction that implements CODE and accepts
1703 1.1 mrg X as an immediate operand. */
1704 1.1 mrg
1705 1.1 mrg static int
1706 1.1 mrg riscv_immediate_operand_p (int code, HOST_WIDE_INT x)
1707 1.1 mrg {
1708 1.1 mrg switch (code)
1709 1.1 mrg {
1710 1.1 mrg case ASHIFT:
1711 1.1 mrg case ASHIFTRT:
1712 1.1 mrg case LSHIFTRT:
1713 1.1 mrg /* All shift counts are truncated to a valid constant. */
1714 1.1 mrg return true;
1715 1.1 mrg
1716 1.1 mrg case AND:
1717 1.1 mrg case IOR:
1718 1.1 mrg case XOR:
1719 1.1 mrg case PLUS:
1720 1.1 mrg case LT:
1721 1.1 mrg case LTU:
1722 1.1 mrg /* These instructions take 12-bit signed immediates. */
1723 1.1 mrg return SMALL_OPERAND (x);
1724 1.1 mrg
1725 1.1 mrg case LE:
1726 1.1 mrg /* We add 1 to the immediate and use SLT. */
1727 1.1 mrg return SMALL_OPERAND (x + 1);
1728 1.1 mrg
1729 1.1 mrg case LEU:
1730 1.1 mrg /* Likewise SLTU, but reject the always-true case. */
1731 1.1 mrg return SMALL_OPERAND (x + 1) && x + 1 != 0;
1732 1.1 mrg
1733 1.1 mrg case GE:
1734 1.1 mrg case GEU:
1735 1.1 mrg /* We can emulate an immediate of 1 by using GT/GTU against x0. */
1736 1.1 mrg return x == 1;
1737 1.1 mrg
1738 1.1 mrg default:
1739 1.1 mrg /* By default assume that x0 can be used for 0. */
1740 1.1 mrg return x == 0;
1741 1.1 mrg }
1742 1.1 mrg }
1743 1.1 mrg
1744 1.1 mrg /* Return the cost of binary operation X, given that the instruction
1745 1.1 mrg sequence for a word-sized or smaller operation takes SIGNLE_INSNS
1746 1.1 mrg instructions and that the sequence of a double-word operation takes
1747 1.1 mrg DOUBLE_INSNS instructions. */
1748 1.1 mrg
1749 1.1 mrg static int
1750 1.1 mrg riscv_binary_cost (rtx x, int single_insns, int double_insns)
1751 1.1 mrg {
1752 1.1 mrg if (GET_MODE_SIZE (GET_MODE (x)) == UNITS_PER_WORD * 2)
1753 1.1 mrg return COSTS_N_INSNS (double_insns);
1754 1.1 mrg return COSTS_N_INSNS (single_insns);
1755 1.1 mrg }
1756 1.1 mrg
1757 1.1 mrg /* Return the cost of sign- or zero-extending OP. */
1758 1.1 mrg
1759 1.1 mrg static int
1760 1.1 mrg riscv_extend_cost (rtx op, bool unsigned_p)
1761 1.1 mrg {
1762 1.1 mrg if (MEM_P (op))
1763 1.1 mrg return 0;
1764 1.1 mrg
1765 1.1 mrg if (unsigned_p && GET_MODE (op) == QImode)
1766 1.1 mrg /* We can use ANDI. */
1767 1.1 mrg return COSTS_N_INSNS (1);
1768 1.1 mrg
1769 1.1 mrg /* ZBA provide zext.w. */
1770 1.1 mrg if (TARGET_ZBA && TARGET_64BIT && unsigned_p && GET_MODE (op) == SImode)
1771 1.1 mrg return COSTS_N_INSNS (1);
1772 1.1 mrg
1773 1.1 mrg /* ZBB provide zext.h, sext.b and sext.h. */
1774 1.1 mrg if (TARGET_ZBB)
1775 1.1 mrg {
1776 1.1 mrg if (!unsigned_p && GET_MODE (op) == QImode)
1777 1.1 mrg return COSTS_N_INSNS (1);
1778 1.1 mrg
1779 1.1 mrg if (GET_MODE (op) == HImode)
1780 1.1 mrg return COSTS_N_INSNS (1);
1781 1.1 mrg }
1782 1.1 mrg
1783 1.1 mrg if (!unsigned_p && GET_MODE (op) == SImode)
1784 1.1 mrg /* We can use SEXT.W. */
1785 1.1 mrg return COSTS_N_INSNS (1);
1786 1.1 mrg
1787 1.1 mrg /* We need to use a shift left and a shift right. */
1788 1.1 mrg return COSTS_N_INSNS (2);
1789 1.1 mrg }
1790 1.1 mrg
1791 1.1 mrg /* Implement TARGET_RTX_COSTS. */
1792 1.1 mrg
1793 1.1 mrg #define SINGLE_SHIFT_COST 1
1794 1.1 mrg
1795 1.1 mrg static bool
1796 1.1 mrg riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UNUSED,
1797 1.1 mrg int *total, bool speed)
1798 1.1 mrg {
1799 1.1 mrg bool float_mode_p = FLOAT_MODE_P (mode);
1800 1.1 mrg int cost;
1801 1.1 mrg
1802 1.1 mrg switch (GET_CODE (x))
1803 1.1 mrg {
1804 1.1 mrg case CONST_INT:
1805 1.1 mrg if (riscv_immediate_operand_p (outer_code, INTVAL (x)))
1806 1.1 mrg {
1807 1.1 mrg *total = 0;
1808 1.1 mrg return true;
1809 1.1 mrg }
1810 1.1 mrg /* Fall through. */
1811 1.1 mrg
1812 1.1 mrg case SYMBOL_REF:
1813 1.1 mrg case LABEL_REF:
1814 1.1 mrg case CONST_DOUBLE:
1815 1.1 mrg case CONST:
1816 1.1 mrg if ((cost = riscv_const_insns (x)) > 0)
1817 1.1 mrg {
1818 1.1 mrg /* If the constant is likely to be stored in a GPR, SETs of
1819 1.1 mrg single-insn constants are as cheap as register sets; we
1820 1.1 mrg never want to CSE them. */
1821 1.1 mrg if (cost == 1 && outer_code == SET)
1822 1.1 mrg *total = 0;
1823 1.1 mrg /* When we load a constant more than once, it usually is better
1824 1.1 mrg to duplicate the last operation in the sequence than to CSE
1825 1.1 mrg the constant itself. */
1826 1.1 mrg else if (outer_code == SET || GET_MODE (x) == VOIDmode)
1827 1.1 mrg *total = COSTS_N_INSNS (1);
1828 1.1 mrg }
1829 1.1 mrg else /* The instruction will be fetched from the constant pool. */
1830 1.1 mrg *total = COSTS_N_INSNS (riscv_symbol_insns (SYMBOL_ABSOLUTE));
1831 1.1 mrg return true;
1832 1.1 mrg
1833 1.1 mrg case MEM:
1834 1.1 mrg /* If the address is legitimate, return the number of
1835 1.1 mrg instructions it needs. */
1836 1.1 mrg if ((cost = riscv_address_insns (XEXP (x, 0), mode, true)) > 0)
1837 1.1 mrg {
1838 1.1 mrg /* When optimizing for size, make uncompressible 32-bit addresses
1839 1.1 mrg more expensive so that compressible 32-bit addresses are
1840 1.1 mrg preferred. */
1841 1.1 mrg if (TARGET_RVC && !speed && riscv_mshorten_memrefs && mode == SImode
1842 1.1 mrg && !riscv_compressed_lw_address_p (XEXP (x, 0)))
1843 1.1 mrg cost++;
1844 1.1 mrg
1845 1.1 mrg *total = COSTS_N_INSNS (cost + tune_param->memory_cost);
1846 1.1 mrg return true;
1847 1.1 mrg }
1848 1.1 mrg /* Otherwise use the default handling. */
1849 1.1 mrg return false;
1850 1.1 mrg
1851 1.1 mrg case NOT:
1852 1.1 mrg *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 2 : 1);
1853 1.1 mrg return false;
1854 1.1 mrg
1855 1.1 mrg case AND:
1856 1.1 mrg /* slli.uw pattern for zba. */
1857 1.1 mrg if (TARGET_ZBA && TARGET_64BIT && mode == DImode
1858 1.1 mrg && GET_CODE (XEXP (x, 0)) == ASHIFT)
1859 1.1 mrg {
1860 1.1 mrg rtx and_rhs = XEXP (x, 1);
1861 1.1 mrg rtx ashift_lhs = XEXP (XEXP (x, 0), 0);
1862 1.1 mrg rtx ashift_rhs = XEXP (XEXP (x, 0), 1);
1863 1.1 mrg if (REG_P (ashift_lhs)
1864 1.1 mrg && CONST_INT_P (ashift_rhs)
1865 1.1 mrg && CONST_INT_P (and_rhs)
1866 1.1 mrg && ((INTVAL (and_rhs) >> INTVAL (ashift_rhs)) == 0xffffffff))
1867 1.1 mrg *total = COSTS_N_INSNS (1);
1868 1.1 mrg return true;
1869 1.1 mrg }
1870 1.1 mrg /* bclri pattern for zbs. */
1871 1.1 mrg if (TARGET_ZBS
1872 1.1 mrg && not_single_bit_mask_operand (XEXP (x, 1), VOIDmode))
1873 1.1 mrg {
1874 1.1 mrg *total = COSTS_N_INSNS (1);
1875 1.1 mrg return true;
1876 1.1 mrg }
1877 1.1 mrg /* bclr pattern for zbs. */
1878 1.1 mrg if (TARGET_ZBS
1879 1.1 mrg && REG_P (XEXP (x, 1))
1880 1.1 mrg && GET_CODE (XEXP (x, 0)) == ROTATE
1881 1.1 mrg && CONST_INT_P (XEXP ((XEXP (x, 0)), 0))
1882 1.1 mrg && INTVAL (XEXP ((XEXP (x, 0)), 0)) == -2)
1883 1.1 mrg {
1884 1.1 mrg *total = COSTS_N_INSNS (1);
1885 1.1 mrg return true;
1886 1.1 mrg }
1887 1.1 mrg
1888 1.1 mrg gcc_fallthrough ();
1889 1.1 mrg case IOR:
1890 1.1 mrg case XOR:
1891 1.1 mrg /* orn, andn and xorn pattern for zbb. */
1892 1.1 mrg if (TARGET_ZBB
1893 1.1 mrg && GET_CODE (XEXP (x, 0)) == NOT)
1894 1.1 mrg {
1895 1.1 mrg *total = riscv_binary_cost (x, 1, 2);
1896 1.1 mrg return true;
1897 1.1 mrg }
1898 1.1 mrg
1899 1.1 mrg /* bset[i] and binv[i] pattern for zbs. */
1900 1.1 mrg if ((GET_CODE (x) == IOR || GET_CODE (x) == XOR)
1901 1.1 mrg && TARGET_ZBS
1902 1.1 mrg && ((GET_CODE (XEXP (x, 0)) == ASHIFT
1903 1.1 mrg && CONST_INT_P (XEXP (XEXP (x, 0), 0)))
1904 1.1 mrg || single_bit_mask_operand (XEXP (x, 1), VOIDmode)))
1905 1.1 mrg {
1906 1.1 mrg *total = COSTS_N_INSNS (1);
1907 1.1 mrg return true;
1908 1.1 mrg }
1909 1.1 mrg
1910 1.1 mrg /* Double-word operations use two single-word operations. */
1911 1.1 mrg *total = riscv_binary_cost (x, 1, 2);
1912 1.1 mrg return false;
1913 1.1 mrg
1914 1.1 mrg case ZERO_EXTRACT:
1915 1.1 mrg /* This is an SImode shift. */
1916 1.1 mrg if (outer_code == SET
1917 1.1 mrg && CONST_INT_P (XEXP (x, 1))
1918 1.1 mrg && CONST_INT_P (XEXP (x, 2))
1919 1.1 mrg && (INTVAL (XEXP (x, 2)) > 0)
1920 1.1 mrg && (INTVAL (XEXP (x, 1)) + INTVAL (XEXP (x, 2)) == 32))
1921 1.1 mrg {
1922 1.1 mrg *total = COSTS_N_INSNS (SINGLE_SHIFT_COST);
1923 1.1 mrg return true;
1924 1.1 mrg }
1925 1.1 mrg /* bext pattern for zbs. */
1926 1.1 mrg if (TARGET_ZBS && outer_code == SET
1927 1.1 mrg && GET_CODE (XEXP (x, 1)) == CONST_INT
1928 1.1 mrg && INTVAL (XEXP (x, 1)) == 1)
1929 1.1 mrg {
1930 1.1 mrg *total = COSTS_N_INSNS (SINGLE_SHIFT_COST);
1931 1.1 mrg return true;
1932 1.1 mrg }
1933 1.1 mrg return false;
1934 1.1 mrg
1935 1.1 mrg case ASHIFT:
1936 1.1 mrg /* bset pattern for zbs. */
1937 1.1 mrg if (TARGET_ZBS
1938 1.1 mrg && CONST_INT_P (XEXP (x, 0))
1939 1.1 mrg && INTVAL (XEXP (x, 0)) == 1)
1940 1.1 mrg {
1941 1.1 mrg *total = COSTS_N_INSNS (1);
1942 1.1 mrg return true;
1943 1.1 mrg }
1944 1.1 mrg gcc_fallthrough ();
1945 1.1 mrg case ASHIFTRT:
1946 1.1 mrg case LSHIFTRT:
1947 1.1 mrg *total = riscv_binary_cost (x, SINGLE_SHIFT_COST,
1948 1.1 mrg CONSTANT_P (XEXP (x, 1)) ? 4 : 9);
1949 1.1 mrg return false;
1950 1.1 mrg
1951 1.1 mrg case ABS:
1952 1.1 mrg *total = COSTS_N_INSNS (float_mode_p ? 1 : 3);
1953 1.1 mrg return false;
1954 1.1 mrg
1955 1.1 mrg case LO_SUM:
1956 1.1 mrg *total = set_src_cost (XEXP (x, 0), mode, speed);
1957 1.1 mrg return true;
1958 1.1 mrg
1959 1.1 mrg case LT:
1960 1.1 mrg /* This is an SImode shift. */
1961 1.1 mrg if (outer_code == SET && GET_MODE (x) == DImode
1962 1.1 mrg && GET_MODE (XEXP (x, 0)) == SImode)
1963 1.1 mrg {
1964 1.1 mrg *total = COSTS_N_INSNS (SINGLE_SHIFT_COST);
1965 1.1 mrg return true;
1966 1.1 mrg }
1967 1.1 mrg /* Fall through. */
1968 1.1 mrg case LTU:
1969 1.1 mrg case LE:
1970 1.1 mrg case LEU:
1971 1.1 mrg case GT:
1972 1.1 mrg case GTU:
1973 1.1 mrg case GE:
1974 1.1 mrg case GEU:
1975 1.1 mrg case EQ:
1976 1.1 mrg case NE:
1977 1.1 mrg /* Branch comparisons have VOIDmode, so use the first operand's
1978 1.1 mrg mode instead. */
1979 1.1 mrg mode = GET_MODE (XEXP (x, 0));
1980 1.1 mrg if (float_mode_p)
1981 1.1 mrg *total = tune_param->fp_add[mode == DFmode];
1982 1.1 mrg else
1983 1.1 mrg *total = riscv_binary_cost (x, 1, 3);
1984 1.1 mrg return false;
1985 1.1 mrg
1986 1.1 mrg case UNORDERED:
1987 1.1 mrg case ORDERED:
1988 1.1 mrg /* (FEQ(A, A) & FEQ(B, B)) compared against 0. */
1989 1.1 mrg mode = GET_MODE (XEXP (x, 0));
1990 1.1 mrg *total = tune_param->fp_add[mode == DFmode] + COSTS_N_INSNS (2);
1991 1.1 mrg return false;
1992 1.1 mrg
1993 1.1 mrg case UNEQ:
1994 1.1 mrg /* (FEQ(A, A) & FEQ(B, B)) compared against FEQ(A, B). */
1995 1.1 mrg mode = GET_MODE (XEXP (x, 0));
1996 1.1 mrg *total = tune_param->fp_add[mode == DFmode] + COSTS_N_INSNS (3);
1997 1.1 mrg return false;
1998 1.1 mrg
1999 1.1 mrg case LTGT:
2000 1.1 mrg /* (FLT(A, A) || FGT(B, B)). */
2001 1.1 mrg mode = GET_MODE (XEXP (x, 0));
2002 1.1 mrg *total = tune_param->fp_add[mode == DFmode] + COSTS_N_INSNS (2);
2003 1.1 mrg return false;
2004 1.1 mrg
2005 1.1 mrg case UNGE:
2006 1.1 mrg case UNGT:
2007 1.1 mrg case UNLE:
2008 1.1 mrg case UNLT:
2009 1.1 mrg /* FLT or FLE, but guarded by an FFLAGS read and write. */
2010 1.1 mrg mode = GET_MODE (XEXP (x, 0));
2011 1.1 mrg *total = tune_param->fp_add[mode == DFmode] + COSTS_N_INSNS (4);
2012 1.1 mrg return false;
2013 1.1 mrg
2014 1.1 mrg case MINUS:
2015 1.1 mrg case PLUS:
2016 1.1 mrg /* add.uw pattern for zba. */
2017 1.1 mrg if (TARGET_ZBA
2018 1.1 mrg && (TARGET_64BIT && (mode == DImode))
2019 1.1 mrg && GET_CODE (XEXP (x, 0)) == ZERO_EXTEND
2020 1.1 mrg && REG_P (XEXP (XEXP (x, 0), 0))
2021 1.1 mrg && GET_MODE (XEXP (XEXP (x, 0), 0)) == SImode)
2022 1.1 mrg {
2023 1.1 mrg *total = COSTS_N_INSNS (1);
2024 1.1 mrg return true;
2025 1.1 mrg }
2026 1.1 mrg /* shNadd pattern for zba. */
2027 1.1 mrg if (TARGET_ZBA
2028 1.1 mrg && ((!TARGET_64BIT && (mode == SImode)) ||
2029 1.1 mrg (TARGET_64BIT && (mode == DImode)))
2030 1.1 mrg && (GET_CODE (XEXP (x, 0)) == ASHIFT)
2031 1.1 mrg && REG_P (XEXP (XEXP (x, 0), 0))
2032 1.1 mrg && CONST_INT_P (XEXP (XEXP (x, 0), 1))
2033 1.1 mrg && IN_RANGE (INTVAL (XEXP (XEXP (x, 0), 1)), 1, 3))
2034 1.1 mrg {
2035 1.1 mrg *total = COSTS_N_INSNS (1);
2036 1.1 mrg return true;
2037 1.1 mrg }
2038 1.1 mrg /* shNadd.uw pattern for zba.
2039 1.1 mrg [(set (match_operand:DI 0 "register_operand" "=r")
2040 1.1 mrg (plus:DI
2041 1.1 mrg (and:DI (ashift:DI (match_operand:DI 1 "register_operand" "r")
2042 1.1 mrg (match_operand:QI 2 "immediate_operand" "I"))
2043 1.1 mrg (match_operand 3 "immediate_operand" ""))
2044 1.1 mrg (match_operand:DI 4 "register_operand" "r")))]
2045 1.1 mrg "TARGET_64BIT && TARGET_ZBA
2046 1.1 mrg && (INTVAL (operands[2]) >= 1) && (INTVAL (operands[2]) <= 3)
2047 1.1 mrg && (INTVAL (operands[3]) >> INTVAL (operands[2])) == 0xffffffff"
2048 1.1 mrg */
2049 1.1 mrg if (TARGET_ZBA
2050 1.1 mrg && (TARGET_64BIT && (mode == DImode))
2051 1.1 mrg && (GET_CODE (XEXP (x, 0)) == AND)
2052 1.1 mrg && (REG_P (XEXP (x, 1))))
2053 1.1 mrg {
2054 1.1 mrg do {
2055 1.1 mrg rtx and_lhs = XEXP (XEXP (x, 0), 0);
2056 1.1 mrg rtx and_rhs = XEXP (XEXP (x, 0), 1);
2057 1.1 mrg if (GET_CODE (and_lhs) != ASHIFT)
2058 1.1 mrg break;
2059 1.1 mrg if (!CONST_INT_P (and_rhs))
2060 1.1 mrg break;
2061 1.1 mrg
2062 1.1 mrg rtx ashift_rhs = XEXP (and_lhs, 1);
2063 1.1 mrg
2064 1.1 mrg if (!CONST_INT_P (ashift_rhs)
2065 1.1 mrg || !IN_RANGE (INTVAL (ashift_rhs), 1, 3))
2066 1.1 mrg break;
2067 1.1 mrg
2068 1.1 mrg if (CONST_INT_P (and_rhs)
2069 1.1 mrg && ((INTVAL (and_rhs) >> INTVAL (ashift_rhs)) == 0xffffffff))
2070 1.1 mrg {
2071 1.1 mrg *total = COSTS_N_INSNS (1);
2072 1.1 mrg return true;
2073 1.1 mrg }
2074 1.1 mrg } while (false);
2075 1.1 mrg }
2076 1.1 mrg
2077 1.1 mrg if (float_mode_p)
2078 1.1 mrg *total = tune_param->fp_add[mode == DFmode];
2079 1.1 mrg else
2080 1.1 mrg *total = riscv_binary_cost (x, 1, 4);
2081 1.1 mrg return false;
2082 1.1 mrg
2083 1.1 mrg case NEG:
2084 1.1 mrg {
2085 1.1 mrg rtx op = XEXP (x, 0);
2086 1.1 mrg if (GET_CODE (op) == FMA && !HONOR_SIGNED_ZEROS (mode))
2087 1.1 mrg {
2088 1.1 mrg *total = (tune_param->fp_mul[mode == DFmode]
2089 1.1 mrg + set_src_cost (XEXP (op, 0), mode, speed)
2090 1.1 mrg + set_src_cost (XEXP (op, 1), mode, speed)
2091 1.1 mrg + set_src_cost (XEXP (op, 2), mode, speed));
2092 1.1 mrg return true;
2093 1.1 mrg }
2094 1.1 mrg }
2095 1.1 mrg
2096 1.1 mrg if (float_mode_p)
2097 1.1 mrg *total = tune_param->fp_add[mode == DFmode];
2098 1.1 mrg else
2099 1.1 mrg *total = COSTS_N_INSNS (GET_MODE_SIZE (mode) > UNITS_PER_WORD ? 4 : 1);
2100 1.1 mrg return false;
2101 1.1 mrg
2102 1.1 mrg case MULT:
2103 1.1 mrg if (float_mode_p)
2104 1.1 mrg *total = tune_param->fp_mul[mode == DFmode];
2105 1.1 mrg else if (!TARGET_MUL)
2106 1.1 mrg /* Estimate the cost of a library call. */
2107 1.1 mrg *total = COSTS_N_INSNS (speed ? 32 : 6);
2108 1.1 mrg else if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
2109 1.1 mrg *total = 3 * tune_param->int_mul[0] + COSTS_N_INSNS (2);
2110 1.1 mrg else if (!speed)
2111 1.1 mrg *total = COSTS_N_INSNS (1);
2112 1.1 mrg else
2113 1.1 mrg *total = tune_param->int_mul[mode == DImode];
2114 1.1 mrg return false;
2115 1.1 mrg
2116 1.1 mrg case DIV:
2117 1.1 mrg case SQRT:
2118 1.1 mrg case MOD:
2119 1.1 mrg if (float_mode_p)
2120 1.1 mrg {
2121 1.1 mrg *total = tune_param->fp_div[mode == DFmode];
2122 1.1 mrg return false;
2123 1.1 mrg }
2124 1.1 mrg /* Fall through. */
2125 1.1 mrg
2126 1.1 mrg case UDIV:
2127 1.1 mrg case UMOD:
2128 1.1 mrg if (!TARGET_DIV)
2129 1.1 mrg /* Estimate the cost of a library call. */
2130 1.1 mrg *total = COSTS_N_INSNS (speed ? 32 : 6);
2131 1.1 mrg else if (speed)
2132 1.1 mrg *total = tune_param->int_div[mode == DImode];
2133 1.1 mrg else
2134 1.1 mrg *total = COSTS_N_INSNS (1);
2135 1.1 mrg return false;
2136 1.1 mrg
2137 1.1 mrg case ZERO_EXTEND:
2138 1.1 mrg /* This is an SImode shift. */
2139 1.1 mrg if (GET_CODE (XEXP (x, 0)) == LSHIFTRT)
2140 1.1 mrg {
2141 1.1 mrg *total = COSTS_N_INSNS (SINGLE_SHIFT_COST);
2142 1.1 mrg return true;
2143 1.1 mrg }
2144 1.1 mrg /* Fall through. */
2145 1.1 mrg case SIGN_EXTEND:
2146 1.1 mrg *total = riscv_extend_cost (XEXP (x, 0), GET_CODE (x) == ZERO_EXTEND);
2147 1.1 mrg return false;
2148 1.1 mrg
2149 1.1 mrg case FLOAT:
2150 1.1 mrg case UNSIGNED_FLOAT:
2151 1.1 mrg case FIX:
2152 1.1 mrg case FLOAT_EXTEND:
2153 1.1 mrg case FLOAT_TRUNCATE:
2154 1.1 mrg *total = tune_param->fp_add[mode == DFmode];
2155 1.1 mrg return false;
2156 1.1 mrg
2157 1.1 mrg case FMA:
2158 1.1 mrg *total = (tune_param->fp_mul[mode == DFmode]
2159 1.1 mrg + set_src_cost (XEXP (x, 0), mode, speed)
2160 1.1 mrg + set_src_cost (XEXP (x, 1), mode, speed)
2161 1.1 mrg + set_src_cost (XEXP (x, 2), mode, speed));
2162 1.1 mrg return true;
2163 1.1 mrg
2164 1.1 mrg case UNSPEC:
2165 1.1 mrg if (XINT (x, 1) == UNSPEC_AUIPC)
2166 1.1 mrg {
2167 1.1 mrg /* Make AUIPC cheap to avoid spilling its result to the stack. */
2168 1.1 mrg *total = 1;
2169 1.1 mrg return true;
2170 1.1 mrg }
2171 1.1 mrg return false;
2172 1.1 mrg
2173 1.1 mrg default:
2174 1.1 mrg return false;
2175 1.1 mrg }
2176 1.1 mrg }
2177 1.1 mrg
2178 1.1 mrg /* Implement TARGET_ADDRESS_COST. */
2179 1.1 mrg
2180 1.1 mrg static int
2181 1.1 mrg riscv_address_cost (rtx addr, machine_mode mode,
2182 1.1 mrg addr_space_t as ATTRIBUTE_UNUSED,
2183 1.1 mrg bool speed ATTRIBUTE_UNUSED)
2184 1.1 mrg {
2185 1.1 mrg /* When optimizing for size, make uncompressible 32-bit addresses more
2186 1.1 mrg * expensive so that compressible 32-bit addresses are preferred. */
2187 1.1 mrg if (TARGET_RVC && !speed && riscv_mshorten_memrefs && mode == SImode
2188 1.1 mrg && !riscv_compressed_lw_address_p (addr))
2189 1.1 mrg return riscv_address_insns (addr, mode, false) + 1;
2190 1.1 mrg return riscv_address_insns (addr, mode, false);
2191 1.1 mrg }
2192 1.1 mrg
2193 1.1 mrg /* Return one word of double-word value OP. HIGH_P is true to select the
2194 1.1 mrg high part or false to select the low part. */
2195 1.1 mrg
2196 1.1 mrg rtx
2197 1.1 mrg riscv_subword (rtx op, bool high_p)
2198 1.1 mrg {
2199 1.1 mrg unsigned int byte = (high_p != BYTES_BIG_ENDIAN) ? UNITS_PER_WORD : 0;
2200 1.1 mrg machine_mode mode = GET_MODE (op);
2201 1.1 mrg
2202 1.1 mrg if (mode == VOIDmode)
2203 1.1 mrg mode = TARGET_64BIT ? TImode : DImode;
2204 1.1 mrg
2205 1.1 mrg if (MEM_P (op))
2206 1.1 mrg return adjust_address (op, word_mode, byte);
2207 1.1 mrg
2208 1.1 mrg if (REG_P (op))
2209 1.1 mrg gcc_assert (!FP_REG_RTX_P (op));
2210 1.1 mrg
2211 1.1 mrg return simplify_gen_subreg (word_mode, op, mode, byte);
2212 1.1 mrg }
2213 1.1 mrg
2214 1.1 mrg /* Return true if a 64-bit move from SRC to DEST should be split into two. */
2215 1.1 mrg
2216 1.1 mrg bool
2217 1.1 mrg riscv_split_64bit_move_p (rtx dest, rtx src)
2218 1.1 mrg {
2219 1.1 mrg if (TARGET_64BIT)
2220 1.1 mrg return false;
2221 1.1 mrg
2222 1.1 mrg /* Allow FPR <-> FPR and FPR <-> MEM moves, and permit the special case
2223 1.1 mrg of zeroing an FPR with FCVT.D.W. */
2224 1.1 mrg if (TARGET_DOUBLE_FLOAT
2225 1.1 mrg && ((FP_REG_RTX_P (src) && FP_REG_RTX_P (dest))
2226 1.1 mrg || (FP_REG_RTX_P (dest) && MEM_P (src))
2227 1.1 mrg || (FP_REG_RTX_P (src) && MEM_P (dest))
2228 1.1 mrg || (FP_REG_RTX_P (dest) && src == CONST0_RTX (GET_MODE (src)))))
2229 1.1 mrg return false;
2230 1.1 mrg
2231 1.1 mrg return true;
2232 1.1 mrg }
2233 1.1 mrg
2234 1.1 mrg /* Split a doubleword move from SRC to DEST. On 32-bit targets,
2235 1.1 mrg this function handles 64-bit moves for which riscv_split_64bit_move_p
2236 1.1 mrg holds. For 64-bit targets, this function handles 128-bit moves. */
2237 1.1 mrg
2238 1.1 mrg void
2239 1.1 mrg riscv_split_doubleword_move (rtx dest, rtx src)
2240 1.1 mrg {
2241 1.1 mrg rtx low_dest;
2242 1.1 mrg
2243 1.1 mrg /* The operation can be split into two normal moves. Decide in
2244 1.1 mrg which order to do them. */
2245 1.1 mrg low_dest = riscv_subword (dest, false);
2246 1.1 mrg if (REG_P (low_dest) && reg_overlap_mentioned_p (low_dest, src))
2247 1.1 mrg {
2248 1.1 mrg riscv_emit_move (riscv_subword (dest, true), riscv_subword (src, true));
2249 1.1 mrg riscv_emit_move (low_dest, riscv_subword (src, false));
2250 1.1 mrg }
2251 1.1 mrg else
2252 1.1 mrg {
2253 1.1 mrg riscv_emit_move (low_dest, riscv_subword (src, false));
2254 1.1 mrg riscv_emit_move (riscv_subword (dest, true), riscv_subword (src, true));
2255 1.1 mrg }
2256 1.1 mrg }
2257 1.1 mrg
2258 1.1 mrg /* Return the appropriate instructions to move SRC into DEST. Assume
2260 1.1 mrg that SRC is operand 1 and DEST is operand 0. */
2261 1.1 mrg
2262 1.1 mrg const char *
2263 1.1 mrg riscv_output_move (rtx dest, rtx src)
2264 1.1 mrg {
2265 1.1 mrg enum rtx_code dest_code, src_code;
2266 1.1 mrg machine_mode mode;
2267 1.1 mrg bool dbl_p;
2268 1.1 mrg
2269 1.1 mrg dest_code = GET_CODE (dest);
2270 1.1 mrg src_code = GET_CODE (src);
2271 1.1 mrg mode = GET_MODE (dest);
2272 1.1 mrg dbl_p = (GET_MODE_SIZE (mode) == 8);
2273 1.1 mrg
2274 1.1 mrg if (dbl_p && riscv_split_64bit_move_p (dest, src))
2275 1.1 mrg return "#";
2276 1.1 mrg
2277 1.1 mrg if (dest_code == REG && GP_REG_P (REGNO (dest)))
2278 1.1 mrg {
2279 1.1 mrg if (src_code == REG && FP_REG_P (REGNO (src)))
2280 1.1 mrg return dbl_p ? "fmv.x.d\t%0,%1" : "fmv.x.w\t%0,%1";
2281 1.1 mrg
2282 1.1 mrg if (src_code == MEM)
2283 1.1 mrg switch (GET_MODE_SIZE (mode))
2284 1.1 mrg {
2285 1.1 mrg case 1: return "lbu\t%0,%1";
2286 1.1 mrg case 2: return "lhu\t%0,%1";
2287 1.1 mrg case 4: return "lw\t%0,%1";
2288 1.1 mrg case 8: return "ld\t%0,%1";
2289 1.1 mrg }
2290 1.1 mrg
2291 1.1 mrg if (src_code == CONST_INT)
2292 1.1 mrg {
2293 1.1 mrg if (SMALL_OPERAND (INTVAL (src)) || LUI_OPERAND (INTVAL (src)))
2294 1.1 mrg return "li\t%0,%1";
2295 1.1 mrg
2296 1.1 mrg if (TARGET_ZBS
2297 1.1 mrg && SINGLE_BIT_MASK_OPERAND (INTVAL (src)))
2298 1.1 mrg return "bseti\t%0,zero,%S1";
2299 1.1 mrg
2300 1.1 mrg /* Should never reach here. */
2301 1.1 mrg abort ();
2302 1.1 mrg }
2303 1.1 mrg
2304 1.1 mrg if (src_code == HIGH)
2305 1.1 mrg return "lui\t%0,%h1";
2306 1.1 mrg
2307 1.1 mrg if (symbolic_operand (src, VOIDmode))
2308 1.1 mrg switch (riscv_classify_symbolic_expression (src))
2309 1.1 mrg {
2310 1.1 mrg case SYMBOL_GOT_DISP: return "la\t%0,%1";
2311 1.1 mrg case SYMBOL_ABSOLUTE: return "lla\t%0,%1";
2312 1.1 mrg case SYMBOL_PCREL: return "lla\t%0,%1";
2313 1.1 mrg default: gcc_unreachable ();
2314 1.1 mrg }
2315 1.1 mrg }
2316 1.1 mrg if ((src_code == REG && GP_REG_P (REGNO (src)))
2317 1.1 mrg || (src == CONST0_RTX (mode)))
2318 1.1 mrg {
2319 1.1 mrg if (dest_code == REG)
2320 1.1 mrg {
2321 1.1 mrg if (GP_REG_P (REGNO (dest)))
2322 1.1 mrg return "mv\t%0,%z1";
2323 1.1 mrg
2324 1.1 mrg if (FP_REG_P (REGNO (dest)))
2325 1.1 mrg {
2326 1.1 mrg if (!dbl_p)
2327 1.1 mrg return "fmv.w.x\t%0,%z1";
2328 1.1 mrg if (TARGET_64BIT)
2329 1.1 mrg return "fmv.d.x\t%0,%z1";
2330 1.1 mrg /* in RV32, we can emulate fmv.d.x %0, x0 using fcvt.d.w */
2331 1.1 mrg gcc_assert (src == CONST0_RTX (mode));
2332 1.1 mrg return "fcvt.d.w\t%0,x0";
2333 1.1 mrg }
2334 1.1 mrg }
2335 1.1 mrg if (dest_code == MEM)
2336 1.1 mrg switch (GET_MODE_SIZE (mode))
2337 1.1 mrg {
2338 1.1 mrg case 1: return "sb\t%z1,%0";
2339 1.1 mrg case 2: return "sh\t%z1,%0";
2340 1.1 mrg case 4: return "sw\t%z1,%0";
2341 1.1 mrg case 8: return "sd\t%z1,%0";
2342 1.1 mrg }
2343 1.1 mrg }
2344 1.1 mrg if (src_code == REG && FP_REG_P (REGNO (src)))
2345 1.1 mrg {
2346 1.1 mrg if (dest_code == REG && FP_REG_P (REGNO (dest)))
2347 1.1 mrg return dbl_p ? "fmv.d\t%0,%1" : "fmv.s\t%0,%1";
2348 1.1 mrg
2349 1.1 mrg if (dest_code == MEM)
2350 1.1 mrg return dbl_p ? "fsd\t%1,%0" : "fsw\t%1,%0";
2351 1.1 mrg }
2352 1.1 mrg if (dest_code == REG && FP_REG_P (REGNO (dest)))
2353 1.1 mrg {
2354 1.1 mrg if (src_code == MEM)
2355 1.1 mrg return dbl_p ? "fld\t%0,%1" : "flw\t%0,%1";
2356 1.1 mrg }
2357 1.1 mrg gcc_unreachable ();
2358 1.1 mrg }
2359 1.1 mrg
2360 1.1 mrg const char *
2361 1.1 mrg riscv_output_return ()
2362 1.1 mrg {
2363 1.1 mrg if (cfun->machine->naked_p)
2364 1.1 mrg return "";
2365 1.1 mrg
2366 1.1 mrg return "ret";
2367 1.1 mrg }
2368 1.1 mrg
2369 1.1 mrg
2370 1.1 mrg /* Return true if CMP1 is a suitable second operand for integer ordering
2372 1.1 mrg test CODE. See also the *sCC patterns in riscv.md. */
2373 1.1 mrg
2374 1.1 mrg static bool
2375 1.1 mrg riscv_int_order_operand_ok_p (enum rtx_code code, rtx cmp1)
2376 1.1 mrg {
2377 1.1 mrg switch (code)
2378 1.1 mrg {
2379 1.1 mrg case GT:
2380 1.1 mrg case GTU:
2381 1.1 mrg return reg_or_0_operand (cmp1, VOIDmode);
2382 1.1 mrg
2383 1.1 mrg case GE:
2384 1.1 mrg case GEU:
2385 1.1 mrg return cmp1 == const1_rtx;
2386 1.1 mrg
2387 1.1 mrg case LT:
2388 1.1 mrg case LTU:
2389 1.1 mrg return arith_operand (cmp1, VOIDmode);
2390 1.1 mrg
2391 1.1 mrg case LE:
2392 1.1 mrg return sle_operand (cmp1, VOIDmode);
2393 1.1 mrg
2394 1.1 mrg case LEU:
2395 1.1 mrg return sleu_operand (cmp1, VOIDmode);
2396 1.1 mrg
2397 1.1 mrg default:
2398 1.1 mrg gcc_unreachable ();
2399 1.1 mrg }
2400 1.1 mrg }
2401 1.1 mrg
2402 1.1 mrg /* Return true if *CMP1 (of mode MODE) is a valid second operand for
2403 1.1 mrg integer ordering test *CODE, or if an equivalent combination can
2404 1.1 mrg be formed by adjusting *CODE and *CMP1. When returning true, update
2405 1.1 mrg *CODE and *CMP1 with the chosen code and operand, otherwise leave
2406 1.1 mrg them alone. */
2407 1.1 mrg
2408 1.1 mrg static bool
2409 1.1 mrg riscv_canonicalize_int_order_test (enum rtx_code *code, rtx *cmp1,
2410 1.1 mrg machine_mode mode)
2411 1.1 mrg {
2412 1.1 mrg HOST_WIDE_INT plus_one;
2413 1.1 mrg
2414 1.1 mrg if (riscv_int_order_operand_ok_p (*code, *cmp1))
2415 1.1 mrg return true;
2416 1.1 mrg
2417 1.1 mrg if (CONST_INT_P (*cmp1))
2418 1.1 mrg switch (*code)
2419 1.1 mrg {
2420 1.1 mrg case LE:
2421 1.1 mrg plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
2422 1.1 mrg if (INTVAL (*cmp1) < plus_one)
2423 1.1 mrg {
2424 1.1 mrg *code = LT;
2425 1.1 mrg *cmp1 = force_reg (mode, GEN_INT (plus_one));
2426 1.1 mrg return true;
2427 1.1 mrg }
2428 1.1 mrg break;
2429 1.1 mrg
2430 1.1 mrg case LEU:
2431 1.1 mrg plus_one = trunc_int_for_mode (UINTVAL (*cmp1) + 1, mode);
2432 1.1 mrg if (plus_one != 0)
2433 1.1 mrg {
2434 1.1 mrg *code = LTU;
2435 1.1 mrg *cmp1 = force_reg (mode, GEN_INT (plus_one));
2436 1.1 mrg return true;
2437 1.1 mrg }
2438 1.1 mrg break;
2439 1.1 mrg
2440 1.1 mrg default:
2441 1.1 mrg break;
2442 1.1 mrg }
2443 1.1 mrg return false;
2444 1.1 mrg }
2445 1.1 mrg
2446 1.1 mrg /* Compare CMP0 and CMP1 using ordering test CODE and store the result
2447 1.1 mrg in TARGET. CMP0 and TARGET are register_operands. If INVERT_PTR
2448 1.1 mrg is nonnull, it's OK to set TARGET to the inverse of the result and
2449 1.1 mrg flip *INVERT_PTR instead. */
2450 1.1 mrg
2451 1.1 mrg static void
2452 1.1 mrg riscv_emit_int_order_test (enum rtx_code code, bool *invert_ptr,
2453 1.1 mrg rtx target, rtx cmp0, rtx cmp1)
2454 1.1 mrg {
2455 1.1 mrg machine_mode mode;
2456 1.1 mrg
2457 1.1 mrg /* First see if there is a RISCV instruction that can do this operation.
2458 1.1 mrg If not, try doing the same for the inverse operation. If that also
2459 1.1 mrg fails, force CMP1 into a register and try again. */
2460 1.1 mrg mode = GET_MODE (cmp0);
2461 1.1 mrg if (riscv_canonicalize_int_order_test (&code, &cmp1, mode))
2462 1.1 mrg riscv_emit_binary (code, target, cmp0, cmp1);
2463 1.1 mrg else
2464 1.1 mrg {
2465 1.1 mrg enum rtx_code inv_code = reverse_condition (code);
2466 1.1 mrg if (!riscv_canonicalize_int_order_test (&inv_code, &cmp1, mode))
2467 1.1 mrg {
2468 1.1 mrg cmp1 = force_reg (mode, cmp1);
2469 1.1 mrg riscv_emit_int_order_test (code, invert_ptr, target, cmp0, cmp1);
2470 1.1 mrg }
2471 1.1 mrg else if (invert_ptr == 0)
2472 1.1 mrg {
2473 1.1 mrg rtx inv_target = riscv_force_binary (GET_MODE (target),
2474 1.1 mrg inv_code, cmp0, cmp1);
2475 1.1 mrg riscv_emit_binary (XOR, target, inv_target, const1_rtx);
2476 1.1 mrg }
2477 1.1 mrg else
2478 1.1 mrg {
2479 1.1 mrg *invert_ptr = !*invert_ptr;
2480 1.1 mrg riscv_emit_binary (inv_code, target, cmp0, cmp1);
2481 1.1 mrg }
2482 1.1 mrg }
2483 1.1 mrg }
2484 1.1 mrg
2485 1.1 mrg /* Return a register that is zero iff CMP0 and CMP1 are equal.
2486 1.1 mrg The register will have the same mode as CMP0. */
2487 1.1 mrg
2488 1.1 mrg static rtx
2489 1.1 mrg riscv_zero_if_equal (rtx cmp0, rtx cmp1)
2490 1.1 mrg {
2491 1.1 mrg if (cmp1 == const0_rtx)
2492 1.1 mrg return cmp0;
2493 1.1 mrg
2494 1.1 mrg return expand_binop (GET_MODE (cmp0), sub_optab,
2495 1.1 mrg cmp0, cmp1, 0, 0, OPTAB_DIRECT);
2496 1.1 mrg }
2497 1.1 mrg
2498 1.1 mrg /* Sign- or zero-extend OP0 and OP1 for integer comparisons. */
2499 1.1 mrg
2500 1.1 mrg static void
2501 1.1 mrg riscv_extend_comparands (rtx_code code, rtx *op0, rtx *op1)
2502 1.1 mrg {
2503 1.1 mrg /* Comparisons consider all XLEN bits, so extend sub-XLEN values. */
2504 1.1 mrg if (GET_MODE_SIZE (word_mode) > GET_MODE_SIZE (GET_MODE (*op0)))
2505 1.1 mrg {
2506 1.1 mrg /* It is more profitable to zero-extend QImode values. But not if the
2507 1.1 mrg first operand has already been sign-extended, and the second one is
2508 1.1 mrg is a constant or has already been sign-extended also. */
2509 1.1 mrg if (unsigned_condition (code) == code
2510 1.1 mrg && (GET_MODE (*op0) == QImode
2511 1.1 mrg && ! (GET_CODE (*op0) == SUBREG
2512 1.1 mrg && SUBREG_PROMOTED_VAR_P (*op0)
2513 1.1 mrg && SUBREG_PROMOTED_SIGNED_P (*op0)
2514 1.1 mrg && (CONST_INT_P (*op1)
2515 1.1 mrg || (GET_CODE (*op1) == SUBREG
2516 1.1 mrg && SUBREG_PROMOTED_VAR_P (*op1)
2517 1.1 mrg && SUBREG_PROMOTED_SIGNED_P (*op1))))))
2518 1.1 mrg {
2519 1.1 mrg *op0 = gen_rtx_ZERO_EXTEND (word_mode, *op0);
2520 1.1 mrg if (CONST_INT_P (*op1))
2521 1.1 mrg *op1 = GEN_INT ((uint8_t) INTVAL (*op1));
2522 1.1 mrg else
2523 1.1 mrg *op1 = gen_rtx_ZERO_EXTEND (word_mode, *op1);
2524 1.1 mrg }
2525 1.1 mrg else
2526 1.1 mrg {
2527 1.1 mrg *op0 = gen_rtx_SIGN_EXTEND (word_mode, *op0);
2528 1.1 mrg if (*op1 != const0_rtx)
2529 1.1 mrg *op1 = gen_rtx_SIGN_EXTEND (word_mode, *op1);
2530 1.1 mrg }
2531 1.1 mrg }
2532 1.1 mrg }
2533 1.1 mrg
2534 1.1 mrg /* Convert a comparison into something that can be used in a branch. On
2535 1.1 mrg entry, *OP0 and *OP1 are the values being compared and *CODE is the code
2536 1.1 mrg used to compare them. Update them to describe the final comparison. */
2537 1.1 mrg
2538 1.1 mrg static void
2539 1.1 mrg riscv_emit_int_compare (enum rtx_code *code, rtx *op0, rtx *op1)
2540 1.1 mrg {
2541 1.1 mrg if (splittable_const_int_operand (*op1, VOIDmode))
2542 1.1 mrg {
2543 1.1 mrg HOST_WIDE_INT rhs = INTVAL (*op1);
2544 1.1 mrg
2545 1.1 mrg if (*code == EQ || *code == NE)
2546 1.1 mrg {
2547 1.1 mrg /* Convert e.g. OP0 == 2048 into OP0 - 2048 == 0. */
2548 1.1 mrg if (SMALL_OPERAND (-rhs))
2549 1.1 mrg {
2550 1.1 mrg *op0 = riscv_force_binary (GET_MODE (*op0), PLUS, *op0,
2551 1.1 mrg GEN_INT (-rhs));
2552 1.1 mrg *op1 = const0_rtx;
2553 1.1 mrg }
2554 1.1 mrg }
2555 1.1 mrg else
2556 1.1 mrg {
2557 1.1 mrg static const enum rtx_code mag_comparisons[][2] = {
2558 1.1 mrg {LEU, LTU}, {GTU, GEU}, {LE, LT}, {GT, GE}
2559 1.1 mrg };
2560 1.1 mrg
2561 1.1 mrg /* Convert e.g. (OP0 <= 0xFFF) into (OP0 < 0x1000). */
2562 1.1 mrg for (size_t i = 0; i < ARRAY_SIZE (mag_comparisons); i++)
2563 1.1 mrg {
2564 1.1 mrg HOST_WIDE_INT new_rhs;
2565 1.1 mrg bool increment = *code == mag_comparisons[i][0];
2566 1.1 mrg bool decrement = *code == mag_comparisons[i][1];
2567 1.1 mrg if (!increment && !decrement)
2568 1.1 mrg continue;
2569 1.1 mrg
2570 1.1 mrg new_rhs = rhs + (increment ? 1 : -1);
2571 1.1 mrg if (riscv_integer_cost (new_rhs) < riscv_integer_cost (rhs)
2572 1.1 mrg && (rhs < 0) == (new_rhs < 0))
2573 1.1 mrg {
2574 1.1 mrg *op1 = GEN_INT (new_rhs);
2575 1.1 mrg *code = mag_comparisons[i][increment];
2576 1.1 mrg }
2577 1.1 mrg break;
2578 1.1 mrg }
2579 1.1 mrg }
2580 1.1 mrg }
2581 1.1 mrg
2582 1.1 mrg riscv_extend_comparands (*code, op0, op1);
2583 1.1 mrg
2584 1.1 mrg *op0 = force_reg (word_mode, *op0);
2585 1.1 mrg if (*op1 != const0_rtx)
2586 1.1 mrg *op1 = force_reg (word_mode, *op1);
2587 1.1 mrg }
2588 1.1 mrg
2589 1.1 mrg /* Like riscv_emit_int_compare, but for floating-point comparisons. */
2590 1.1 mrg
2591 1.1 mrg static void
2592 1.1 mrg riscv_emit_float_compare (enum rtx_code *code, rtx *op0, rtx *op1)
2593 1.1 mrg {
2594 1.1 mrg rtx tmp0, tmp1, cmp_op0 = *op0, cmp_op1 = *op1;
2595 1.1 mrg enum rtx_code fp_code = *code;
2596 1.1 mrg *code = NE;
2597 1.1 mrg
2598 1.1 mrg switch (fp_code)
2599 1.1 mrg {
2600 1.1 mrg case UNORDERED:
2601 1.1 mrg *code = EQ;
2602 1.1 mrg /* Fall through. */
2603 1.1 mrg
2604 1.1 mrg case ORDERED:
2605 1.1 mrg /* a == a && b == b */
2606 1.1 mrg tmp0 = riscv_force_binary (word_mode, EQ, cmp_op0, cmp_op0);
2607 1.1 mrg tmp1 = riscv_force_binary (word_mode, EQ, cmp_op1, cmp_op1);
2608 1.1 mrg *op0 = riscv_force_binary (word_mode, AND, tmp0, tmp1);
2609 1.1 mrg *op1 = const0_rtx;
2610 1.1 mrg break;
2611 1.1 mrg
2612 1.1 mrg case UNEQ:
2613 1.1 mrg /* ordered(a, b) > (a == b) */
2614 1.1 mrg *code = EQ;
2615 1.1 mrg tmp0 = riscv_force_binary (word_mode, EQ, cmp_op0, cmp_op0);
2616 1.1 mrg tmp1 = riscv_force_binary (word_mode, EQ, cmp_op1, cmp_op1);
2617 1.1 mrg *op0 = riscv_force_binary (word_mode, AND, tmp0, tmp1);
2618 1.1 mrg *op1 = riscv_force_binary (word_mode, EQ, cmp_op0, cmp_op1);
2619 1.1 mrg break;
2620 1.1 mrg
2621 1.1 mrg #define UNORDERED_COMPARISON(CODE, CMP) \
2622 1.1 mrg case CODE: \
2623 1.1 mrg *code = EQ; \
2624 1.1 mrg *op0 = gen_reg_rtx (word_mode); \
2625 1.1 mrg if (GET_MODE (cmp_op0) == SFmode && TARGET_64BIT) \
2626 1.1 mrg emit_insn (gen_f##CMP##_quietsfdi4 (*op0, cmp_op0, cmp_op1)); \
2627 1.1 mrg else if (GET_MODE (cmp_op0) == SFmode) \
2628 1.1 mrg emit_insn (gen_f##CMP##_quietsfsi4 (*op0, cmp_op0, cmp_op1)); \
2629 1.1 mrg else if (GET_MODE (cmp_op0) == DFmode && TARGET_64BIT) \
2630 1.1 mrg emit_insn (gen_f##CMP##_quietdfdi4 (*op0, cmp_op0, cmp_op1)); \
2631 1.1 mrg else if (GET_MODE (cmp_op0) == DFmode) \
2632 1.1 mrg emit_insn (gen_f##CMP##_quietdfsi4 (*op0, cmp_op0, cmp_op1)); \
2633 1.1 mrg else \
2634 1.1 mrg gcc_unreachable (); \
2635 1.1 mrg *op1 = const0_rtx; \
2636 1.1 mrg break;
2637 1.1 mrg
2638 1.1 mrg case UNLT:
2639 1.1 mrg std::swap (cmp_op0, cmp_op1);
2640 1.1 mrg gcc_fallthrough ();
2641 1.1 mrg
2642 1.1 mrg UNORDERED_COMPARISON(UNGT, le)
2643 1.1 mrg
2644 1.1 mrg case UNLE:
2645 1.1 mrg std::swap (cmp_op0, cmp_op1);
2646 1.1 mrg gcc_fallthrough ();
2647 1.1 mrg
2648 1.1 mrg UNORDERED_COMPARISON(UNGE, lt)
2649 1.1 mrg #undef UNORDERED_COMPARISON
2650 1.1 mrg
2651 1.1 mrg case NE:
2652 1.1 mrg fp_code = EQ;
2653 1.1 mrg *code = EQ;
2654 1.1 mrg /* Fall through. */
2655 1.1 mrg
2656 1.1 mrg case EQ:
2657 1.1 mrg case LE:
2658 1.1 mrg case LT:
2659 1.1 mrg case GE:
2660 1.1 mrg case GT:
2661 1.1 mrg /* We have instructions for these cases. */
2662 1.1 mrg *op0 = riscv_force_binary (word_mode, fp_code, cmp_op0, cmp_op1);
2663 1.1 mrg *op1 = const0_rtx;
2664 1.1 mrg break;
2665 1.1 mrg
2666 1.1 mrg case LTGT:
2667 1.1 mrg /* (a < b) | (a > b) */
2668 1.1 mrg tmp0 = riscv_force_binary (word_mode, LT, cmp_op0, cmp_op1);
2669 1.1 mrg tmp1 = riscv_force_binary (word_mode, GT, cmp_op0, cmp_op1);
2670 1.1 mrg *op0 = riscv_force_binary (word_mode, IOR, tmp0, tmp1);
2671 1.1 mrg *op1 = const0_rtx;
2672 1.1 mrg break;
2673 1.1 mrg
2674 1.1 mrg default:
2675 1.1 mrg gcc_unreachable ();
2676 1.1 mrg }
2677 1.1 mrg }
2678 1.1 mrg
2679 1.1 mrg /* CODE-compare OP0 and OP1. Store the result in TARGET. */
2680 1.1 mrg
2681 1.1 mrg void
2682 1.1 mrg riscv_expand_int_scc (rtx target, enum rtx_code code, rtx op0, rtx op1)
2683 1.1 mrg {
2684 1.1 mrg riscv_extend_comparands (code, &op0, &op1);
2685 1.1 mrg op0 = force_reg (word_mode, op0);
2686 1.1 mrg
2687 1.1 mrg if (code == EQ || code == NE)
2688 1.1 mrg {
2689 1.1 mrg rtx zie = riscv_zero_if_equal (op0, op1);
2690 1.1 mrg riscv_emit_binary (code, target, zie, const0_rtx);
2691 1.1 mrg }
2692 1.1 mrg else
2693 1.1 mrg riscv_emit_int_order_test (code, 0, target, op0, op1);
2694 1.1 mrg }
2695 1.1 mrg
2696 1.1 mrg /* Like riscv_expand_int_scc, but for floating-point comparisons. */
2697 1.1 mrg
2698 1.1 mrg void
2699 1.1 mrg riscv_expand_float_scc (rtx target, enum rtx_code code, rtx op0, rtx op1)
2700 1.1 mrg {
2701 1.1 mrg riscv_emit_float_compare (&code, &op0, &op1);
2702 1.1 mrg
2703 1.1 mrg rtx cmp = riscv_force_binary (word_mode, code, op0, op1);
2704 1.1 mrg riscv_emit_set (target, lowpart_subreg (SImode, cmp, word_mode));
2705 1.1 mrg }
2706 1.1 mrg
2707 1.1 mrg /* Jump to LABEL if (CODE OP0 OP1) holds. */
2708 1.1 mrg
2709 1.1 mrg void
2710 1.1 mrg riscv_expand_conditional_branch (rtx label, rtx_code code, rtx op0, rtx op1)
2711 1.1 mrg {
2712 1.1 mrg if (FLOAT_MODE_P (GET_MODE (op1)))
2713 1.1 mrg riscv_emit_float_compare (&code, &op0, &op1);
2714 1.1 mrg else
2715 1.1 mrg riscv_emit_int_compare (&code, &op0, &op1);
2716 1.1 mrg
2717 1.1 mrg rtx condition = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
2718 1.1 mrg emit_jump_insn (gen_condjump (condition, label));
2719 1.1 mrg }
2720 1.1 mrg
2721 1.1 mrg /* If (CODE OP0 OP1) holds, move CONS to DEST; else move ALT to DEST. */
2722 1.1 mrg
2723 1.1 mrg void
2724 1.1 mrg riscv_expand_conditional_move (rtx dest, rtx cons, rtx alt, rtx_code code,
2725 1.1 mrg rtx op0, rtx op1)
2726 1.1 mrg {
2727 1.1 mrg riscv_emit_int_compare (&code, &op0, &op1);
2728 1.1 mrg rtx cond = gen_rtx_fmt_ee (code, GET_MODE (op0), op0, op1);
2729 1.1 mrg emit_insn (gen_rtx_SET (dest, gen_rtx_IF_THEN_ELSE (GET_MODE (dest), cond,
2730 1.1 mrg cons, alt)));
2731 1.1 mrg }
2732 1.1 mrg
2733 1.1 mrg /* Implement TARGET_FUNCTION_ARG_BOUNDARY. Every parameter gets at
2734 1.1 mrg least PARM_BOUNDARY bits of alignment, but will be given anything up
2735 1.1 mrg to PREFERRED_STACK_BOUNDARY bits if the type requires it. */
2736 1.1 mrg
2737 1.1 mrg static unsigned int
2738 1.1 mrg riscv_function_arg_boundary (machine_mode mode, const_tree type)
2739 1.1 mrg {
2740 1.1 mrg unsigned int alignment;
2741 1.1 mrg
2742 1.1 mrg /* Use natural alignment if the type is not aggregate data. */
2743 1.1 mrg if (type && !AGGREGATE_TYPE_P (type))
2744 1.1 mrg alignment = TYPE_ALIGN (TYPE_MAIN_VARIANT (type));
2745 1.1 mrg else
2746 1.1 mrg alignment = type ? TYPE_ALIGN (type) : GET_MODE_ALIGNMENT (mode);
2747 1.1 mrg
2748 1.1 mrg return MIN (PREFERRED_STACK_BOUNDARY, MAX (PARM_BOUNDARY, alignment));
2749 1.1 mrg }
2750 1.1 mrg
2751 1.1 mrg /* If MODE represents an argument that can be passed or returned in
2752 1.1 mrg floating-point registers, return the number of registers, else 0. */
2753 1.1 mrg
2754 1.1 mrg static unsigned
2755 1.1 mrg riscv_pass_mode_in_fpr_p (machine_mode mode)
2756 1.1 mrg {
2757 1.1 mrg if (GET_MODE_UNIT_SIZE (mode) <= UNITS_PER_FP_ARG)
2758 1.1 mrg {
2759 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_FLOAT)
2760 1.1 mrg return 1;
2761 1.1 mrg
2762 1.1 mrg if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT)
2763 1.1 mrg return 2;
2764 1.1 mrg }
2765 1.1 mrg
2766 1.1 mrg return 0;
2767 1.1 mrg }
2768 1.1 mrg
2769 1.1 mrg typedef struct {
2770 1.1 mrg const_tree type;
2771 1.1 mrg HOST_WIDE_INT offset;
2772 1.1 mrg } riscv_aggregate_field;
2773 1.1 mrg
2774 1.1 mrg /* Identify subfields of aggregates that are candidates for passing in
2775 1.1 mrg floating-point registers. */
2776 1.1 mrg
2777 1.1 mrg static int
2778 1.1 mrg riscv_flatten_aggregate_field (const_tree type,
2779 1.1 mrg riscv_aggregate_field fields[2],
2780 1.1 mrg int n, HOST_WIDE_INT offset,
2781 1.1 mrg bool ignore_zero_width_bit_field_p)
2782 1.1 mrg {
2783 1.1 mrg switch (TREE_CODE (type))
2784 1.1 mrg {
2785 1.1 mrg case RECORD_TYPE:
2786 1.1 mrg /* Can't handle incomplete types nor sizes that are not fixed. */
2787 1.1 mrg if (!COMPLETE_TYPE_P (type)
2788 1.1 mrg || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
2789 1.1 mrg || !tree_fits_uhwi_p (TYPE_SIZE (type)))
2790 1.1 mrg return -1;
2791 1.1 mrg
2792 1.1 mrg for (tree f = TYPE_FIELDS (type); f; f = DECL_CHAIN (f))
2793 1.1 mrg if (TREE_CODE (f) == FIELD_DECL)
2794 1.1 mrg {
2795 1.1 mrg if (!TYPE_P (TREE_TYPE (f)))
2796 1.1 mrg return -1;
2797 1.1 mrg
2798 1.1 mrg /* The C++ front end strips zero-length bit-fields from structs.
2799 1.1 mrg So we need to ignore them in the C front end to make C code
2800 1.1 mrg compatible with C++ code. */
2801 1.1 mrg if (ignore_zero_width_bit_field_p
2802 1.1 mrg && DECL_BIT_FIELD (f)
2803 1.1 mrg && (DECL_SIZE (f) == NULL_TREE
2804 1.1 mrg || integer_zerop (DECL_SIZE (f))))
2805 1.1 mrg ;
2806 1.1 mrg else
2807 1.1 mrg {
2808 1.1 mrg HOST_WIDE_INT pos = offset + int_byte_position (f);
2809 1.1 mrg n = riscv_flatten_aggregate_field (TREE_TYPE (f),
2810 1.1 mrg fields, n, pos,
2811 1.1 mrg ignore_zero_width_bit_field_p);
2812 1.1 mrg }
2813 1.1 mrg if (n < 0)
2814 1.1 mrg return -1;
2815 1.1 mrg }
2816 1.1 mrg return n;
2817 1.1 mrg
2818 1.1 mrg case ARRAY_TYPE:
2819 1.1 mrg {
2820 1.1 mrg HOST_WIDE_INT n_elts;
2821 1.1 mrg riscv_aggregate_field subfields[2];
2822 1.1 mrg tree index = TYPE_DOMAIN (type);
2823 1.1 mrg tree elt_size = TYPE_SIZE_UNIT (TREE_TYPE (type));
2824 1.1 mrg int n_subfields = riscv_flatten_aggregate_field (TREE_TYPE (type),
2825 1.1 mrg subfields, 0, offset,
2826 1.1 mrg ignore_zero_width_bit_field_p);
2827 1.1 mrg
2828 1.1 mrg /* Can't handle incomplete types nor sizes that are not fixed. */
2829 1.1 mrg if (n_subfields <= 0
2830 1.1 mrg || !COMPLETE_TYPE_P (type)
2831 1.1 mrg || TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST
2832 1.1 mrg || !index
2833 1.1 mrg || !TYPE_MAX_VALUE (index)
2834 1.1 mrg || !tree_fits_uhwi_p (TYPE_MAX_VALUE (index))
2835 1.1 mrg || !TYPE_MIN_VALUE (index)
2836 1.1 mrg || !tree_fits_uhwi_p (TYPE_MIN_VALUE (index))
2837 1.1 mrg || !tree_fits_uhwi_p (elt_size))
2838 1.1 mrg return -1;
2839 1.1 mrg
2840 1.1 mrg n_elts = 1 + tree_to_uhwi (TYPE_MAX_VALUE (index))
2841 1.1 mrg - tree_to_uhwi (TYPE_MIN_VALUE (index));
2842 1.1 mrg gcc_assert (n_elts >= 0);
2843 1.1 mrg
2844 1.1 mrg for (HOST_WIDE_INT i = 0; i < n_elts; i++)
2845 1.1 mrg for (int j = 0; j < n_subfields; j++)
2846 1.1 mrg {
2847 1.1 mrg if (n >= 2)
2848 1.1 mrg return -1;
2849 1.1 mrg
2850 1.1 mrg fields[n] = subfields[j];
2851 1.1 mrg fields[n++].offset += i * tree_to_uhwi (elt_size);
2852 1.1 mrg }
2853 1.1 mrg
2854 1.1 mrg return n;
2855 1.1 mrg }
2856 1.1 mrg
2857 1.1 mrg case COMPLEX_TYPE:
2858 1.1 mrg {
2859 1.1 mrg /* Complex type need consume 2 field, so n must be 0. */
2860 1.1 mrg if (n != 0)
2861 1.1 mrg return -1;
2862 1.1 mrg
2863 1.1 mrg HOST_WIDE_INT elt_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (type)));
2864 1.1 mrg
2865 1.1 mrg if (elt_size <= UNITS_PER_FP_ARG)
2866 1.1 mrg {
2867 1.1 mrg fields[0].type = TREE_TYPE (type);
2868 1.1 mrg fields[0].offset = offset;
2869 1.1 mrg fields[1].type = TREE_TYPE (type);
2870 1.1 mrg fields[1].offset = offset + elt_size;
2871 1.1 mrg
2872 1.1 mrg return 2;
2873 1.1 mrg }
2874 1.1 mrg
2875 1.1 mrg return -1;
2876 1.1 mrg }
2877 1.1 mrg
2878 1.1 mrg default:
2879 1.1 mrg if (n < 2
2880 1.1 mrg && ((SCALAR_FLOAT_TYPE_P (type)
2881 1.1 mrg && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_FP_ARG)
2882 1.1 mrg || (INTEGRAL_TYPE_P (type)
2883 1.1 mrg && GET_MODE_SIZE (TYPE_MODE (type)) <= UNITS_PER_WORD)))
2884 1.1 mrg {
2885 1.1 mrg fields[n].type = type;
2886 1.1 mrg fields[n].offset = offset;
2887 1.1 mrg return n + 1;
2888 1.1 mrg }
2889 1.1 mrg else
2890 1.1 mrg return -1;
2891 1.1 mrg }
2892 1.1 mrg }
2893 1.1 mrg
2894 1.1 mrg /* Identify candidate aggregates for passing in floating-point registers.
2895 1.1 mrg Candidates have at most two fields after flattening. */
2896 1.1 mrg
2897 1.1 mrg static int
2898 1.1 mrg riscv_flatten_aggregate_argument (const_tree type,
2899 1.1 mrg riscv_aggregate_field fields[2],
2900 1.1 mrg bool ignore_zero_width_bit_field_p)
2901 1.1 mrg {
2902 1.1 mrg if (!type || TREE_CODE (type) != RECORD_TYPE)
2903 1.1 mrg return -1;
2904 1.1 mrg
2905 1.1 mrg return riscv_flatten_aggregate_field (type, fields, 0, 0,
2906 1.1 mrg ignore_zero_width_bit_field_p);
2907 1.1 mrg }
2908 1.1 mrg
2909 1.1 mrg /* See whether TYPE is a record whose fields should be returned in one or
2910 1.1 mrg two floating-point registers. If so, populate FIELDS accordingly. */
2911 1.1 mrg
2912 1.1 mrg static unsigned
2913 1.1 mrg riscv_pass_aggregate_in_fpr_pair_p (const_tree type,
2914 1.1 mrg riscv_aggregate_field fields[2])
2915 1.1 mrg {
2916 1.1 mrg static int warned = 0;
2917 1.1 mrg
2918 1.1 mrg /* This is the old ABI, which differs for C++ and C. */
2919 1.1 mrg int n_old = riscv_flatten_aggregate_argument (type, fields, false);
2920 1.1 mrg for (int i = 0; i < n_old; i++)
2921 1.1 mrg if (!SCALAR_FLOAT_TYPE_P (fields[i].type))
2922 1.1 mrg {
2923 1.1 mrg n_old = -1;
2924 1.1 mrg break;
2925 1.1 mrg }
2926 1.1 mrg
2927 1.1 mrg /* This is the new ABI, which is the same for C++ and C. */
2928 1.1 mrg int n_new = riscv_flatten_aggregate_argument (type, fields, true);
2929 1.1 mrg for (int i = 0; i < n_new; i++)
2930 1.1 mrg if (!SCALAR_FLOAT_TYPE_P (fields[i].type))
2931 1.1 mrg {
2932 1.1 mrg n_new = -1;
2933 1.1 mrg break;
2934 1.1 mrg }
2935 1.1 mrg
2936 1.1 mrg if ((n_old != n_new) && (warned == 0))
2937 1.1 mrg {
2938 1.1 mrg warning (OPT_Wpsabi, "ABI for flattened struct with zero-length "
2939 1.1 mrg "bit-fields changed in GCC 10");
2940 1.1 mrg warned = 1;
2941 1.1 mrg }
2942 1.1 mrg
2943 1.1 mrg return n_new > 0 ? n_new : 0;
2944 1.1 mrg }
2945 1.1 mrg
2946 1.1 mrg /* See whether TYPE is a record whose fields should be returned in one or
2947 1.1 mrg floating-point register and one integer register. If so, populate
2948 1.1 mrg FIELDS accordingly. */
2949 1.1 mrg
2950 1.1 mrg static bool
2951 1.1 mrg riscv_pass_aggregate_in_fpr_and_gpr_p (const_tree type,
2952 1.1 mrg riscv_aggregate_field fields[2])
2953 1.1 mrg {
2954 1.1 mrg static int warned = 0;
2955 1.1 mrg
2956 1.1 mrg /* This is the old ABI, which differs for C++ and C. */
2957 1.1 mrg unsigned num_int_old = 0, num_float_old = 0;
2958 1.1 mrg int n_old = riscv_flatten_aggregate_argument (type, fields, false);
2959 1.1 mrg for (int i = 0; i < n_old; i++)
2960 1.1 mrg {
2961 1.1 mrg num_float_old += SCALAR_FLOAT_TYPE_P (fields[i].type);
2962 1.1 mrg num_int_old += INTEGRAL_TYPE_P (fields[i].type);
2963 1.1 mrg }
2964 1.1 mrg
2965 1.1 mrg /* This is the new ABI, which is the same for C++ and C. */
2966 1.1 mrg unsigned num_int_new = 0, num_float_new = 0;
2967 1.1 mrg int n_new = riscv_flatten_aggregate_argument (type, fields, true);
2968 1.1 mrg for (int i = 0; i < n_new; i++)
2969 1.1 mrg {
2970 1.1 mrg num_float_new += SCALAR_FLOAT_TYPE_P (fields[i].type);
2971 1.1 mrg num_int_new += INTEGRAL_TYPE_P (fields[i].type);
2972 1.1 mrg }
2973 1.1 mrg
2974 1.1 mrg if (((num_int_old == 1 && num_float_old == 1
2975 1.1 mrg && (num_int_old != num_int_new || num_float_old != num_float_new))
2976 1.1 mrg || (num_int_new == 1 && num_float_new == 1
2977 1.1 mrg && (num_int_old != num_int_new || num_float_old != num_float_new)))
2978 1.1 mrg && (warned == 0))
2979 1.1 mrg {
2980 1.1 mrg warning (OPT_Wpsabi, "ABI for flattened struct with zero-length "
2981 1.1 mrg "bit-fields changed in GCC 10");
2982 1.1 mrg warned = 1;
2983 1.1 mrg }
2984 1.1 mrg
2985 1.1 mrg return num_int_new == 1 && num_float_new == 1;
2986 1.1 mrg }
2987 1.1 mrg
2988 1.1 mrg /* Return the representation of an argument passed or returned in an FPR
2989 1.1 mrg when the value has mode VALUE_MODE and the type has TYPE_MODE. The
2990 1.1 mrg two modes may be different for structures like:
2991 1.1 mrg
2992 1.1 mrg struct __attribute__((packed)) foo { float f; }
2993 1.1 mrg
2994 1.1 mrg where the SFmode value "f" is passed in REGNO but the struct itself
2995 1.1 mrg has mode BLKmode. */
2996 1.1 mrg
2997 1.1 mrg static rtx
2998 1.1 mrg riscv_pass_fpr_single (machine_mode type_mode, unsigned regno,
2999 1.1 mrg machine_mode value_mode,
3000 1.1 mrg HOST_WIDE_INT offset)
3001 1.1 mrg {
3002 1.1 mrg rtx x = gen_rtx_REG (value_mode, regno);
3003 1.1 mrg
3004 1.1 mrg if (type_mode != value_mode)
3005 1.1 mrg {
3006 1.1 mrg x = gen_rtx_EXPR_LIST (VOIDmode, x, GEN_INT (offset));
3007 1.1 mrg x = gen_rtx_PARALLEL (type_mode, gen_rtvec (1, x));
3008 1.1 mrg }
3009 1.1 mrg return x;
3010 1.1 mrg }
3011 1.1 mrg
3012 1.1 mrg /* Pass or return a composite value in the FPR pair REGNO and REGNO + 1.
3013 1.1 mrg MODE is the mode of the composite. MODE1 and OFFSET1 are the mode and
3014 1.1 mrg byte offset for the first value, likewise MODE2 and OFFSET2 for the
3015 1.1 mrg second value. */
3016 1.1 mrg
3017 1.1 mrg static rtx
3018 1.1 mrg riscv_pass_fpr_pair (machine_mode mode, unsigned regno1,
3019 1.1 mrg machine_mode mode1, HOST_WIDE_INT offset1,
3020 1.1 mrg unsigned regno2, machine_mode mode2,
3021 1.1 mrg HOST_WIDE_INT offset2)
3022 1.1 mrg {
3023 1.1 mrg return gen_rtx_PARALLEL
3024 1.1 mrg (mode,
3025 1.1 mrg gen_rtvec (2,
3026 1.1 mrg gen_rtx_EXPR_LIST (VOIDmode,
3027 1.1 mrg gen_rtx_REG (mode1, regno1),
3028 1.1 mrg GEN_INT (offset1)),
3029 1.1 mrg gen_rtx_EXPR_LIST (VOIDmode,
3030 1.1 mrg gen_rtx_REG (mode2, regno2),
3031 1.1 mrg GEN_INT (offset2))));
3032 1.1 mrg }
3033 1.1 mrg
3034 1.1 mrg /* Fill INFO with information about a single argument, and return an
3035 1.1 mrg RTL pattern to pass or return the argument. CUM is the cumulative
3036 1.1 mrg state for earlier arguments. MODE is the mode of this argument and
3037 1.1 mrg TYPE is its type (if known). NAMED is true if this is a named
3038 1.1 mrg (fixed) argument rather than a variable one. RETURN_P is true if
3039 1.1 mrg returning the argument, or false if passing the argument. */
3040 1.1 mrg
3041 1.1 mrg static rtx
3042 1.1 mrg riscv_get_arg_info (struct riscv_arg_info *info, const CUMULATIVE_ARGS *cum,
3043 1.1 mrg machine_mode mode, const_tree type, bool named,
3044 1.1 mrg bool return_p)
3045 1.1 mrg {
3046 1.1 mrg unsigned num_bytes, num_words;
3047 1.1 mrg unsigned fpr_base = return_p ? FP_RETURN : FP_ARG_FIRST;
3048 1.1 mrg unsigned gpr_base = return_p ? GP_RETURN : GP_ARG_FIRST;
3049 1.1 mrg unsigned alignment = riscv_function_arg_boundary (mode, type);
3050 1.1 mrg
3051 1.1 mrg memset (info, 0, sizeof (*info));
3052 1.1 mrg info->gpr_offset = cum->num_gprs;
3053 1.1 mrg info->fpr_offset = cum->num_fprs;
3054 1.1 mrg
3055 1.1 mrg if (named)
3056 1.1 mrg {
3057 1.1 mrg riscv_aggregate_field fields[2];
3058 1.1 mrg unsigned fregno = fpr_base + info->fpr_offset;
3059 1.1 mrg unsigned gregno = gpr_base + info->gpr_offset;
3060 1.1 mrg
3061 1.1 mrg /* Pass one- or two-element floating-point aggregates in FPRs. */
3062 1.1 mrg if ((info->num_fprs = riscv_pass_aggregate_in_fpr_pair_p (type, fields))
3063 1.1 mrg && info->fpr_offset + info->num_fprs <= MAX_ARGS_IN_REGISTERS)
3064 1.1 mrg switch (info->num_fprs)
3065 1.1 mrg {
3066 1.1 mrg case 1:
3067 1.1 mrg return riscv_pass_fpr_single (mode, fregno,
3068 1.1 mrg TYPE_MODE (fields[0].type),
3069 1.1 mrg fields[0].offset);
3070 1.1 mrg
3071 1.1 mrg case 2:
3072 1.1 mrg return riscv_pass_fpr_pair (mode, fregno,
3073 1.1 mrg TYPE_MODE (fields[0].type),
3074 1.1 mrg fields[0].offset,
3075 1.1 mrg fregno + 1,
3076 1.1 mrg TYPE_MODE (fields[1].type),
3077 1.1 mrg fields[1].offset);
3078 1.1 mrg
3079 1.1 mrg default:
3080 1.1 mrg gcc_unreachable ();
3081 1.1 mrg }
3082 1.1 mrg
3083 1.1 mrg /* Pass real and complex floating-point numbers in FPRs. */
3084 1.1 mrg if ((info->num_fprs = riscv_pass_mode_in_fpr_p (mode))
3085 1.1 mrg && info->fpr_offset + info->num_fprs <= MAX_ARGS_IN_REGISTERS)
3086 1.1 mrg switch (GET_MODE_CLASS (mode))
3087 1.1 mrg {
3088 1.1 mrg case MODE_FLOAT:
3089 1.1 mrg return gen_rtx_REG (mode, fregno);
3090 1.1 mrg
3091 1.1 mrg case MODE_COMPLEX_FLOAT:
3092 1.1 mrg return riscv_pass_fpr_pair (mode, fregno, GET_MODE_INNER (mode), 0,
3093 1.1 mrg fregno + 1, GET_MODE_INNER (mode),
3094 1.1 mrg GET_MODE_UNIT_SIZE (mode));
3095 1.1 mrg
3096 1.1 mrg default:
3097 1.1 mrg gcc_unreachable ();
3098 1.1 mrg }
3099 1.1 mrg
3100 1.1 mrg /* Pass structs with one float and one integer in an FPR and a GPR. */
3101 1.1 mrg if (riscv_pass_aggregate_in_fpr_and_gpr_p (type, fields)
3102 1.1 mrg && info->gpr_offset < MAX_ARGS_IN_REGISTERS
3103 1.1 mrg && info->fpr_offset < MAX_ARGS_IN_REGISTERS)
3104 1.1 mrg {
3105 1.1 mrg info->num_gprs = 1;
3106 1.1 mrg info->num_fprs = 1;
3107 1.1 mrg
3108 1.1 mrg if (!SCALAR_FLOAT_TYPE_P (fields[0].type))
3109 1.1 mrg std::swap (fregno, gregno);
3110 1.1 mrg
3111 1.1 mrg return riscv_pass_fpr_pair (mode, fregno, TYPE_MODE (fields[0].type),
3112 1.1 mrg fields[0].offset,
3113 1.1 mrg gregno, TYPE_MODE (fields[1].type),
3114 1.1 mrg fields[1].offset);
3115 1.1 mrg }
3116 1.1 mrg }
3117 1.1 mrg
3118 1.1 mrg /* Work out the size of the argument. */
3119 1.1 mrg num_bytes = type ? int_size_in_bytes (type) : GET_MODE_SIZE (mode);
3120 1.1 mrg num_words = (num_bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
3121 1.1 mrg
3122 1.1 mrg /* Doubleword-aligned varargs start on an even register boundary. */
3123 1.1 mrg if (!named && num_bytes != 0 && alignment > BITS_PER_WORD)
3124 1.1 mrg info->gpr_offset += info->gpr_offset & 1;
3125 1.1 mrg
3126 1.1 mrg /* Partition the argument between registers and stack. */
3127 1.1 mrg info->num_fprs = 0;
3128 1.1 mrg info->num_gprs = MIN (num_words, MAX_ARGS_IN_REGISTERS - info->gpr_offset);
3129 1.1 mrg info->stack_p = (num_words - info->num_gprs) != 0;
3130 1.1 mrg
3131 1.1 mrg if (info->num_gprs || return_p)
3132 1.1 mrg return gen_rtx_REG (mode, gpr_base + info->gpr_offset);
3133 1.1 mrg
3134 1.1 mrg return NULL_RTX;
3135 1.1 mrg }
3136 1.1 mrg
3137 1.1 mrg /* Implement TARGET_FUNCTION_ARG. */
3138 1.1 mrg
3139 1.1 mrg static rtx
3140 1.1 mrg riscv_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
3141 1.1 mrg {
3142 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
3143 1.1 mrg struct riscv_arg_info info;
3144 1.1 mrg
3145 1.1 mrg if (arg.end_marker_p ())
3146 1.1 mrg return NULL;
3147 1.1 mrg
3148 1.1 mrg return riscv_get_arg_info (&info, cum, arg.mode, arg.type, arg.named, false);
3149 1.1 mrg }
3150 1.1 mrg
3151 1.1 mrg /* Implement TARGET_FUNCTION_ARG_ADVANCE. */
3152 1.1 mrg
3153 1.1 mrg static void
3154 1.1 mrg riscv_function_arg_advance (cumulative_args_t cum_v,
3155 1.1 mrg const function_arg_info &arg)
3156 1.1 mrg {
3157 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
3158 1.1 mrg struct riscv_arg_info info;
3159 1.1 mrg
3160 1.1 mrg riscv_get_arg_info (&info, cum, arg.mode, arg.type, arg.named, false);
3161 1.1 mrg
3162 1.1 mrg /* Advance the register count. This has the effect of setting
3163 1.1 mrg num_gprs to MAX_ARGS_IN_REGISTERS if a doubleword-aligned
3164 1.1 mrg argument required us to skip the final GPR and pass the whole
3165 1.1 mrg argument on the stack. */
3166 1.1 mrg cum->num_fprs = info.fpr_offset + info.num_fprs;
3167 1.1 mrg cum->num_gprs = info.gpr_offset + info.num_gprs;
3168 1.1 mrg }
3169 1.1 mrg
3170 1.1 mrg /* Implement TARGET_ARG_PARTIAL_BYTES. */
3171 1.1 mrg
3172 1.1 mrg static int
3173 1.1 mrg riscv_arg_partial_bytes (cumulative_args_t cum,
3174 1.1 mrg const function_arg_info &generic_arg)
3175 1.1 mrg {
3176 1.1 mrg struct riscv_arg_info arg;
3177 1.1 mrg
3178 1.1 mrg riscv_get_arg_info (&arg, get_cumulative_args (cum), generic_arg.mode,
3179 1.1 mrg generic_arg.type, generic_arg.named, false);
3180 1.1 mrg return arg.stack_p ? arg.num_gprs * UNITS_PER_WORD : 0;
3181 1.1 mrg }
3182 1.1 mrg
3183 1.1 mrg /* Implement FUNCTION_VALUE and LIBCALL_VALUE. For normal calls,
3184 1.1 mrg VALTYPE is the return type and MODE is VOIDmode. For libcalls,
3185 1.1 mrg VALTYPE is null and MODE is the mode of the return value. */
3186 1.1 mrg
3187 1.1 mrg rtx
3188 1.1 mrg riscv_function_value (const_tree type, const_tree func, machine_mode mode)
3189 1.1 mrg {
3190 1.1 mrg struct riscv_arg_info info;
3191 1.1 mrg CUMULATIVE_ARGS args;
3192 1.1 mrg
3193 1.1 mrg if (type)
3194 1.1 mrg {
3195 1.1 mrg int unsigned_p = TYPE_UNSIGNED (type);
3196 1.1 mrg
3197 1.1 mrg mode = TYPE_MODE (type);
3198 1.1 mrg
3199 1.1 mrg /* Since TARGET_PROMOTE_FUNCTION_MODE unconditionally promotes,
3200 1.1 mrg return values, promote the mode here too. */
3201 1.1 mrg mode = promote_function_mode (type, mode, &unsigned_p, func, 1);
3202 1.1 mrg }
3203 1.1 mrg
3204 1.1 mrg memset (&args, 0, sizeof args);
3205 1.1 mrg return riscv_get_arg_info (&info, &args, mode, type, true, true);
3206 1.1 mrg }
3207 1.1 mrg
3208 1.1 mrg /* Implement TARGET_PASS_BY_REFERENCE. */
3209 1.1 mrg
3210 1.1 mrg static bool
3211 1.1 mrg riscv_pass_by_reference (cumulative_args_t cum_v, const function_arg_info &arg)
3212 1.1 mrg {
3213 1.1 mrg HOST_WIDE_INT size = arg.type_size_in_bytes ();
3214 1.1 mrg struct riscv_arg_info info;
3215 1.1 mrg CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v);
3216 1.1 mrg
3217 1.1 mrg /* ??? std_gimplify_va_arg_expr passes NULL for cum. Fortunately, we
3218 1.1 mrg never pass variadic arguments in floating-point registers, so we can
3219 1.1 mrg avoid the call to riscv_get_arg_info in this case. */
3220 1.1 mrg if (cum != NULL)
3221 1.1 mrg {
3222 1.1 mrg /* Don't pass by reference if we can use a floating-point register. */
3223 1.1 mrg riscv_get_arg_info (&info, cum, arg.mode, arg.type, arg.named, false);
3224 1.1 mrg if (info.num_fprs)
3225 1.1 mrg return false;
3226 1.1 mrg }
3227 1.1 mrg
3228 1.1 mrg /* Pass by reference if the data do not fit in two integer registers. */
3229 1.1 mrg return !IN_RANGE (size, 0, 2 * UNITS_PER_WORD);
3230 1.1 mrg }
3231 1.1 mrg
3232 1.1 mrg /* Implement TARGET_RETURN_IN_MEMORY. */
3233 1.1 mrg
3234 1.1 mrg static bool
3235 1.1 mrg riscv_return_in_memory (const_tree type, const_tree fndecl ATTRIBUTE_UNUSED)
3236 1.1 mrg {
3237 1.1 mrg CUMULATIVE_ARGS args;
3238 1.1 mrg cumulative_args_t cum = pack_cumulative_args (&args);
3239 1.1 mrg
3240 1.1 mrg /* The rules for returning in memory are the same as for passing the
3241 1.1 mrg first named argument by reference. */
3242 1.1 mrg memset (&args, 0, sizeof args);
3243 1.1 mrg function_arg_info arg (const_cast<tree> (type), /*named=*/true);
3244 1.1 mrg return riscv_pass_by_reference (cum, arg);
3245 1.1 mrg }
3246 1.1 mrg
3247 1.1 mrg /* Implement TARGET_SETUP_INCOMING_VARARGS. */
3248 1.1 mrg
3249 1.1 mrg static void
3250 1.1 mrg riscv_setup_incoming_varargs (cumulative_args_t cum,
3251 1.1 mrg const function_arg_info &arg,
3252 1.1 mrg int *pretend_size ATTRIBUTE_UNUSED, int no_rtl)
3253 1.1 mrg {
3254 1.1 mrg CUMULATIVE_ARGS local_cum;
3255 1.1 mrg int gp_saved;
3256 1.1 mrg
3257 1.1 mrg /* The caller has advanced CUM up to, but not beyond, the last named
3258 1.1 mrg argument. Advance a local copy of CUM past the last "real" named
3259 1.1 mrg argument, to find out how many registers are left over. */
3260 1.1 mrg local_cum = *get_cumulative_args (cum);
3261 1.1 mrg riscv_function_arg_advance (pack_cumulative_args (&local_cum), arg);
3262 1.1 mrg
3263 1.1 mrg /* Found out how many registers we need to save. */
3264 1.1 mrg gp_saved = MAX_ARGS_IN_REGISTERS - local_cum.num_gprs;
3265 1.1 mrg
3266 1.1 mrg if (!no_rtl && gp_saved > 0)
3267 1.1 mrg {
3268 1.1 mrg rtx ptr = plus_constant (Pmode, virtual_incoming_args_rtx,
3269 1.1 mrg REG_PARM_STACK_SPACE (cfun->decl)
3270 1.1 mrg - gp_saved * UNITS_PER_WORD);
3271 1.1 mrg rtx mem = gen_frame_mem (BLKmode, ptr);
3272 1.1 mrg set_mem_alias_set (mem, get_varargs_alias_set ());
3273 1.1 mrg
3274 1.1 mrg move_block_from_reg (local_cum.num_gprs + GP_ARG_FIRST,
3275 1.1 mrg mem, gp_saved);
3276 1.1 mrg }
3277 1.1 mrg if (REG_PARM_STACK_SPACE (cfun->decl) == 0)
3278 1.1 mrg cfun->machine->varargs_size = gp_saved * UNITS_PER_WORD;
3279 1.1 mrg }
3280 1.1 mrg
3281 1.1 mrg /* Handle an attribute requiring a FUNCTION_DECL;
3282 1.1 mrg arguments as in struct attribute_spec.handler. */
3283 1.1 mrg static tree
3284 1.1 mrg riscv_handle_fndecl_attribute (tree *node, tree name,
3285 1.1 mrg tree args ATTRIBUTE_UNUSED,
3286 1.1 mrg int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
3287 1.1 mrg {
3288 1.1 mrg if (TREE_CODE (*node) != FUNCTION_DECL)
3289 1.1 mrg {
3290 1.1 mrg warning (OPT_Wattributes, "%qE attribute only applies to functions",
3291 1.1 mrg name);
3292 1.1 mrg *no_add_attrs = true;
3293 1.1 mrg }
3294 1.1 mrg
3295 1.1 mrg return NULL_TREE;
3296 1.1 mrg }
3297 1.1 mrg
3298 1.1 mrg /* Verify type based attributes. NODE is the what the attribute is being
3299 1.1 mrg applied to. NAME is the attribute name. ARGS are the attribute args.
3300 1.1 mrg FLAGS gives info about the context. NO_ADD_ATTRS should be set to true if
3301 1.1 mrg the attribute should be ignored. */
3302 1.1 mrg
3303 1.1 mrg static tree
3304 1.1 mrg riscv_handle_type_attribute (tree *node ATTRIBUTE_UNUSED, tree name, tree args,
3305 1.1 mrg int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
3306 1.1 mrg {
3307 1.1 mrg /* Check for an argument. */
3308 1.1 mrg if (is_attribute_p ("interrupt", name))
3309 1.1 mrg {
3310 1.1 mrg if (args)
3311 1.1 mrg {
3312 1.1 mrg tree cst = TREE_VALUE (args);
3313 1.1 mrg const char *string;
3314 1.1 mrg
3315 1.1 mrg if (TREE_CODE (cst) != STRING_CST)
3316 1.1 mrg {
3317 1.1 mrg warning (OPT_Wattributes,
3318 1.1 mrg "%qE attribute requires a string argument",
3319 1.1 mrg name);
3320 1.1 mrg *no_add_attrs = true;
3321 1.1 mrg return NULL_TREE;
3322 1.1 mrg }
3323 1.1 mrg
3324 1.1 mrg string = TREE_STRING_POINTER (cst);
3325 1.1 mrg if (strcmp (string, "user") && strcmp (string, "supervisor")
3326 1.1 mrg && strcmp (string, "machine"))
3327 1.1 mrg {
3328 1.1 mrg warning (OPT_Wattributes,
3329 1.1 mrg "argument to %qE attribute is not %<\"user\"%>, %<\"supervisor\"%>, "
3330 1.1 mrg "or %<\"machine\"%>", name);
3331 1.1 mrg *no_add_attrs = true;
3332 1.1 mrg }
3333 1.1 mrg }
3334 1.1 mrg }
3335 1.1 mrg
3336 1.1 mrg return NULL_TREE;
3337 1.1 mrg }
3338 1.1 mrg
3339 1.1 mrg /* Return true if function TYPE is an interrupt function. */
3340 1.1 mrg static bool
3341 1.1 mrg riscv_interrupt_type_p (tree type)
3342 1.1 mrg {
3343 1.1 mrg return lookup_attribute ("interrupt", TYPE_ATTRIBUTES (type)) != NULL;
3344 1.1 mrg }
3345 1.1 mrg
3346 1.1 mrg /* Return true if FUNC is a naked function. */
3347 1.1 mrg static bool
3348 1.1 mrg riscv_naked_function_p (tree func)
3349 1.1 mrg {
3350 1.1 mrg tree func_decl = func;
3351 1.1 mrg if (func == NULL_TREE)
3352 1.1 mrg func_decl = current_function_decl;
3353 1.1 mrg return NULL_TREE != lookup_attribute ("naked", DECL_ATTRIBUTES (func_decl));
3354 1.1 mrg }
3355 1.1 mrg
3356 1.1 mrg /* Implement TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS. */
3357 1.1 mrg static bool
3358 1.1 mrg riscv_allocate_stack_slots_for_args ()
3359 1.1 mrg {
3360 1.1 mrg /* Naked functions should not allocate stack slots for arguments. */
3361 1.1 mrg return !riscv_naked_function_p (current_function_decl);
3362 1.1 mrg }
3363 1.1 mrg
3364 1.1 mrg /* Implement TARGET_WARN_FUNC_RETURN. */
3365 1.1 mrg static bool
3366 1.1 mrg riscv_warn_func_return (tree decl)
3367 1.1 mrg {
3368 1.1 mrg /* Naked functions are implemented entirely in assembly, including the
3369 1.1 mrg return sequence, so suppress warnings about this. */
3370 1.1 mrg return !riscv_naked_function_p (decl);
3371 1.1 mrg }
3372 1.1 mrg
3373 1.1 mrg /* Implement TARGET_EXPAND_BUILTIN_VA_START. */
3374 1.1 mrg
3375 1.1 mrg static void
3376 1.1 mrg riscv_va_start (tree valist, rtx nextarg)
3377 1.1 mrg {
3378 1.1 mrg nextarg = plus_constant (Pmode, nextarg, -cfun->machine->varargs_size);
3379 1.1 mrg std_expand_builtin_va_start (valist, nextarg);
3380 1.1 mrg }
3381 1.1 mrg
3382 1.1 mrg /* Make ADDR suitable for use as a call or sibcall target. */
3383 1.1 mrg
3384 1.1 mrg rtx
3385 1.1 mrg riscv_legitimize_call_address (rtx addr)
3386 1.1 mrg {
3387 1.1 mrg if (!call_insn_operand (addr, VOIDmode))
3388 1.1 mrg {
3389 1.1 mrg rtx reg = RISCV_CALL_ADDRESS_TEMP (Pmode);
3390 1.1 mrg riscv_emit_move (reg, addr);
3391 1.1 mrg return reg;
3392 1.1 mrg }
3393 1.1 mrg return addr;
3394 1.1 mrg }
3395 1.1 mrg
3396 1.1 mrg /* Emit straight-line code to move LENGTH bytes from SRC to DEST.
3397 1.1 mrg Assume that the areas do not overlap. */
3398 1.1 mrg
3399 1.1 mrg static void
3400 1.1 mrg riscv_block_move_straight (rtx dest, rtx src, unsigned HOST_WIDE_INT length)
3401 1.1 mrg {
3402 1.1 mrg unsigned HOST_WIDE_INT offset, delta;
3403 1.1 mrg unsigned HOST_WIDE_INT bits;
3404 1.1 mrg int i;
3405 1.1 mrg enum machine_mode mode;
3406 1.1 mrg rtx *regs;
3407 1.1 mrg
3408 1.1 mrg bits = MAX (BITS_PER_UNIT,
3409 1.1 mrg MIN (BITS_PER_WORD, MIN (MEM_ALIGN (src), MEM_ALIGN (dest))));
3410 1.1 mrg
3411 1.1 mrg mode = mode_for_size (bits, MODE_INT, 0).require ();
3412 1.1 mrg delta = bits / BITS_PER_UNIT;
3413 1.1 mrg
3414 1.1 mrg /* Allocate a buffer for the temporary registers. */
3415 1.1 mrg regs = XALLOCAVEC (rtx, length / delta);
3416 1.1 mrg
3417 1.1 mrg /* Load as many BITS-sized chunks as possible. Use a normal load if
3418 1.1 mrg the source has enough alignment, otherwise use left/right pairs. */
3419 1.1 mrg for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3420 1.1 mrg {
3421 1.1 mrg regs[i] = gen_reg_rtx (mode);
3422 1.1 mrg riscv_emit_move (regs[i], adjust_address (src, mode, offset));
3423 1.1 mrg }
3424 1.1 mrg
3425 1.1 mrg /* Copy the chunks to the destination. */
3426 1.1 mrg for (offset = 0, i = 0; offset + delta <= length; offset += delta, i++)
3427 1.1 mrg riscv_emit_move (adjust_address (dest, mode, offset), regs[i]);
3428 1.1 mrg
3429 1.1 mrg /* Mop up any left-over bytes. */
3430 1.1 mrg if (offset < length)
3431 1.1 mrg {
3432 1.1 mrg src = adjust_address (src, BLKmode, offset);
3433 1.1 mrg dest = adjust_address (dest, BLKmode, offset);
3434 1.1 mrg move_by_pieces (dest, src, length - offset,
3435 1.1 mrg MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), RETURN_BEGIN);
3436 1.1 mrg }
3437 1.1 mrg }
3438 1.1 mrg
3439 1.1 mrg /* Helper function for doing a loop-based block operation on memory
3440 1.1 mrg reference MEM. Each iteration of the loop will operate on LENGTH
3441 1.1 mrg bytes of MEM.
3442 1.1 mrg
3443 1.1 mrg Create a new base register for use within the loop and point it to
3444 1.1 mrg the start of MEM. Create a new memory reference that uses this
3445 1.1 mrg register. Store them in *LOOP_REG and *LOOP_MEM respectively. */
3446 1.1 mrg
3447 1.1 mrg static void
3448 1.1 mrg riscv_adjust_block_mem (rtx mem, unsigned HOST_WIDE_INT length,
3449 1.1 mrg rtx *loop_reg, rtx *loop_mem)
3450 1.1 mrg {
3451 1.1 mrg *loop_reg = copy_addr_to_reg (XEXP (mem, 0));
3452 1.1 mrg
3453 1.1 mrg /* Although the new mem does not refer to a known location,
3454 1.1 mrg it does keep up to LENGTH bytes of alignment. */
3455 1.1 mrg *loop_mem = change_address (mem, BLKmode, *loop_reg);
3456 1.1 mrg set_mem_align (*loop_mem, MIN (MEM_ALIGN (mem), length * BITS_PER_UNIT));
3457 1.1 mrg }
3458 1.1 mrg
3459 1.1 mrg /* Move LENGTH bytes from SRC to DEST using a loop that moves BYTES_PER_ITER
3460 1.1 mrg bytes at a time. LENGTH must be at least BYTES_PER_ITER. Assume that
3461 1.1 mrg the memory regions do not overlap. */
3462 1.1 mrg
3463 1.1 mrg static void
3464 1.1 mrg riscv_block_move_loop (rtx dest, rtx src, unsigned HOST_WIDE_INT length,
3465 1.1 mrg unsigned HOST_WIDE_INT bytes_per_iter)
3466 1.1 mrg {
3467 1.1 mrg rtx label, src_reg, dest_reg, final_src, test;
3468 1.1 mrg unsigned HOST_WIDE_INT leftover;
3469 1.1 mrg
3470 1.1 mrg leftover = length % bytes_per_iter;
3471 1.1 mrg length -= leftover;
3472 1.1 mrg
3473 1.1 mrg /* Create registers and memory references for use within the loop. */
3474 1.1 mrg riscv_adjust_block_mem (src, bytes_per_iter, &src_reg, &src);
3475 1.1 mrg riscv_adjust_block_mem (dest, bytes_per_iter, &dest_reg, &dest);
3476 1.1 mrg
3477 1.1 mrg /* Calculate the value that SRC_REG should have after the last iteration
3478 1.1 mrg of the loop. */
3479 1.1 mrg final_src = expand_simple_binop (Pmode, PLUS, src_reg, GEN_INT (length),
3480 1.1 mrg 0, 0, OPTAB_WIDEN);
3481 1.1 mrg
3482 1.1 mrg /* Emit the start of the loop. */
3483 1.1 mrg label = gen_label_rtx ();
3484 1.1 mrg emit_label (label);
3485 1.1 mrg
3486 1.1 mrg /* Emit the loop body. */
3487 1.1 mrg riscv_block_move_straight (dest, src, bytes_per_iter);
3488 1.1 mrg
3489 1.1 mrg /* Move on to the next block. */
3490 1.1 mrg riscv_emit_move (src_reg, plus_constant (Pmode, src_reg, bytes_per_iter));
3491 1.1 mrg riscv_emit_move (dest_reg, plus_constant (Pmode, dest_reg, bytes_per_iter));
3492 1.1 mrg
3493 1.1 mrg /* Emit the loop condition. */
3494 1.1 mrg test = gen_rtx_NE (VOIDmode, src_reg, final_src);
3495 1.1 mrg emit_jump_insn (gen_cbranch4 (Pmode, test, src_reg, final_src, label));
3496 1.1 mrg
3497 1.1 mrg /* Mop up any left-over bytes. */
3498 1.1 mrg if (leftover)
3499 1.1 mrg riscv_block_move_straight (dest, src, leftover);
3500 1.1 mrg else
3501 1.1 mrg emit_insn(gen_nop ());
3502 1.1 mrg }
3503 1.1 mrg
3504 1.1 mrg /* Expand a cpymemsi instruction, which copies LENGTH bytes from
3505 1.1 mrg memory reference SRC to memory reference DEST. */
3506 1.1 mrg
3507 1.1 mrg bool
3508 1.1 mrg riscv_expand_block_move (rtx dest, rtx src, rtx length)
3509 1.1 mrg {
3510 1.1 mrg if (CONST_INT_P (length))
3511 1.1 mrg {
3512 1.1 mrg unsigned HOST_WIDE_INT hwi_length = UINTVAL (length);
3513 1.1 mrg unsigned HOST_WIDE_INT factor, align;
3514 1.1 mrg
3515 1.1 mrg align = MIN (MIN (MEM_ALIGN (src), MEM_ALIGN (dest)), BITS_PER_WORD);
3516 1.1 mrg factor = BITS_PER_WORD / align;
3517 1.1 mrg
3518 1.1 mrg if (optimize_function_for_size_p (cfun)
3519 1.1 mrg && hwi_length * factor * UNITS_PER_WORD > MOVE_RATIO (false))
3520 1.1 mrg return false;
3521 1.1 mrg
3522 1.1 mrg if (hwi_length <= (RISCV_MAX_MOVE_BYTES_STRAIGHT / factor))
3523 1.1 mrg {
3524 1.1 mrg riscv_block_move_straight (dest, src, INTVAL (length));
3525 1.1 mrg return true;
3526 1.1 mrg }
3527 1.1 mrg else if (optimize && align >= BITS_PER_WORD)
3528 1.1 mrg {
3529 1.1 mrg unsigned min_iter_words
3530 1.1 mrg = RISCV_MAX_MOVE_BYTES_PER_LOOP_ITER / UNITS_PER_WORD;
3531 1.1 mrg unsigned iter_words = min_iter_words;
3532 1.1 mrg unsigned HOST_WIDE_INT bytes = hwi_length;
3533 1.1 mrg unsigned HOST_WIDE_INT words = bytes / UNITS_PER_WORD;
3534 1.1 mrg
3535 1.1 mrg /* Lengthen the loop body if it shortens the tail. */
3536 1.1 mrg for (unsigned i = min_iter_words; i < min_iter_words * 2 - 1; i++)
3537 1.1 mrg {
3538 1.1 mrg unsigned cur_cost = iter_words + words % iter_words;
3539 1.1 mrg unsigned new_cost = i + words % i;
3540 1.1 mrg if (new_cost <= cur_cost)
3541 1.1 mrg iter_words = i;
3542 1.1 mrg }
3543 1.1 mrg
3544 1.1 mrg riscv_block_move_loop (dest, src, bytes, iter_words * UNITS_PER_WORD);
3545 1.1 mrg return true;
3546 1.1 mrg }
3547 1.1 mrg }
3548 1.1 mrg return false;
3549 1.1 mrg }
3550 1.1 mrg
3551 1.1 mrg /* Print symbolic operand OP, which is part of a HIGH or LO_SUM
3552 1.1 mrg in context CONTEXT. HI_RELOC indicates a high-part reloc. */
3553 1.1 mrg
3554 1.1 mrg static void
3555 1.1 mrg riscv_print_operand_reloc (FILE *file, rtx op, bool hi_reloc)
3556 1.1 mrg {
3557 1.1 mrg const char *reloc;
3558 1.1 mrg
3559 1.1 mrg switch (riscv_classify_symbolic_expression (op))
3560 1.1 mrg {
3561 1.1 mrg case SYMBOL_ABSOLUTE:
3562 1.1 mrg reloc = hi_reloc ? "%hi" : "%lo";
3563 1.1 mrg break;
3564 1.1 mrg
3565 1.1 mrg case SYMBOL_PCREL:
3566 1.1 mrg reloc = hi_reloc ? "%pcrel_hi" : "%pcrel_lo";
3567 1.1 mrg break;
3568 1.1 mrg
3569 1.1 mrg case SYMBOL_TLS_LE:
3570 1.1 mrg reloc = hi_reloc ? "%tprel_hi" : "%tprel_lo";
3571 1.1 mrg break;
3572 1.1 mrg
3573 1.1 mrg default:
3574 1.1 mrg output_operand_lossage ("invalid use of '%%%c'", hi_reloc ? 'h' : 'R');
3575 1.1 mrg return;
3576 1.1 mrg }
3577 1.1 mrg
3578 1.1 mrg fprintf (file, "%s(", reloc);
3579 1.1 mrg output_addr_const (file, riscv_strip_unspec_address (op));
3580 1.1 mrg fputc (')', file);
3581 1.1 mrg }
3582 1.1 mrg
3583 1.1 mrg /* Return true if the .AQ suffix should be added to an AMO to implement the
3584 1.1 mrg acquire portion of memory model MODEL. */
3585 1.1 mrg
3586 1.1 mrg static bool
3587 1.1 mrg riscv_memmodel_needs_amo_acquire (enum memmodel model)
3588 1.1 mrg {
3589 1.1 mrg switch (model)
3590 1.1 mrg {
3591 1.1 mrg case MEMMODEL_ACQ_REL:
3592 1.1 mrg case MEMMODEL_SEQ_CST:
3593 1.1 mrg case MEMMODEL_SYNC_SEQ_CST:
3594 1.1 mrg case MEMMODEL_ACQUIRE:
3595 1.1 mrg case MEMMODEL_CONSUME:
3596 1.1 mrg case MEMMODEL_SYNC_ACQUIRE:
3597 1.1 mrg return true;
3598 1.1 mrg
3599 1.1 mrg case MEMMODEL_RELEASE:
3600 1.1 mrg case MEMMODEL_SYNC_RELEASE:
3601 1.1 mrg case MEMMODEL_RELAXED:
3602 1.1 mrg return false;
3603 1.1 mrg
3604 1.1 mrg default:
3605 1.1 mrg gcc_unreachable ();
3606 1.1 mrg }
3607 1.1 mrg }
3608 1.1 mrg
3609 1.1 mrg /* Return true if a FENCE should be emitted to before a memory access to
3610 1.1 mrg implement the release portion of memory model MODEL. */
3611 1.1 mrg
3612 1.1 mrg static bool
3613 1.1 mrg riscv_memmodel_needs_release_fence (enum memmodel model)
3614 1.1 mrg {
3615 1.1 mrg switch (model)
3616 1.1 mrg {
3617 1.1 mrg case MEMMODEL_ACQ_REL:
3618 1.1 mrg case MEMMODEL_SEQ_CST:
3619 1.1 mrg case MEMMODEL_SYNC_SEQ_CST:
3620 1.1 mrg case MEMMODEL_RELEASE:
3621 1.1 mrg case MEMMODEL_SYNC_RELEASE:
3622 1.1 mrg return true;
3623 1.1 mrg
3624 1.1 mrg case MEMMODEL_ACQUIRE:
3625 1.1 mrg case MEMMODEL_CONSUME:
3626 1.1 mrg case MEMMODEL_SYNC_ACQUIRE:
3627 1.1 mrg case MEMMODEL_RELAXED:
3628 1.1 mrg return false;
3629 1.1 mrg
3630 1.1 mrg default:
3631 1.1 mrg gcc_unreachable ();
3632 1.1 mrg }
3633 1.1 mrg }
3634 1.1 mrg
3635 1.1 mrg /* Implement TARGET_PRINT_OPERAND. The RISCV-specific operand codes are:
3636 1.1 mrg
3637 1.1 mrg 'h' Print the high-part relocation associated with OP, after stripping
3638 1.1 mrg any outermost HIGH.
3639 1.1 mrg 'R' Print the low-part relocation associated with OP.
3640 1.1 mrg 'C' Print the integer branch condition for comparison OP.
3641 1.1 mrg 'A' Print the atomic operation suffix for memory model OP.
3642 1.1 mrg 'F' Print a FENCE if the memory model requires a release.
3643 1.1 mrg 'z' Print x0 if OP is zero, otherwise print OP normally.
3644 1.1 mrg 'i' Print i if the operand is not a register.
3645 1.1 mrg 'S' Print shift-index of single-bit mask OP.
3646 1.1 mrg 'T' Print shift-index of inverted single-bit mask OP. */
3647 1.1 mrg
3648 1.1 mrg static void
3649 1.1 mrg riscv_print_operand (FILE *file, rtx op, int letter)
3650 1.1 mrg {
3651 1.1 mrg machine_mode mode = GET_MODE (op);
3652 1.1 mrg enum rtx_code code = GET_CODE (op);
3653 1.1 mrg
3654 1.1 mrg switch (letter)
3655 1.1 mrg {
3656 1.1 mrg case 'h':
3657 1.1 mrg if (code == HIGH)
3658 1.1 mrg op = XEXP (op, 0);
3659 1.1 mrg riscv_print_operand_reloc (file, op, true);
3660 1.1 mrg break;
3661 1.1 mrg
3662 1.1 mrg case 'R':
3663 1.1 mrg riscv_print_operand_reloc (file, op, false);
3664 1.1 mrg break;
3665 1.1 mrg
3666 1.1 mrg case 'C':
3667 1.1 mrg /* The RTL names match the instruction names. */
3668 1.1 mrg fputs (GET_RTX_NAME (code), file);
3669 1.1 mrg break;
3670 1.1 mrg
3671 1.1 mrg case 'A':
3672 1.1 mrg if (riscv_memmodel_needs_amo_acquire ((enum memmodel) INTVAL (op)))
3673 1.1 mrg fputs (".aq", file);
3674 1.1 mrg break;
3675 1.1 mrg
3676 1.1 mrg case 'F':
3677 1.1 mrg if (riscv_memmodel_needs_release_fence ((enum memmodel) INTVAL (op)))
3678 1.1 mrg fputs ("fence iorw,ow; ", file);
3679 1.1 mrg break;
3680 1.1 mrg
3681 1.1 mrg case 'i':
3682 1.1 mrg if (code != REG)
3683 1.1 mrg fputs ("i", file);
3684 1.1 mrg break;
3685 1.1 mrg
3686 1.1 mrg case 'S':
3687 1.1 mrg {
3688 1.1 mrg rtx newop = GEN_INT (ctz_hwi (INTVAL (op)));
3689 1.1 mrg output_addr_const (file, newop);
3690 1.1 mrg break;
3691 1.1 mrg }
3692 1.1 mrg case 'T':
3693 1.1 mrg {
3694 1.1 mrg rtx newop = GEN_INT (ctz_hwi (~INTVAL (op)));
3695 1.1 mrg output_addr_const (file, newop);
3696 1.1 mrg break;
3697 1.1 mrg }
3698 1.1 mrg default:
3699 1.1 mrg switch (code)
3700 1.1 mrg {
3701 1.1 mrg case REG:
3702 1.1 mrg if (letter && letter != 'z')
3703 1.1 mrg output_operand_lossage ("invalid use of '%%%c'", letter);
3704 1.1 mrg fprintf (file, "%s", reg_names[REGNO (op)]);
3705 1.1 mrg break;
3706 1.1 mrg
3707 1.1 mrg case MEM:
3708 1.1 mrg if (letter && letter != 'z')
3709 1.1 mrg output_operand_lossage ("invalid use of '%%%c'", letter);
3710 1.1 mrg else
3711 1.1 mrg output_address (mode, XEXP (op, 0));
3712 1.1 mrg break;
3713 1.1 mrg
3714 1.1 mrg default:
3715 1.1 mrg if (letter == 'z' && op == CONST0_RTX (GET_MODE (op)))
3716 1.1 mrg fputs (reg_names[GP_REG_FIRST], file);
3717 1.1 mrg else if (letter && letter != 'z')
3718 1.1 mrg output_operand_lossage ("invalid use of '%%%c'", letter);
3719 1.1 mrg else
3720 1.1 mrg output_addr_const (file, riscv_strip_unspec_address (op));
3721 1.1 mrg break;
3722 1.1 mrg }
3723 1.1 mrg }
3724 1.1 mrg }
3725 1.1 mrg
3726 1.1 mrg /* Implement TARGET_PRINT_OPERAND_ADDRESS. */
3727 1.1 mrg
3728 1.1 mrg static void
3729 1.1 mrg riscv_print_operand_address (FILE *file, machine_mode mode ATTRIBUTE_UNUSED, rtx x)
3730 1.1 mrg {
3731 1.1 mrg struct riscv_address_info addr;
3732 1.1 mrg
3733 1.1 mrg if (riscv_classify_address (&addr, x, word_mode, true))
3734 1.1 mrg switch (addr.type)
3735 1.1 mrg {
3736 1.1 mrg case ADDRESS_REG:
3737 1.1 mrg riscv_print_operand (file, addr.offset, 0);
3738 1.1 mrg fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
3739 1.1 mrg return;
3740 1.1 mrg
3741 1.1 mrg case ADDRESS_LO_SUM:
3742 1.1 mrg riscv_print_operand_reloc (file, addr.offset, false);
3743 1.1 mrg fprintf (file, "(%s)", reg_names[REGNO (addr.reg)]);
3744 1.1 mrg return;
3745 1.1 mrg
3746 1.1 mrg case ADDRESS_CONST_INT:
3747 1.1 mrg output_addr_const (file, x);
3748 1.1 mrg fprintf (file, "(%s)", reg_names[GP_REG_FIRST]);
3749 1.1 mrg return;
3750 1.1 mrg
3751 1.1 mrg case ADDRESS_SYMBOLIC:
3752 1.1 mrg output_addr_const (file, riscv_strip_unspec_address (x));
3753 1.1 mrg return;
3754 1.1 mrg }
3755 1.1 mrg gcc_unreachable ();
3756 1.1 mrg }
3757 1.1 mrg
3758 1.1 mrg static bool
3759 1.1 mrg riscv_size_ok_for_small_data_p (int size)
3760 1.1 mrg {
3761 1.1 mrg return g_switch_value && IN_RANGE (size, 1, g_switch_value);
3762 1.1 mrg }
3763 1.1 mrg
3764 1.1 mrg /* Return true if EXP should be placed in the small data section. */
3765 1.1 mrg
3766 1.1 mrg static bool
3767 1.1 mrg riscv_in_small_data_p (const_tree x)
3768 1.1 mrg {
3769 1.1 mrg if (TREE_CODE (x) == STRING_CST || TREE_CODE (x) == FUNCTION_DECL)
3770 1.1 mrg return false;
3771 1.1 mrg
3772 1.1 mrg if (TREE_CODE (x) == VAR_DECL && DECL_SECTION_NAME (x))
3773 1.1 mrg {
3774 1.1 mrg const char *sec = DECL_SECTION_NAME (x);
3775 1.1 mrg return strcmp (sec, ".sdata") == 0 || strcmp (sec, ".sbss") == 0;
3776 1.1 mrg }
3777 1.1 mrg
3778 1.1 mrg return riscv_size_ok_for_small_data_p (int_size_in_bytes (TREE_TYPE (x)));
3779 1.1 mrg }
3780 1.1 mrg
3781 1.1 mrg /* Switch to the appropriate section for output of DECL. */
3782 1.1 mrg
3783 1.1 mrg static section *
3784 1.1 mrg riscv_select_section (tree decl, int reloc,
3785 1.1 mrg unsigned HOST_WIDE_INT align)
3786 1.1 mrg {
3787 1.1 mrg switch (categorize_decl_for_section (decl, reloc))
3788 1.1 mrg {
3789 1.1 mrg case SECCAT_SRODATA:
3790 1.1 mrg return get_named_section (decl, ".srodata", reloc);
3791 1.1 mrg
3792 1.1 mrg default:
3793 1.1 mrg return default_elf_select_section (decl, reloc, align);
3794 1.1 mrg }
3795 1.1 mrg }
3796 1.1 mrg
3797 1.1 mrg /* Switch to the appropriate section for output of DECL. */
3798 1.1 mrg
3799 1.1 mrg static void
3800 1.1 mrg riscv_unique_section (tree decl, int reloc)
3801 1.1 mrg {
3802 1.1 mrg const char *prefix = NULL;
3803 1.1 mrg bool one_only = DECL_ONE_ONLY (decl) && !HAVE_COMDAT_GROUP;
3804 1.1 mrg
3805 1.1 mrg switch (categorize_decl_for_section (decl, reloc))
3806 1.1 mrg {
3807 1.1 mrg case SECCAT_SRODATA:
3808 1.1 mrg prefix = one_only ? ".sr" : ".srodata";
3809 1.1 mrg break;
3810 1.1 mrg
3811 1.1 mrg default:
3812 1.1 mrg break;
3813 1.1 mrg }
3814 1.1 mrg if (prefix)
3815 1.1 mrg {
3816 1.1 mrg const char *name, *linkonce;
3817 1.1 mrg char *string;
3818 1.1 mrg
3819 1.1 mrg name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
3820 1.1 mrg name = targetm.strip_name_encoding (name);
3821 1.1 mrg
3822 1.1 mrg /* If we're using one_only, then there needs to be a .gnu.linkonce
3823 1.1 mrg prefix to the section name. */
3824 1.1 mrg linkonce = one_only ? ".gnu.linkonce" : "";
3825 1.1 mrg
3826 1.1 mrg string = ACONCAT ((linkonce, prefix, ".", name, NULL));
3827 1.1 mrg
3828 1.1 mrg set_decl_section_name (decl, string);
3829 1.1 mrg return;
3830 1.1 mrg }
3831 1.1 mrg default_unique_section (decl, reloc);
3832 1.1 mrg }
3833 1.1 mrg
3834 1.1 mrg /* Return a section for X, handling small data. */
3835 1.1 mrg
3836 1.1 mrg static section *
3837 1.1 mrg riscv_elf_select_rtx_section (machine_mode mode, rtx x,
3838 1.1 mrg unsigned HOST_WIDE_INT align)
3839 1.1 mrg {
3840 1.1 mrg section *s = default_elf_select_rtx_section (mode, x, align);
3841 1.1 mrg
3842 1.1 mrg if (riscv_size_ok_for_small_data_p (GET_MODE_SIZE (mode)))
3843 1.1 mrg {
3844 1.1 mrg if (startswith (s->named.name, ".rodata.cst"))
3845 1.1 mrg {
3846 1.1 mrg /* Rename .rodata.cst* to .srodata.cst*. */
3847 1.1 mrg char *name = (char *) alloca (strlen (s->named.name) + 2);
3848 1.1 mrg sprintf (name, ".s%s", s->named.name + 1);
3849 1.1 mrg return get_section (name, s->named.common.flags, NULL);
3850 1.1 mrg }
3851 1.1 mrg
3852 1.1 mrg if (s == data_section)
3853 1.1 mrg return sdata_section;
3854 1.1 mrg }
3855 1.1 mrg
3856 1.1 mrg return s;
3857 1.1 mrg }
3858 1.1 mrg
3859 1.1 mrg /* Make the last instruction frame-related and note that it performs
3860 1.1 mrg the operation described by FRAME_PATTERN. */
3861 1.1 mrg
3862 1.1 mrg static void
3863 1.1 mrg riscv_set_frame_expr (rtx frame_pattern)
3864 1.1 mrg {
3865 1.1 mrg rtx insn;
3866 1.1 mrg
3867 1.1 mrg insn = get_last_insn ();
3868 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
3869 1.1 mrg REG_NOTES (insn) = alloc_EXPR_LIST (REG_FRAME_RELATED_EXPR,
3870 1.1 mrg frame_pattern,
3871 1.1 mrg REG_NOTES (insn));
3872 1.1 mrg }
3873 1.1 mrg
3874 1.1 mrg /* Return a frame-related rtx that stores REG at MEM.
3875 1.1 mrg REG must be a single register. */
3876 1.1 mrg
3877 1.1 mrg static rtx
3878 1.1 mrg riscv_frame_set (rtx mem, rtx reg)
3879 1.1 mrg {
3880 1.1 mrg rtx set = gen_rtx_SET (mem, reg);
3881 1.1 mrg RTX_FRAME_RELATED_P (set) = 1;
3882 1.1 mrg return set;
3883 1.1 mrg }
3884 1.1 mrg
3885 1.1 mrg /* Return true if the current function must save register REGNO. */
3886 1.1 mrg
3887 1.1 mrg static bool
3888 1.1 mrg riscv_save_reg_p (unsigned int regno)
3889 1.1 mrg {
3890 1.1 mrg bool call_saved = !global_regs[regno] && !call_used_or_fixed_reg_p (regno);
3891 1.1 mrg bool might_clobber = crtl->saves_all_registers
3892 1.1 mrg || df_regs_ever_live_p (regno);
3893 1.1 mrg
3894 1.1 mrg if (call_saved && might_clobber)
3895 1.1 mrg return true;
3896 1.1 mrg
3897 1.1 mrg if (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed)
3898 1.1 mrg return true;
3899 1.1 mrg
3900 1.1 mrg if (regno == RETURN_ADDR_REGNUM && crtl->calls_eh_return)
3901 1.1 mrg return true;
3902 1.1 mrg
3903 1.1 mrg /* If this is an interrupt handler, then must save extra registers. */
3904 1.1 mrg if (cfun->machine->interrupt_handler_p)
3905 1.1 mrg {
3906 1.1 mrg /* zero register is always zero. */
3907 1.1 mrg if (regno == GP_REG_FIRST)
3908 1.1 mrg return false;
3909 1.1 mrg
3910 1.1 mrg /* The function will return the stack pointer to its original value. */
3911 1.1 mrg if (regno == STACK_POINTER_REGNUM)
3912 1.1 mrg return false;
3913 1.1 mrg
3914 1.1 mrg /* By convention, we assume that gp and tp are safe. */
3915 1.1 mrg if (regno == GP_REGNUM || regno == THREAD_POINTER_REGNUM)
3916 1.1 mrg return false;
3917 1.1 mrg
3918 1.1 mrg /* We must save every register used in this function. If this is not a
3919 1.1 mrg leaf function, then we must save all temporary registers. */
3920 1.1 mrg if (df_regs_ever_live_p (regno)
3921 1.1 mrg || (!crtl->is_leaf && call_used_or_fixed_reg_p (regno)))
3922 1.1 mrg return true;
3923 1.1 mrg }
3924 1.1 mrg
3925 1.1 mrg return false;
3926 1.1 mrg }
3927 1.1 mrg
3928 1.1 mrg /* Determine whether to call GPR save/restore routines. */
3929 1.1 mrg static bool
3930 1.1 mrg riscv_use_save_libcall (const struct riscv_frame_info *frame)
3931 1.1 mrg {
3932 1.1 mrg if (!TARGET_SAVE_RESTORE || crtl->calls_eh_return || frame_pointer_needed
3933 1.1 mrg || cfun->machine->interrupt_handler_p)
3934 1.1 mrg return false;
3935 1.1 mrg
3936 1.1 mrg return frame->save_libcall_adjustment != 0;
3937 1.1 mrg }
3938 1.1 mrg
3939 1.1 mrg /* Determine which GPR save/restore routine to call. */
3940 1.1 mrg
3941 1.1 mrg static unsigned
3942 1.1 mrg riscv_save_libcall_count (unsigned mask)
3943 1.1 mrg {
3944 1.1 mrg for (unsigned n = GP_REG_LAST; n > GP_REG_FIRST; n--)
3945 1.1 mrg if (BITSET_P (mask, n))
3946 1.1 mrg return CALLEE_SAVED_REG_NUMBER (n) + 1;
3947 1.1 mrg abort ();
3948 1.1 mrg }
3949 1.1 mrg
3950 1.1 mrg /* Populate the current function's riscv_frame_info structure.
3951 1.1 mrg
3952 1.1 mrg RISC-V stack frames grown downward. High addresses are at the top.
3953 1.1 mrg
3954 1.1 mrg +-------------------------------+
3955 1.1 mrg | |
3956 1.1 mrg | incoming stack arguments |
3957 1.1 mrg | |
3958 1.1 mrg +-------------------------------+ <-- incoming stack pointer
3959 1.1 mrg | |
3960 1.1 mrg | callee-allocated save area |
3961 1.1 mrg | for arguments that are |
3962 1.1 mrg | split between registers and |
3963 1.1 mrg | the stack |
3964 1.1 mrg | |
3965 1.1 mrg +-------------------------------+ <-- arg_pointer_rtx
3966 1.1 mrg | |
3967 1.1 mrg | callee-allocated save area |
3968 1.1 mrg | for register varargs |
3969 1.1 mrg | |
3970 1.1 mrg +-------------------------------+ <-- hard_frame_pointer_rtx;
3971 1.1 mrg | | stack_pointer_rtx + gp_sp_offset
3972 1.1 mrg | GPR save area | + UNITS_PER_WORD
3973 1.1 mrg | |
3974 1.1 mrg +-------------------------------+ <-- stack_pointer_rtx + fp_sp_offset
3975 1.1 mrg | | + UNITS_PER_HWVALUE
3976 1.1 mrg | FPR save area |
3977 1.1 mrg | |
3978 1.1 mrg +-------------------------------+ <-- frame_pointer_rtx (virtual)
3979 1.1 mrg | |
3980 1.1 mrg | local variables |
3981 1.1 mrg | |
3982 1.1 mrg P +-------------------------------+
3983 1.1 mrg | |
3984 1.1 mrg | outgoing stack arguments |
3985 1.1 mrg | |
3986 1.1 mrg +-------------------------------+ <-- stack_pointer_rtx
3987 1.1 mrg
3988 1.1 mrg Dynamic stack allocations such as alloca insert data at point P.
3989 1.1 mrg They decrease stack_pointer_rtx but leave frame_pointer_rtx and
3990 1.1 mrg hard_frame_pointer_rtx unchanged. */
3991 1.1 mrg
3992 1.1 mrg static HOST_WIDE_INT riscv_first_stack_step (struct riscv_frame_info *frame);
3993 1.1 mrg
3994 1.1 mrg static void
3995 1.1 mrg riscv_compute_frame_info (void)
3996 1.1 mrg {
3997 1.1 mrg struct riscv_frame_info *frame;
3998 1.1 mrg HOST_WIDE_INT offset;
3999 1.1 mrg bool interrupt_save_prologue_temp = false;
4000 1.1 mrg unsigned int regno, i, num_x_saved = 0, num_f_saved = 0;
4001 1.1 mrg
4002 1.1 mrg frame = &cfun->machine->frame;
4003 1.1 mrg
4004 1.1 mrg /* In an interrupt function, if we have a large frame, then we need to
4005 1.1 mrg save/restore t0. We check for this before clearing the frame struct. */
4006 1.1 mrg if (cfun->machine->interrupt_handler_p)
4007 1.1 mrg {
4008 1.1 mrg HOST_WIDE_INT step1 = riscv_first_stack_step (frame);
4009 1.1 mrg if (! SMALL_OPERAND (frame->total_size - step1))
4010 1.1 mrg interrupt_save_prologue_temp = true;
4011 1.1 mrg }
4012 1.1 mrg
4013 1.1 mrg memset (frame, 0, sizeof (*frame));
4014 1.1 mrg
4015 1.1 mrg if (!cfun->machine->naked_p)
4016 1.1 mrg {
4017 1.1 mrg /* Find out which GPRs we need to save. */
4018 1.1 mrg for (regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
4019 1.1 mrg if (riscv_save_reg_p (regno)
4020 1.1 mrg || (interrupt_save_prologue_temp
4021 1.1 mrg && (regno == RISCV_PROLOGUE_TEMP_REGNUM)))
4022 1.1 mrg frame->mask |= 1 << (regno - GP_REG_FIRST), num_x_saved++;
4023 1.1 mrg
4024 1.1 mrg /* If this function calls eh_return, we must also save and restore the
4025 1.1 mrg EH data registers. */
4026 1.1 mrg if (crtl->calls_eh_return)
4027 1.1 mrg for (i = 0; (regno = EH_RETURN_DATA_REGNO (i)) != INVALID_REGNUM; i++)
4028 1.1 mrg frame->mask |= 1 << (regno - GP_REG_FIRST), num_x_saved++;
4029 1.1 mrg
4030 1.1 mrg /* Find out which FPRs we need to save. This loop must iterate over
4031 1.1 mrg the same space as its companion in riscv_for_each_saved_reg. */
4032 1.1 mrg if (TARGET_HARD_FLOAT)
4033 1.1 mrg for (regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
4034 1.1 mrg if (riscv_save_reg_p (regno))
4035 1.1 mrg frame->fmask |= 1 << (regno - FP_REG_FIRST), num_f_saved++;
4036 1.1 mrg }
4037 1.1 mrg
4038 1.1 mrg /* At the bottom of the frame are any outgoing stack arguments. */
4039 1.1 mrg offset = RISCV_STACK_ALIGN (crtl->outgoing_args_size);
4040 1.1 mrg /* Next are local stack variables. */
4041 1.1 mrg offset += RISCV_STACK_ALIGN (get_frame_size ());
4042 1.1 mrg /* The virtual frame pointer points above the local variables. */
4043 1.1 mrg frame->frame_pointer_offset = offset;
4044 1.1 mrg /* Next are the callee-saved FPRs. */
4045 1.1 mrg if (frame->fmask)
4046 1.1 mrg offset += RISCV_STACK_ALIGN (num_f_saved * UNITS_PER_FP_REG);
4047 1.1 mrg frame->fp_sp_offset = offset - UNITS_PER_FP_REG;
4048 1.1 mrg /* Next are the callee-saved GPRs. */
4049 1.1 mrg if (frame->mask)
4050 1.1 mrg {
4051 1.1 mrg unsigned x_save_size = RISCV_STACK_ALIGN (num_x_saved * UNITS_PER_WORD);
4052 1.1 mrg unsigned num_save_restore = 1 + riscv_save_libcall_count (frame->mask);
4053 1.1 mrg
4054 1.1 mrg /* Only use save/restore routines if they don't alter the stack size. */
4055 1.1 mrg if (RISCV_STACK_ALIGN (num_save_restore * UNITS_PER_WORD) == x_save_size)
4056 1.1 mrg {
4057 1.1 mrg /* Libcall saves/restores 3 registers at once, so we need to
4058 1.1 mrg allocate 12 bytes for callee-saved register. */
4059 1.1 mrg if (TARGET_RVE)
4060 1.1 mrg x_save_size = 3 * UNITS_PER_WORD;
4061 1.1 mrg
4062 1.1 mrg frame->save_libcall_adjustment = x_save_size;
4063 1.1 mrg }
4064 1.1 mrg
4065 1.1 mrg offset += x_save_size;
4066 1.1 mrg }
4067 1.1 mrg frame->gp_sp_offset = offset - UNITS_PER_WORD;
4068 1.1 mrg /* The hard frame pointer points above the callee-saved GPRs. */
4069 1.1 mrg frame->hard_frame_pointer_offset = offset;
4070 1.1 mrg /* Above the hard frame pointer is the callee-allocated varags save area. */
4071 1.1 mrg offset += RISCV_STACK_ALIGN (cfun->machine->varargs_size);
4072 1.1 mrg /* Next is the callee-allocated area for pretend stack arguments. */
4073 1.1 mrg offset += RISCV_STACK_ALIGN (crtl->args.pretend_args_size);
4074 1.1 mrg /* Arg pointer must be below pretend args, but must be above alignment
4075 1.1 mrg padding. */
4076 1.1 mrg frame->arg_pointer_offset = offset - crtl->args.pretend_args_size;
4077 1.1 mrg frame->total_size = offset;
4078 1.1 mrg /* Next points the incoming stack pointer and any incoming arguments. */
4079 1.1 mrg
4080 1.1 mrg /* Only use save/restore routines when the GPRs are atop the frame. */
4081 1.1 mrg if (frame->hard_frame_pointer_offset != frame->total_size)
4082 1.1 mrg frame->save_libcall_adjustment = 0;
4083 1.1 mrg }
4084 1.1 mrg
4085 1.1 mrg /* Make sure that we're not trying to eliminate to the wrong hard frame
4086 1.1 mrg pointer. */
4087 1.1 mrg
4088 1.1 mrg static bool
4089 1.1 mrg riscv_can_eliminate (const int from ATTRIBUTE_UNUSED, const int to)
4090 1.1 mrg {
4091 1.1 mrg return (to == HARD_FRAME_POINTER_REGNUM || to == STACK_POINTER_REGNUM);
4092 1.1 mrg }
4093 1.1 mrg
4094 1.1 mrg /* Implement INITIAL_ELIMINATION_OFFSET. FROM is either the frame pointer
4095 1.1 mrg or argument pointer. TO is either the stack pointer or hard frame
4096 1.1 mrg pointer. */
4097 1.1 mrg
4098 1.1 mrg HOST_WIDE_INT
4099 1.1 mrg riscv_initial_elimination_offset (int from, int to)
4100 1.1 mrg {
4101 1.1 mrg HOST_WIDE_INT src, dest;
4102 1.1 mrg
4103 1.1 mrg riscv_compute_frame_info ();
4104 1.1 mrg
4105 1.1 mrg if (to == HARD_FRAME_POINTER_REGNUM)
4106 1.1 mrg dest = cfun->machine->frame.hard_frame_pointer_offset;
4107 1.1 mrg else if (to == STACK_POINTER_REGNUM)
4108 1.1 mrg dest = 0; /* The stack pointer is the base of all offsets, hence 0. */
4109 1.1 mrg else
4110 1.1 mrg gcc_unreachable ();
4111 1.1 mrg
4112 1.1 mrg if (from == FRAME_POINTER_REGNUM)
4113 1.1 mrg src = cfun->machine->frame.frame_pointer_offset;
4114 1.1 mrg else if (from == ARG_POINTER_REGNUM)
4115 1.1 mrg src = cfun->machine->frame.arg_pointer_offset;
4116 1.1 mrg else
4117 1.1 mrg gcc_unreachable ();
4118 1.1 mrg
4119 1.1 mrg return src - dest;
4120 1.1 mrg }
4121 1.1 mrg
4122 1.1 mrg /* Implement RETURN_ADDR_RTX. We do not support moving back to a
4123 1.1 mrg previous frame. */
4124 1.1 mrg
4125 1.1 mrg rtx
4126 1.1 mrg riscv_return_addr (int count, rtx frame ATTRIBUTE_UNUSED)
4127 1.1 mrg {
4128 1.1 mrg if (count != 0)
4129 1.1 mrg return const0_rtx;
4130 1.1 mrg
4131 1.1 mrg return get_hard_reg_initial_val (Pmode, RETURN_ADDR_REGNUM);
4132 1.1 mrg }
4133 1.1 mrg
4134 1.1 mrg /* Emit code to change the current function's return address to
4135 1.1 mrg ADDRESS. SCRATCH is available as a scratch register, if needed.
4136 1.1 mrg ADDRESS and SCRATCH are both word-mode GPRs. */
4137 1.1 mrg
4138 1.1 mrg void
4139 1.1 mrg riscv_set_return_address (rtx address, rtx scratch)
4140 1.1 mrg {
4141 1.1 mrg rtx slot_address;
4142 1.1 mrg
4143 1.1 mrg gcc_assert (BITSET_P (cfun->machine->frame.mask, RETURN_ADDR_REGNUM));
4144 1.1 mrg slot_address = riscv_add_offset (scratch, stack_pointer_rtx,
4145 1.1 mrg cfun->machine->frame.gp_sp_offset);
4146 1.1 mrg riscv_emit_move (gen_frame_mem (GET_MODE (address), slot_address), address);
4147 1.1 mrg }
4148 1.1 mrg
4149 1.1 mrg /* A function to save or store a register. The first argument is the
4150 1.1 mrg register and the second is the stack slot. */
4151 1.1 mrg typedef void (*riscv_save_restore_fn) (rtx, rtx);
4152 1.1 mrg
4153 1.1 mrg /* Use FN to save or restore register REGNO. MODE is the register's
4154 1.1 mrg mode and OFFSET is the offset of its save slot from the current
4155 1.1 mrg stack pointer. */
4156 1.1 mrg
4157 1.1 mrg static void
4158 1.1 mrg riscv_save_restore_reg (machine_mode mode, int regno,
4159 1.1 mrg HOST_WIDE_INT offset, riscv_save_restore_fn fn)
4160 1.1 mrg {
4161 1.1 mrg rtx mem;
4162 1.1 mrg
4163 1.1 mrg mem = gen_frame_mem (mode, plus_constant (Pmode, stack_pointer_rtx, offset));
4164 1.1 mrg fn (gen_rtx_REG (mode, regno), mem);
4165 1.1 mrg }
4166 1.1 mrg
4167 1.1 mrg /* Call FN for each register that is saved by the current function.
4168 1.1 mrg SP_OFFSET is the offset of the current stack pointer from the start
4169 1.1 mrg of the frame. */
4170 1.1 mrg
4171 1.1 mrg static void
4172 1.1 mrg riscv_for_each_saved_reg (HOST_WIDE_INT sp_offset, riscv_save_restore_fn fn,
4173 1.1 mrg bool epilogue, bool maybe_eh_return)
4174 1.1 mrg {
4175 1.1 mrg HOST_WIDE_INT offset;
4176 1.1 mrg
4177 1.1 mrg /* Save the link register and s-registers. */
4178 1.1 mrg offset = cfun->machine->frame.gp_sp_offset - sp_offset;
4179 1.1 mrg for (unsigned int regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
4180 1.1 mrg if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
4181 1.1 mrg {
4182 1.1 mrg bool handle_reg = TRUE;
4183 1.1 mrg
4184 1.1 mrg /* If this is a normal return in a function that calls the eh_return
4185 1.1 mrg builtin, then do not restore the eh return data registers as that
4186 1.1 mrg would clobber the return value. But we do still need to save them
4187 1.1 mrg in the prologue, and restore them for an exception return, so we
4188 1.1 mrg need special handling here. */
4189 1.1 mrg if (epilogue && !maybe_eh_return && crtl->calls_eh_return)
4190 1.1 mrg {
4191 1.1 mrg unsigned int i, regnum;
4192 1.1 mrg
4193 1.1 mrg for (i = 0; (regnum = EH_RETURN_DATA_REGNO (i)) != INVALID_REGNUM;
4194 1.1 mrg i++)
4195 1.1 mrg if (regno == regnum)
4196 1.1 mrg {
4197 1.1 mrg handle_reg = FALSE;
4198 1.1 mrg break;
4199 1.1 mrg }
4200 1.1 mrg }
4201 1.1 mrg
4202 1.1 mrg if (handle_reg)
4203 1.1 mrg riscv_save_restore_reg (word_mode, regno, offset, fn);
4204 1.1 mrg offset -= UNITS_PER_WORD;
4205 1.1 mrg }
4206 1.1 mrg
4207 1.1 mrg /* This loop must iterate over the same space as its companion in
4208 1.1 mrg riscv_compute_frame_info. */
4209 1.1 mrg offset = cfun->machine->frame.fp_sp_offset - sp_offset;
4210 1.1 mrg for (unsigned int regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
4211 1.1 mrg if (BITSET_P (cfun->machine->frame.fmask, regno - FP_REG_FIRST))
4212 1.1 mrg {
4213 1.1 mrg machine_mode mode = TARGET_DOUBLE_FLOAT ? DFmode : SFmode;
4214 1.1 mrg
4215 1.1 mrg riscv_save_restore_reg (mode, regno, offset, fn);
4216 1.1 mrg offset -= GET_MODE_SIZE (mode);
4217 1.1 mrg }
4218 1.1 mrg }
4219 1.1 mrg
4220 1.1 mrg /* Save register REG to MEM. Make the instruction frame-related. */
4221 1.1 mrg
4222 1.1 mrg static void
4223 1.1 mrg riscv_save_reg (rtx reg, rtx mem)
4224 1.1 mrg {
4225 1.1 mrg riscv_emit_move (mem, reg);
4226 1.1 mrg riscv_set_frame_expr (riscv_frame_set (mem, reg));
4227 1.1 mrg }
4228 1.1 mrg
4229 1.1 mrg /* Restore register REG from MEM. */
4230 1.1 mrg
4231 1.1 mrg static void
4232 1.1 mrg riscv_restore_reg (rtx reg, rtx mem)
4233 1.1 mrg {
4234 1.1 mrg rtx insn = riscv_emit_move (reg, mem);
4235 1.1 mrg rtx dwarf = NULL_RTX;
4236 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
4237 1.1 mrg
4238 1.1 mrg if (epilogue_cfa_sp_offset && REGNO (reg) == HARD_FRAME_POINTER_REGNUM)
4239 1.1 mrg {
4240 1.1 mrg rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
4241 1.1 mrg GEN_INT (epilogue_cfa_sp_offset));
4242 1.1 mrg dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
4243 1.1 mrg }
4244 1.1 mrg
4245 1.1 mrg REG_NOTES (insn) = dwarf;
4246 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4247 1.1 mrg }
4248 1.1 mrg
4249 1.1 mrg /* For stack frames that can't be allocated with a single ADDI instruction,
4250 1.1 mrg compute the best value to initially allocate. It must at a minimum
4251 1.1 mrg allocate enough space to spill the callee-saved registers. If TARGET_RVC,
4252 1.1 mrg try to pick a value that will allow compression of the register saves
4253 1.1 mrg without adding extra instructions. */
4254 1.1 mrg
4255 1.1 mrg static HOST_WIDE_INT
4256 1.1 mrg riscv_first_stack_step (struct riscv_frame_info *frame)
4257 1.1 mrg {
4258 1.1 mrg if (SMALL_OPERAND (frame->total_size))
4259 1.1 mrg return frame->total_size;
4260 1.1 mrg
4261 1.1 mrg HOST_WIDE_INT min_first_step =
4262 1.1 mrg RISCV_STACK_ALIGN (frame->total_size - frame->fp_sp_offset);
4263 1.1 mrg HOST_WIDE_INT max_first_step = IMM_REACH / 2 - PREFERRED_STACK_BOUNDARY / 8;
4264 1.1 mrg HOST_WIDE_INT min_second_step = frame->total_size - max_first_step;
4265 1.1 mrg gcc_assert (min_first_step <= max_first_step);
4266 1.1 mrg
4267 1.1 mrg /* As an optimization, use the least-significant bits of the total frame
4268 1.1 mrg size, so that the second adjustment step is just LUI + ADD. */
4269 1.1 mrg if (!SMALL_OPERAND (min_second_step)
4270 1.1 mrg && frame->total_size % IMM_REACH < IMM_REACH / 2
4271 1.1 mrg && frame->total_size % IMM_REACH >= min_first_step)
4272 1.1 mrg return frame->total_size % IMM_REACH;
4273 1.1 mrg
4274 1.1 mrg if (TARGET_RVC)
4275 1.1 mrg {
4276 1.1 mrg /* If we need two subtracts, and one is small enough to allow compressed
4277 1.1 mrg loads and stores, then put that one first. */
4278 1.1 mrg if (IN_RANGE (min_second_step, 0,
4279 1.1 mrg (TARGET_64BIT ? SDSP_REACH : SWSP_REACH)))
4280 1.1 mrg return MAX (min_second_step, min_first_step);
4281 1.1 mrg
4282 1.1 mrg /* If we need LUI + ADDI + ADD for the second adjustment step, then start
4283 1.1 mrg with the minimum first step, so that we can get compressed loads and
4284 1.1 mrg stores. */
4285 1.1 mrg else if (!SMALL_OPERAND (min_second_step))
4286 1.1 mrg return min_first_step;
4287 1.1 mrg }
4288 1.1 mrg
4289 1.1 mrg return max_first_step;
4290 1.1 mrg }
4291 1.1 mrg
4292 1.1 mrg static rtx
4293 1.1 mrg riscv_adjust_libcall_cfi_prologue ()
4294 1.1 mrg {
4295 1.1 mrg rtx dwarf = NULL_RTX;
4296 1.1 mrg rtx adjust_sp_rtx, reg, mem, insn;
4297 1.1 mrg int saved_size = cfun->machine->frame.save_libcall_adjustment;
4298 1.1 mrg int offset;
4299 1.1 mrg
4300 1.1 mrg for (int regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
4301 1.1 mrg if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
4302 1.1 mrg {
4303 1.1 mrg /* The save order is ra, s0, s1, s2 to s11. */
4304 1.1 mrg if (regno == RETURN_ADDR_REGNUM)
4305 1.1 mrg offset = saved_size - UNITS_PER_WORD;
4306 1.1 mrg else if (regno == S0_REGNUM)
4307 1.1 mrg offset = saved_size - UNITS_PER_WORD * 2;
4308 1.1 mrg else if (regno == S1_REGNUM)
4309 1.1 mrg offset = saved_size - UNITS_PER_WORD * 3;
4310 1.1 mrg else
4311 1.1 mrg offset = saved_size - ((regno - S2_REGNUM + 4) * UNITS_PER_WORD);
4312 1.1 mrg
4313 1.1 mrg reg = gen_rtx_REG (SImode, regno);
4314 1.1 mrg mem = gen_frame_mem (SImode, plus_constant (Pmode,
4315 1.1 mrg stack_pointer_rtx,
4316 1.1 mrg offset));
4317 1.1 mrg
4318 1.1 mrg insn = gen_rtx_SET (mem, reg);
4319 1.1 mrg dwarf = alloc_reg_note (REG_CFA_OFFSET, insn, dwarf);
4320 1.1 mrg }
4321 1.1 mrg
4322 1.1 mrg /* Debug info for adjust sp. */
4323 1.1 mrg adjust_sp_rtx = gen_add3_insn (stack_pointer_rtx,
4324 1.1 mrg stack_pointer_rtx, GEN_INT (-saved_size));
4325 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA, adjust_sp_rtx,
4326 1.1 mrg dwarf);
4327 1.1 mrg return dwarf;
4328 1.1 mrg }
4329 1.1 mrg
4330 1.1 mrg static void
4331 1.1 mrg riscv_emit_stack_tie (void)
4332 1.1 mrg {
4333 1.1 mrg if (Pmode == SImode)
4334 1.1 mrg emit_insn (gen_stack_tiesi (stack_pointer_rtx, hard_frame_pointer_rtx));
4335 1.1 mrg else
4336 1.1 mrg emit_insn (gen_stack_tiedi (stack_pointer_rtx, hard_frame_pointer_rtx));
4337 1.1 mrg }
4338 1.1 mrg
4339 1.1 mrg /* Expand the "prologue" pattern. */
4340 1.1 mrg
4341 1.1 mrg void
4342 1.1 mrg riscv_expand_prologue (void)
4343 1.1 mrg {
4344 1.1 mrg struct riscv_frame_info *frame = &cfun->machine->frame;
4345 1.1 mrg HOST_WIDE_INT size = frame->total_size;
4346 1.1 mrg unsigned mask = frame->mask;
4347 1.1 mrg rtx insn;
4348 1.1 mrg
4349 1.1 mrg if (flag_stack_usage_info)
4350 1.1 mrg current_function_static_stack_size = size;
4351 1.1 mrg
4352 1.1 mrg if (cfun->machine->naked_p)
4353 1.1 mrg return;
4354 1.1 mrg
4355 1.1 mrg /* When optimizing for size, call a subroutine to save the registers. */
4356 1.1 mrg if (riscv_use_save_libcall (frame))
4357 1.1 mrg {
4358 1.1 mrg rtx dwarf = NULL_RTX;
4359 1.1 mrg dwarf = riscv_adjust_libcall_cfi_prologue ();
4360 1.1 mrg
4361 1.1 mrg size -= frame->save_libcall_adjustment;
4362 1.1 mrg insn = emit_insn (riscv_gen_gpr_save_insn (frame));
4363 1.1 mrg frame->mask = 0; /* Temporarily fib that we need not save GPRs. */
4364 1.1 mrg
4365 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4366 1.1 mrg REG_NOTES (insn) = dwarf;
4367 1.1 mrg }
4368 1.1 mrg
4369 1.1 mrg /* Save the registers. */
4370 1.1 mrg if ((frame->mask | frame->fmask) != 0)
4371 1.1 mrg {
4372 1.1 mrg HOST_WIDE_INT step1 = MIN (size, riscv_first_stack_step (frame));
4373 1.1 mrg
4374 1.1 mrg insn = gen_add3_insn (stack_pointer_rtx,
4375 1.1 mrg stack_pointer_rtx,
4376 1.1 mrg GEN_INT (-step1));
4377 1.1 mrg RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
4378 1.1 mrg size -= step1;
4379 1.1 mrg riscv_for_each_saved_reg (size, riscv_save_reg, false, false);
4380 1.1 mrg }
4381 1.1 mrg
4382 1.1 mrg frame->mask = mask; /* Undo the above fib. */
4383 1.1 mrg
4384 1.1 mrg /* Set up the frame pointer, if we're using one. */
4385 1.1 mrg if (frame_pointer_needed)
4386 1.1 mrg {
4387 1.1 mrg insn = gen_add3_insn (hard_frame_pointer_rtx, stack_pointer_rtx,
4388 1.1 mrg GEN_INT (frame->hard_frame_pointer_offset - size));
4389 1.1 mrg RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
4390 1.1 mrg
4391 1.1 mrg riscv_emit_stack_tie ();
4392 1.1 mrg }
4393 1.1 mrg
4394 1.1 mrg /* Allocate the rest of the frame. */
4395 1.1 mrg if (size > 0)
4396 1.1 mrg {
4397 1.1 mrg if (SMALL_OPERAND (-size))
4398 1.1 mrg {
4399 1.1 mrg insn = gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
4400 1.1 mrg GEN_INT (-size));
4401 1.1 mrg RTX_FRAME_RELATED_P (emit_insn (insn)) = 1;
4402 1.1 mrg }
4403 1.1 mrg else
4404 1.1 mrg {
4405 1.1 mrg riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), GEN_INT (-size));
4406 1.1 mrg emit_insn (gen_add3_insn (stack_pointer_rtx,
4407 1.1 mrg stack_pointer_rtx,
4408 1.1 mrg RISCV_PROLOGUE_TEMP (Pmode)));
4409 1.1 mrg
4410 1.1 mrg /* Describe the effect of the previous instructions. */
4411 1.1 mrg insn = plus_constant (Pmode, stack_pointer_rtx, -size);
4412 1.1 mrg insn = gen_rtx_SET (stack_pointer_rtx, insn);
4413 1.1 mrg riscv_set_frame_expr (insn);
4414 1.1 mrg }
4415 1.1 mrg }
4416 1.1 mrg }
4417 1.1 mrg
4418 1.1 mrg static rtx
4419 1.1 mrg riscv_adjust_libcall_cfi_epilogue ()
4420 1.1 mrg {
4421 1.1 mrg rtx dwarf = NULL_RTX;
4422 1.1 mrg rtx adjust_sp_rtx, reg;
4423 1.1 mrg int saved_size = cfun->machine->frame.save_libcall_adjustment;
4424 1.1 mrg
4425 1.1 mrg /* Debug info for adjust sp. */
4426 1.1 mrg adjust_sp_rtx = gen_add3_insn (stack_pointer_rtx,
4427 1.1 mrg stack_pointer_rtx, GEN_INT (saved_size));
4428 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA, adjust_sp_rtx,
4429 1.1 mrg dwarf);
4430 1.1 mrg
4431 1.1 mrg for (int regno = GP_REG_FIRST; regno <= GP_REG_LAST; regno++)
4432 1.1 mrg if (BITSET_P (cfun->machine->frame.mask, regno - GP_REG_FIRST))
4433 1.1 mrg {
4434 1.1 mrg reg = gen_rtx_REG (SImode, regno);
4435 1.1 mrg dwarf = alloc_reg_note (REG_CFA_RESTORE, reg, dwarf);
4436 1.1 mrg }
4437 1.1 mrg
4438 1.1 mrg return dwarf;
4439 1.1 mrg }
4440 1.1 mrg
4441 1.1 mrg /* Expand an "epilogue", "sibcall_epilogue", or "eh_return_internal" pattern;
4442 1.1 mrg style says which. */
4443 1.1 mrg
4444 1.1 mrg void
4445 1.1 mrg riscv_expand_epilogue (int style)
4446 1.1 mrg {
4447 1.1 mrg /* Split the frame into two. STEP1 is the amount of stack we should
4448 1.1 mrg deallocate before restoring the registers. STEP2 is the amount we
4449 1.1 mrg should deallocate afterwards.
4450 1.1 mrg
4451 1.1 mrg Start off by assuming that no registers need to be restored. */
4452 1.1 mrg struct riscv_frame_info *frame = &cfun->machine->frame;
4453 1.1 mrg unsigned mask = frame->mask;
4454 1.1 mrg HOST_WIDE_INT step1 = frame->total_size;
4455 1.1 mrg HOST_WIDE_INT step2 = 0;
4456 1.1 mrg bool use_restore_libcall = ((style == NORMAL_RETURN)
4457 1.1 mrg && riscv_use_save_libcall (frame));
4458 1.1 mrg rtx ra = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
4459 1.1 mrg rtx insn;
4460 1.1 mrg
4461 1.1 mrg /* We need to add memory barrier to prevent read from deallocated stack. */
4462 1.1 mrg bool need_barrier_p = (get_frame_size ()
4463 1.1 mrg + cfun->machine->frame.arg_pointer_offset) != 0;
4464 1.1 mrg
4465 1.1 mrg if (cfun->machine->naked_p)
4466 1.1 mrg {
4467 1.1 mrg gcc_assert (style == NORMAL_RETURN);
4468 1.1 mrg
4469 1.1 mrg emit_jump_insn (gen_return ());
4470 1.1 mrg
4471 1.1 mrg return;
4472 1.1 mrg }
4473 1.1 mrg
4474 1.1 mrg if ((style == NORMAL_RETURN) && riscv_can_use_return_insn ())
4475 1.1 mrg {
4476 1.1 mrg emit_jump_insn (gen_return ());
4477 1.1 mrg return;
4478 1.1 mrg }
4479 1.1 mrg
4480 1.1 mrg /* Reset the epilogue cfa info before starting to emit the epilogue. */
4481 1.1 mrg epilogue_cfa_sp_offset = 0;
4482 1.1 mrg
4483 1.1 mrg /* Move past any dynamic stack allocations. */
4484 1.1 mrg if (cfun->calls_alloca)
4485 1.1 mrg {
4486 1.1 mrg /* Emit a barrier to prevent loads from a deallocated stack. */
4487 1.1 mrg riscv_emit_stack_tie ();
4488 1.1 mrg need_barrier_p = false;
4489 1.1 mrg
4490 1.1 mrg rtx adjust = GEN_INT (-frame->hard_frame_pointer_offset);
4491 1.1 mrg if (!SMALL_OPERAND (INTVAL (adjust)))
4492 1.1 mrg {
4493 1.1 mrg riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), adjust);
4494 1.1 mrg adjust = RISCV_PROLOGUE_TEMP (Pmode);
4495 1.1 mrg }
4496 1.1 mrg
4497 1.1 mrg insn = emit_insn (
4498 1.1 mrg gen_add3_insn (stack_pointer_rtx, hard_frame_pointer_rtx,
4499 1.1 mrg adjust));
4500 1.1 mrg
4501 1.1 mrg rtx dwarf = NULL_RTX;
4502 1.1 mrg rtx cfa_adjust_value = gen_rtx_PLUS (
4503 1.1 mrg Pmode, hard_frame_pointer_rtx,
4504 1.1 mrg GEN_INT (-frame->hard_frame_pointer_offset));
4505 1.1 mrg rtx cfa_adjust_rtx = gen_rtx_SET (stack_pointer_rtx, cfa_adjust_value);
4506 1.1 mrg dwarf = alloc_reg_note (REG_CFA_ADJUST_CFA, cfa_adjust_rtx, dwarf);
4507 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4508 1.1 mrg
4509 1.1 mrg REG_NOTES (insn) = dwarf;
4510 1.1 mrg }
4511 1.1 mrg
4512 1.1 mrg /* If we need to restore registers, deallocate as much stack as
4513 1.1 mrg possible in the second step without going out of range. */
4514 1.1 mrg if ((frame->mask | frame->fmask) != 0)
4515 1.1 mrg {
4516 1.1 mrg step2 = riscv_first_stack_step (frame);
4517 1.1 mrg step1 -= step2;
4518 1.1 mrg }
4519 1.1 mrg
4520 1.1 mrg /* Set TARGET to BASE + STEP1. */
4521 1.1 mrg if (step1 > 0)
4522 1.1 mrg {
4523 1.1 mrg /* Emit a barrier to prevent loads from a deallocated stack. */
4524 1.1 mrg riscv_emit_stack_tie ();
4525 1.1 mrg need_barrier_p = false;
4526 1.1 mrg
4527 1.1 mrg /* Get an rtx for STEP1 that we can add to BASE. */
4528 1.1 mrg rtx adjust = GEN_INT (step1);
4529 1.1 mrg if (!SMALL_OPERAND (step1))
4530 1.1 mrg {
4531 1.1 mrg riscv_emit_move (RISCV_PROLOGUE_TEMP (Pmode), adjust);
4532 1.1 mrg adjust = RISCV_PROLOGUE_TEMP (Pmode);
4533 1.1 mrg }
4534 1.1 mrg
4535 1.1 mrg insn = emit_insn (
4536 1.1 mrg gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx, adjust));
4537 1.1 mrg
4538 1.1 mrg rtx dwarf = NULL_RTX;
4539 1.1 mrg rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
4540 1.1 mrg GEN_INT (step2));
4541 1.1 mrg
4542 1.1 mrg dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
4543 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4544 1.1 mrg
4545 1.1 mrg REG_NOTES (insn) = dwarf;
4546 1.1 mrg }
4547 1.1 mrg else if (frame_pointer_needed)
4548 1.1 mrg {
4549 1.1 mrg /* Tell riscv_restore_reg to emit dwarf to redefine CFA when restoring
4550 1.1 mrg old value of FP. */
4551 1.1 mrg epilogue_cfa_sp_offset = step2;
4552 1.1 mrg }
4553 1.1 mrg
4554 1.1 mrg if (use_restore_libcall)
4555 1.1 mrg frame->mask = 0; /* Temporarily fib that we need not save GPRs. */
4556 1.1 mrg
4557 1.1 mrg /* Restore the registers. */
4558 1.1 mrg riscv_for_each_saved_reg (frame->total_size - step2, riscv_restore_reg,
4559 1.1 mrg true, style == EXCEPTION_RETURN);
4560 1.1 mrg
4561 1.1 mrg if (use_restore_libcall)
4562 1.1 mrg {
4563 1.1 mrg frame->mask = mask; /* Undo the above fib. */
4564 1.1 mrg gcc_assert (step2 >= frame->save_libcall_adjustment);
4565 1.1 mrg step2 -= frame->save_libcall_adjustment;
4566 1.1 mrg }
4567 1.1 mrg
4568 1.1 mrg if (need_barrier_p)
4569 1.1 mrg riscv_emit_stack_tie ();
4570 1.1 mrg
4571 1.1 mrg /* Deallocate the final bit of the frame. */
4572 1.1 mrg if (step2 > 0)
4573 1.1 mrg {
4574 1.1 mrg insn = emit_insn (gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
4575 1.1 mrg GEN_INT (step2)));
4576 1.1 mrg
4577 1.1 mrg rtx dwarf = NULL_RTX;
4578 1.1 mrg rtx cfa_adjust_rtx = gen_rtx_PLUS (Pmode, stack_pointer_rtx,
4579 1.1 mrg const0_rtx);
4580 1.1 mrg dwarf = alloc_reg_note (REG_CFA_DEF_CFA, cfa_adjust_rtx, dwarf);
4581 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4582 1.1 mrg
4583 1.1 mrg REG_NOTES (insn) = dwarf;
4584 1.1 mrg }
4585 1.1 mrg
4586 1.1 mrg if (use_restore_libcall)
4587 1.1 mrg {
4588 1.1 mrg rtx dwarf = riscv_adjust_libcall_cfi_epilogue ();
4589 1.1 mrg insn = emit_insn (gen_gpr_restore (GEN_INT (riscv_save_libcall_count (mask))));
4590 1.1 mrg RTX_FRAME_RELATED_P (insn) = 1;
4591 1.1 mrg REG_NOTES (insn) = dwarf;
4592 1.1 mrg
4593 1.1 mrg emit_jump_insn (gen_gpr_restore_return (ra));
4594 1.1 mrg return;
4595 1.1 mrg }
4596 1.1 mrg
4597 1.1 mrg /* Add in the __builtin_eh_return stack adjustment. */
4598 1.1 mrg if ((style == EXCEPTION_RETURN) && crtl->calls_eh_return)
4599 1.1 mrg emit_insn (gen_add3_insn (stack_pointer_rtx, stack_pointer_rtx,
4600 1.1 mrg EH_RETURN_STACKADJ_RTX));
4601 1.1 mrg
4602 1.1 mrg /* Return from interrupt. */
4603 1.1 mrg if (cfun->machine->interrupt_handler_p)
4604 1.1 mrg {
4605 1.1 mrg enum riscv_privilege_levels mode = cfun->machine->interrupt_mode;
4606 1.1 mrg
4607 1.1 mrg gcc_assert (mode != UNKNOWN_MODE);
4608 1.1 mrg
4609 1.1 mrg if (mode == MACHINE_MODE)
4610 1.1 mrg emit_jump_insn (gen_riscv_mret ());
4611 1.1 mrg else if (mode == SUPERVISOR_MODE)
4612 1.1 mrg emit_jump_insn (gen_riscv_sret ());
4613 1.1 mrg else
4614 1.1 mrg emit_jump_insn (gen_riscv_uret ());
4615 1.1 mrg }
4616 1.1 mrg else if (style != SIBCALL_RETURN)
4617 1.1 mrg emit_jump_insn (gen_simple_return_internal (ra));
4618 1.1 mrg }
4619 1.1 mrg
4620 1.1 mrg /* Implement EPILOGUE_USES. */
4621 1.1 mrg
4622 1.1 mrg bool
4623 1.1 mrg riscv_epilogue_uses (unsigned int regno)
4624 1.1 mrg {
4625 1.1 mrg if (regno == RETURN_ADDR_REGNUM)
4626 1.1 mrg return true;
4627 1.1 mrg
4628 1.1 mrg if (epilogue_completed && cfun->machine->interrupt_handler_p)
4629 1.1 mrg {
4630 1.1 mrg /* An interrupt function restores temp regs, so we must indicate that
4631 1.1 mrg they are live at function end. */
4632 1.1 mrg if (df_regs_ever_live_p (regno)
4633 1.1 mrg || (!crtl->is_leaf && call_used_or_fixed_reg_p (regno)))
4634 1.1 mrg return true;
4635 1.1 mrg }
4636 1.1 mrg
4637 1.1 mrg return false;
4638 1.1 mrg }
4639 1.1 mrg
4640 1.1 mrg /* Return nonzero if this function is known to have a null epilogue.
4641 1.1 mrg This allows the optimizer to omit jumps to jumps if no stack
4642 1.1 mrg was created. */
4643 1.1 mrg
4644 1.1 mrg bool
4645 1.1 mrg riscv_can_use_return_insn (void)
4646 1.1 mrg {
4647 1.1 mrg return (reload_completed && cfun->machine->frame.total_size == 0
4648 1.1 mrg && ! cfun->machine->interrupt_handler_p);
4649 1.1 mrg }
4650 1.1 mrg
4651 1.1 mrg /* Given that there exists at least one variable that is set (produced)
4652 1.1 mrg by OUT_INSN and read (consumed) by IN_INSN, return true iff
4653 1.1 mrg IN_INSN represents one or more memory store operations and none of
4654 1.1 mrg the variables set by OUT_INSN is used by IN_INSN as the address of a
4655 1.1 mrg store operation. If either IN_INSN or OUT_INSN does not represent
4656 1.1 mrg a "single" RTL SET expression (as loosely defined by the
4657 1.1 mrg implementation of the single_set function) or a PARALLEL with only
4658 1.1 mrg SETs, CLOBBERs, and USEs inside, this function returns false.
4659 1.1 mrg
4660 1.1 mrg Borrowed from rs6000, riscv_store_data_bypass_p checks for certain
4661 1.1 mrg conditions that result in assertion failures in the generic
4662 1.1 mrg store_data_bypass_p function and returns FALSE in such cases.
4663 1.1 mrg
4664 1.1 mrg This is required to make -msave-restore work with the sifive-7
4665 1.1 mrg pipeline description. */
4666 1.1 mrg
4667 1.1 mrg bool
4668 1.1 mrg riscv_store_data_bypass_p (rtx_insn *out_insn, rtx_insn *in_insn)
4669 1.1 mrg {
4670 1.1 mrg rtx out_set, in_set;
4671 1.1 mrg rtx out_pat, in_pat;
4672 1.1 mrg rtx out_exp, in_exp;
4673 1.1 mrg int i, j;
4674 1.1 mrg
4675 1.1 mrg in_set = single_set (in_insn);
4676 1.1 mrg if (in_set)
4677 1.1 mrg {
4678 1.1 mrg if (MEM_P (SET_DEST (in_set)))
4679 1.1 mrg {
4680 1.1 mrg out_set = single_set (out_insn);
4681 1.1 mrg if (!out_set)
4682 1.1 mrg {
4683 1.1 mrg out_pat = PATTERN (out_insn);
4684 1.1 mrg if (GET_CODE (out_pat) == PARALLEL)
4685 1.1 mrg {
4686 1.1 mrg for (i = 0; i < XVECLEN (out_pat, 0); i++)
4687 1.1 mrg {
4688 1.1 mrg out_exp = XVECEXP (out_pat, 0, i);
4689 1.1 mrg if ((GET_CODE (out_exp) == CLOBBER)
4690 1.1 mrg || (GET_CODE (out_exp) == USE))
4691 1.1 mrg continue;
4692 1.1 mrg else if (GET_CODE (out_exp) != SET)
4693 1.1 mrg return false;
4694 1.1 mrg }
4695 1.1 mrg }
4696 1.1 mrg }
4697 1.1 mrg }
4698 1.1 mrg }
4699 1.1 mrg else
4700 1.1 mrg {
4701 1.1 mrg in_pat = PATTERN (in_insn);
4702 1.1 mrg if (GET_CODE (in_pat) != PARALLEL)
4703 1.1 mrg return false;
4704 1.1 mrg
4705 1.1 mrg for (i = 0; i < XVECLEN (in_pat, 0); i++)
4706 1.1 mrg {
4707 1.1 mrg in_exp = XVECEXP (in_pat, 0, i);
4708 1.1 mrg if ((GET_CODE (in_exp) == CLOBBER) || (GET_CODE (in_exp) == USE))
4709 1.1 mrg continue;
4710 1.1 mrg else if (GET_CODE (in_exp) != SET)
4711 1.1 mrg return false;
4712 1.1 mrg
4713 1.1 mrg if (MEM_P (SET_DEST (in_exp)))
4714 1.1 mrg {
4715 1.1 mrg out_set = single_set (out_insn);
4716 1.1 mrg if (!out_set)
4717 1.1 mrg {
4718 1.1 mrg out_pat = PATTERN (out_insn);
4719 1.1 mrg if (GET_CODE (out_pat) != PARALLEL)
4720 1.1 mrg return false;
4721 1.1 mrg for (j = 0; j < XVECLEN (out_pat, 0); j++)
4722 1.1 mrg {
4723 1.1 mrg out_exp = XVECEXP (out_pat, 0, j);
4724 1.1 mrg if ((GET_CODE (out_exp) == CLOBBER)
4725 1.1 mrg || (GET_CODE (out_exp) == USE))
4726 1.1 mrg continue;
4727 1.1 mrg else if (GET_CODE (out_exp) != SET)
4728 1.1 mrg return false;
4729 1.1 mrg }
4730 1.1 mrg }
4731 1.1 mrg }
4732 1.1 mrg }
4733 1.1 mrg }
4734 1.1 mrg
4735 1.1 mrg return store_data_bypass_p (out_insn, in_insn);
4736 1.1 mrg }
4737 1.1 mrg
4738 1.1 mrg /* Implement TARGET_SECONDARY_MEMORY_NEEDED.
4739 1.1 mrg
4740 1.1 mrg When floating-point registers are wider than integer ones, moves between
4741 1.1 mrg them must go through memory. */
4742 1.1 mrg
4743 1.1 mrg static bool
4744 1.1 mrg riscv_secondary_memory_needed (machine_mode mode, reg_class_t class1,
4745 1.1 mrg reg_class_t class2)
4746 1.1 mrg {
4747 1.1 mrg return (GET_MODE_SIZE (mode) > UNITS_PER_WORD
4748 1.1 mrg && (class1 == FP_REGS) != (class2 == FP_REGS));
4749 1.1 mrg }
4750 1.1 mrg
4751 1.1 mrg /* Implement TARGET_REGISTER_MOVE_COST. */
4752 1.1 mrg
4753 1.1 mrg static int
4754 1.1 mrg riscv_register_move_cost (machine_mode mode,
4755 1.1 mrg reg_class_t from, reg_class_t to)
4756 1.1 mrg {
4757 1.1 mrg if ((from == FP_REGS && to == GR_REGS) ||
4758 1.1 mrg (from == GR_REGS && to == FP_REGS))
4759 1.1 mrg return tune_param->fmv_cost;
4760 1.1 mrg
4761 1.1 mrg return riscv_secondary_memory_needed (mode, from, to) ? 8 : 2;
4762 1.1 mrg }
4763 1.1 mrg
4764 1.1 mrg /* Implement TARGET_HARD_REGNO_NREGS. */
4765 1.1 mrg
4766 1.1 mrg static unsigned int
4767 1.1 mrg riscv_hard_regno_nregs (unsigned int regno, machine_mode mode)
4768 1.1 mrg {
4769 1.1 mrg if (FP_REG_P (regno))
4770 1.1 mrg return (GET_MODE_SIZE (mode) + UNITS_PER_FP_REG - 1) / UNITS_PER_FP_REG;
4771 1.1 mrg
4772 1.1 mrg /* All other registers are word-sized. */
4773 1.1 mrg return (GET_MODE_SIZE (mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
4774 1.1 mrg }
4775 1.1 mrg
4776 1.1 mrg /* Implement TARGET_HARD_REGNO_MODE_OK. */
4777 1.1 mrg
4778 1.1 mrg static bool
4779 1.1 mrg riscv_hard_regno_mode_ok (unsigned int regno, machine_mode mode)
4780 1.1 mrg {
4781 1.1 mrg unsigned int nregs = riscv_hard_regno_nregs (regno, mode);
4782 1.1 mrg
4783 1.1 mrg if (GP_REG_P (regno))
4784 1.1 mrg {
4785 1.1 mrg if (!GP_REG_P (regno + nregs - 1))
4786 1.1 mrg return false;
4787 1.1 mrg }
4788 1.1 mrg else if (FP_REG_P (regno))
4789 1.1 mrg {
4790 1.1 mrg if (!FP_REG_P (regno + nregs - 1))
4791 1.1 mrg return false;
4792 1.1 mrg
4793 1.1 mrg if (GET_MODE_CLASS (mode) != MODE_FLOAT
4794 1.1 mrg && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
4795 1.1 mrg return false;
4796 1.1 mrg
4797 1.1 mrg /* Only use callee-saved registers if a potential callee is guaranteed
4798 1.1 mrg to spill the requisite width. */
4799 1.1 mrg if (GET_MODE_UNIT_SIZE (mode) > UNITS_PER_FP_REG
4800 1.1 mrg || (!call_used_or_fixed_reg_p (regno)
4801 1.1 mrg && GET_MODE_UNIT_SIZE (mode) > UNITS_PER_FP_ARG))
4802 1.1 mrg return false;
4803 1.1 mrg }
4804 1.1 mrg else
4805 1.1 mrg return false;
4806 1.1 mrg
4807 1.1 mrg /* Require same callee-savedness for all registers. */
4808 1.1 mrg for (unsigned i = 1; i < nregs; i++)
4809 1.1 mrg if (call_used_or_fixed_reg_p (regno)
4810 1.1 mrg != call_used_or_fixed_reg_p (regno + i))
4811 1.1 mrg return false;
4812 1.1 mrg
4813 1.1 mrg return true;
4814 1.1 mrg }
4815 1.1 mrg
4816 1.1 mrg /* Implement TARGET_MODES_TIEABLE_P.
4817 1.1 mrg
4818 1.1 mrg Don't allow floating-point modes to be tied, since type punning of
4819 1.1 mrg single-precision and double-precision is implementation defined. */
4820 1.1 mrg
4821 1.1 mrg static bool
4822 1.1 mrg riscv_modes_tieable_p (machine_mode mode1, machine_mode mode2)
4823 1.1 mrg {
4824 1.1 mrg return (mode1 == mode2
4825 1.1 mrg || !(GET_MODE_CLASS (mode1) == MODE_FLOAT
4826 1.1 mrg && GET_MODE_CLASS (mode2) == MODE_FLOAT));
4827 1.1 mrg }
4828 1.1 mrg
4829 1.1 mrg /* Implement CLASS_MAX_NREGS. */
4830 1.1 mrg
4831 1.1 mrg static unsigned char
4832 1.1 mrg riscv_class_max_nregs (reg_class_t rclass, machine_mode mode)
4833 1.1 mrg {
4834 1.1 mrg if (reg_class_subset_p (rclass, FP_REGS))
4835 1.1 mrg return riscv_hard_regno_nregs (FP_REG_FIRST, mode);
4836 1.1 mrg
4837 1.1 mrg if (reg_class_subset_p (rclass, GR_REGS))
4838 1.1 mrg return riscv_hard_regno_nregs (GP_REG_FIRST, mode);
4839 1.1 mrg
4840 1.1 mrg return 0;
4841 1.1 mrg }
4842 1.1 mrg
4843 1.1 mrg /* Implement TARGET_MEMORY_MOVE_COST. */
4844 1.1 mrg
4845 1.1 mrg static int
4846 1.1 mrg riscv_memory_move_cost (machine_mode mode, reg_class_t rclass, bool in)
4847 1.1 mrg {
4848 1.1 mrg return (tune_param->memory_cost
4849 1.1 mrg + memory_move_secondary_cost (mode, rclass, in));
4850 1.1 mrg }
4851 1.1 mrg
4852 1.1 mrg /* Return the number of instructions that can be issued per cycle. */
4853 1.1 mrg
4854 1.1 mrg static int
4855 1.1 mrg riscv_issue_rate (void)
4856 1.1 mrg {
4857 1.1 mrg return tune_param->issue_rate;
4858 1.1 mrg }
4859 1.1 mrg
4860 1.1 mrg /* Auxiliary function to emit RISC-V ELF attribute. */
4861 1.1 mrg static void
4862 1.1 mrg riscv_emit_attribute ()
4863 1.1 mrg {
4864 1.1 mrg fprintf (asm_out_file, "\t.attribute arch, \"%s\"\n",
4865 1.1 mrg riscv_arch_str ().c_str ());
4866 1.1 mrg
4867 1.1 mrg fprintf (asm_out_file, "\t.attribute unaligned_access, %d\n",
4868 1.1 mrg TARGET_STRICT_ALIGN ? 0 : 1);
4869 1.1 mrg
4870 1.1 mrg fprintf (asm_out_file, "\t.attribute stack_align, %d\n",
4871 1.1 mrg riscv_stack_boundary / 8);
4872 1.1 mrg }
4873 1.1 mrg
4874 1.1 mrg /* Implement TARGET_ASM_FILE_START. */
4875 1.1 mrg
4876 1.1 mrg static void
4877 1.1 mrg riscv_file_start (void)
4878 1.1 mrg {
4879 1.1 mrg default_file_start ();
4880 1.1 mrg
4881 1.1 mrg /* Instruct GAS to generate position-[in]dependent code. */
4882 1.1 mrg fprintf (asm_out_file, "\t.option %spic\n", (flag_pic ? "" : "no"));
4883 1.1 mrg
4884 1.1 mrg /* If the user specifies "-mno-relax" on the command line then disable linker
4885 1.1 mrg relaxation in the assembler. */
4886 1.1 mrg if (! riscv_mrelax)
4887 1.1 mrg fprintf (asm_out_file, "\t.option norelax\n");
4888 1.1 mrg
4889 1.1 mrg if (riscv_emit_attribute_p)
4890 1.1 mrg riscv_emit_attribute ();
4891 1.1 mrg }
4892 1.1 mrg
4893 1.1 mrg /* Implement TARGET_ASM_OUTPUT_MI_THUNK. Generate rtl rather than asm text
4894 1.1 mrg in order to avoid duplicating too much logic from elsewhere. */
4895 1.1 mrg
4896 1.1 mrg static void
4897 1.1 mrg riscv_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
4898 1.1 mrg HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset,
4899 1.1 mrg tree function)
4900 1.1 mrg {
4901 1.1 mrg const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl));
4902 1.1 mrg rtx this_rtx, temp1, temp2, fnaddr;
4903 1.1 mrg rtx_insn *insn;
4904 1.1 mrg
4905 1.1 mrg /* Pretend to be a post-reload pass while generating rtl. */
4906 1.1 mrg reload_completed = 1;
4907 1.1 mrg
4908 1.1 mrg /* Mark the end of the (empty) prologue. */
4909 1.1 mrg emit_note (NOTE_INSN_PROLOGUE_END);
4910 1.1 mrg
4911 1.1 mrg /* Determine if we can use a sibcall to call FUNCTION directly. */
4912 1.1 mrg fnaddr = gen_rtx_MEM (FUNCTION_MODE, XEXP (DECL_RTL (function), 0));
4913 1.1 mrg
4914 1.1 mrg /* We need two temporary registers in some cases. */
4915 1.1 mrg temp1 = gen_rtx_REG (Pmode, RISCV_PROLOGUE_TEMP_REGNUM);
4916 1.1 mrg temp2 = gen_rtx_REG (Pmode, STATIC_CHAIN_REGNUM);
4917 1.1 mrg
4918 1.1 mrg /* Find out which register contains the "this" pointer. */
4919 1.1 mrg if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function))
4920 1.1 mrg this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST + 1);
4921 1.1 mrg else
4922 1.1 mrg this_rtx = gen_rtx_REG (Pmode, GP_ARG_FIRST);
4923 1.1 mrg
4924 1.1 mrg /* Add DELTA to THIS_RTX. */
4925 1.1 mrg if (delta != 0)
4926 1.1 mrg {
4927 1.1 mrg rtx offset = GEN_INT (delta);
4928 1.1 mrg if (!SMALL_OPERAND (delta))
4929 1.1 mrg {
4930 1.1 mrg riscv_emit_move (temp1, offset);
4931 1.1 mrg offset = temp1;
4932 1.1 mrg }
4933 1.1 mrg emit_insn (gen_add3_insn (this_rtx, this_rtx, offset));
4934 1.1 mrg }
4935 1.1 mrg
4936 1.1 mrg /* If needed, add *(*THIS_RTX + VCALL_OFFSET) to THIS_RTX. */
4937 1.1 mrg if (vcall_offset != 0)
4938 1.1 mrg {
4939 1.1 mrg rtx addr;
4940 1.1 mrg
4941 1.1 mrg /* Set TEMP1 to *THIS_RTX. */
4942 1.1 mrg riscv_emit_move (temp1, gen_rtx_MEM (Pmode, this_rtx));
4943 1.1 mrg
4944 1.1 mrg /* Set ADDR to a legitimate address for *THIS_RTX + VCALL_OFFSET. */
4945 1.1 mrg addr = riscv_add_offset (temp2, temp1, vcall_offset);
4946 1.1 mrg
4947 1.1 mrg /* Load the offset and add it to THIS_RTX. */
4948 1.1 mrg riscv_emit_move (temp1, gen_rtx_MEM (Pmode, addr));
4949 1.1 mrg emit_insn (gen_add3_insn (this_rtx, this_rtx, temp1));
4950 1.1 mrg }
4951 1.1 mrg
4952 1.1 mrg /* Jump to the target function. */
4953 1.1 mrg insn = emit_call_insn (gen_sibcall (fnaddr, const0_rtx, NULL, const0_rtx));
4954 1.1 mrg SIBLING_CALL_P (insn) = 1;
4955 1.1 mrg
4956 1.1 mrg /* Run just enough of rest_of_compilation. This sequence was
4957 1.1 mrg "borrowed" from alpha.cc. */
4958 1.1 mrg insn = get_insns ();
4959 1.1 mrg split_all_insns_noflow ();
4960 1.1 mrg shorten_branches (insn);
4961 1.1 mrg assemble_start_function (thunk_fndecl, fnname);
4962 1.1 mrg final_start_function (insn, file, 1);
4963 1.1 mrg final (insn, file, 1);
4964 1.1 mrg final_end_function ();
4965 1.1 mrg assemble_end_function (thunk_fndecl, fnname);
4966 1.1 mrg
4967 1.1 mrg /* Clean up the vars set above. Note that final_end_function resets
4968 1.1 mrg the global pointer for us. */
4969 1.1 mrg reload_completed = 0;
4970 1.1 mrg }
4971 1.1 mrg
4972 1.1 mrg /* Allocate a chunk of memory for per-function machine-dependent data. */
4973 1.1 mrg
4974 1.1 mrg static struct machine_function *
4975 1.1 mrg riscv_init_machine_status (void)
4976 1.1 mrg {
4977 1.1 mrg return ggc_cleared_alloc<machine_function> ();
4978 1.1 mrg }
4979 1.1 mrg
4980 1.1 mrg /* Implement TARGET_OPTION_OVERRIDE. */
4981 1.1 mrg
4982 1.1 mrg static void
4983 1.1 mrg riscv_option_override (void)
4984 1.1 mrg {
4985 1.1 mrg const struct riscv_tune_info *cpu;
4986 1.1 mrg
4987 1.1 mrg #ifdef SUBTARGET_OVERRIDE_OPTIONS
4988 1.1 mrg SUBTARGET_OVERRIDE_OPTIONS;
4989 1.1 mrg #endif
4990 1.1 mrg
4991 1.1 mrg flag_pcc_struct_return = 0;
4992 1.1 mrg
4993 1.1 mrg if (flag_pic)
4994 1.1 mrg g_switch_value = 0;
4995 1.1 mrg
4996 1.1 mrg /* The presence of the M extension implies that division instructions
4997 1.1 mrg are present, so include them unless explicitly disabled. */
4998 1.1 mrg if (TARGET_MUL && (target_flags_explicit & MASK_DIV) == 0)
4999 1.1 mrg target_flags |= MASK_DIV;
5000 1.1 mrg else if (!TARGET_MUL && TARGET_DIV)
5001 1.1 mrg error ("%<-mdiv%> requires %<-march%> to subsume the %<M%> extension");
5002 1.1 mrg
5003 1.1 mrg /* Likewise floating-point division and square root. */
5004 1.1 mrg if (TARGET_HARD_FLOAT && (target_flags_explicit & MASK_FDIV) == 0)
5005 1.1 mrg target_flags |= MASK_FDIV;
5006 1.1 mrg
5007 1.1 mrg /* Handle -mtune, use -mcpu if -mtune is not given, and use default -mtune
5008 1.1 mrg if -mtune and -mcpu both not given. */
5009 1.1 mrg cpu = riscv_parse_tune (riscv_tune_string ? riscv_tune_string :
5010 1.1 mrg (riscv_cpu_string ? riscv_cpu_string :
5011 1.1 mrg RISCV_TUNE_STRING_DEFAULT));
5012 1.1 mrg riscv_microarchitecture = cpu->microarchitecture;
5013 1.1 mrg tune_param = optimize_size ? &optimize_size_tune_info : cpu->tune_param;
5014 1.1 mrg
5015 1.1 mrg /* Use -mtune's setting for slow_unaligned_access, even when optimizing
5016 1.1 mrg for size. For architectures that trap and emulate unaligned accesses,
5017 1.1 mrg the performance cost is too great, even for -Os. Similarly, if
5018 1.1 mrg -m[no-]strict-align is left unspecified, heed -mtune's advice. */
5019 1.1 mrg riscv_slow_unaligned_access_p = (cpu->tune_param->slow_unaligned_access
5020 1.1 mrg || TARGET_STRICT_ALIGN);
5021 1.1 mrg if ((target_flags_explicit & MASK_STRICT_ALIGN) == 0
5022 1.1 mrg && cpu->tune_param->slow_unaligned_access)
5023 1.1 mrg target_flags |= MASK_STRICT_ALIGN;
5024 1.1 mrg
5025 1.1 mrg /* If the user hasn't specified a branch cost, use the processor's
5026 1.1 mrg default. */
5027 1.1 mrg if (riscv_branch_cost == 0)
5028 1.1 mrg riscv_branch_cost = tune_param->branch_cost;
5029 1.1 mrg
5030 1.1 mrg /* Function to allocate machine-dependent function status. */
5031 1.1 mrg init_machine_status = &riscv_init_machine_status;
5032 1.1 mrg
5033 1.1 mrg if (flag_pic)
5034 1.1 mrg riscv_cmodel = CM_PIC;
5035 1.1 mrg
5036 1.1 mrg /* We get better code with explicit relocs for CM_MEDLOW, but
5037 1.1 mrg worse code for the others (for now). Pick the best default. */
5038 1.1 mrg if ((target_flags_explicit & MASK_EXPLICIT_RELOCS) == 0)
5039 1.1 mrg if (riscv_cmodel == CM_MEDLOW)
5040 1.1 mrg target_flags |= MASK_EXPLICIT_RELOCS;
5041 1.1 mrg
5042 1.1 mrg /* Require that the ISA supports the requested floating-point ABI. */
5043 1.1 mrg if (UNITS_PER_FP_ARG > (TARGET_HARD_FLOAT ? UNITS_PER_FP_REG : 0))
5044 1.1 mrg error ("requested ABI requires %<-march%> to subsume the %qc extension",
5045 1.1 mrg UNITS_PER_FP_ARG > 8 ? 'Q' : (UNITS_PER_FP_ARG > 4 ? 'D' : 'F'));
5046 1.1 mrg
5047 1.1 mrg if (TARGET_RVE && riscv_abi != ABI_ILP32E)
5048 1.1 mrg error ("rv32e requires ilp32e ABI");
5049 1.1 mrg
5050 1.1 mrg /* We do not yet support ILP32 on RV64. */
5051 1.1 mrg if (BITS_PER_WORD != POINTER_SIZE)
5052 1.1 mrg error ("ABI requires %<-march=rv%d%>", POINTER_SIZE);
5053 1.1 mrg
5054 1.1 mrg /* Validate -mpreferred-stack-boundary= value. */
5055 1.1 mrg riscv_stack_boundary = ABI_STACK_BOUNDARY;
5056 1.1 mrg if (riscv_preferred_stack_boundary_arg)
5057 1.1 mrg {
5058 1.1 mrg int min = ctz_hwi (STACK_BOUNDARY / 8);
5059 1.1 mrg int max = 8;
5060 1.1 mrg
5061 1.1 mrg if (!IN_RANGE (riscv_preferred_stack_boundary_arg, min, max))
5062 1.1 mrg error ("%<-mpreferred-stack-boundary=%d%> must be between %d and %d",
5063 1.1 mrg riscv_preferred_stack_boundary_arg, min, max);
5064 1.1 mrg
5065 1.1 mrg riscv_stack_boundary = 8 << riscv_preferred_stack_boundary_arg;
5066 1.1 mrg }
5067 1.1 mrg
5068 1.1 mrg if (riscv_emit_attribute_p < 0)
5069 1.1 mrg #ifdef HAVE_AS_RISCV_ATTRIBUTE
5070 1.1 mrg riscv_emit_attribute_p = TARGET_RISCV_ATTRIBUTE;
5071 1.1 mrg #else
5072 1.1 mrg riscv_emit_attribute_p = 0;
5073 1.1 mrg
5074 1.1 mrg if (riscv_emit_attribute_p)
5075 1.1 mrg error ("%<-mriscv-attribute%> RISC-V ELF attribute requires GNU as 2.32"
5076 1.1 mrg " [%<-mriscv-attribute%>]");
5077 1.1 mrg #endif
5078 1.1 mrg
5079 1.1 mrg if (riscv_stack_protector_guard == SSP_GLOBAL
5080 1.1 mrg && OPTION_SET_P (riscv_stack_protector_guard_offset_str))
5081 1.1 mrg {
5082 1.1 mrg error ("incompatible options %<-mstack-protector-guard=global%> and "
5083 1.1 mrg "%<-mstack-protector-guard-offset=%s%>",
5084 1.1 mrg riscv_stack_protector_guard_offset_str);
5085 1.1 mrg }
5086 1.1 mrg
5087 1.1 mrg if (riscv_stack_protector_guard == SSP_TLS
5088 1.1 mrg && !(OPTION_SET_P (riscv_stack_protector_guard_offset_str)
5089 1.1 mrg && OPTION_SET_P (riscv_stack_protector_guard_reg_str)))
5090 1.1 mrg {
5091 1.1 mrg error ("both %<-mstack-protector-guard-offset%> and "
5092 1.1 mrg "%<-mstack-protector-guard-reg%> must be used "
5093 1.1 mrg "with %<-mstack-protector-guard=sysreg%>");
5094 1.1 mrg }
5095 1.1 mrg
5096 1.1 mrg if (OPTION_SET_P (riscv_stack_protector_guard_reg_str))
5097 1.1 mrg {
5098 1.1 mrg const char *str = riscv_stack_protector_guard_reg_str;
5099 1.1 mrg int reg = decode_reg_name (str);
5100 1.1 mrg
5101 1.1 mrg if (!IN_RANGE (reg, GP_REG_FIRST + 1, GP_REG_LAST))
5102 1.1 mrg error ("%qs is not a valid base register in %qs", str,
5103 1.1 mrg "-mstack-protector-guard-reg=");
5104 1.1 mrg
5105 1.1 mrg riscv_stack_protector_guard_reg = reg;
5106 1.1 mrg }
5107 1.1 mrg
5108 1.1 mrg if (OPTION_SET_P (riscv_stack_protector_guard_offset_str))
5109 1.1 mrg {
5110 1.1 mrg char *end;
5111 1.1 mrg const char *str = riscv_stack_protector_guard_offset_str;
5112 1.1 mrg errno = 0;
5113 1.1 mrg long offs = strtol (riscv_stack_protector_guard_offset_str, &end, 0);
5114 1.1 mrg
5115 1.1 mrg if (!*str || *end || errno)
5116 1.1 mrg error ("%qs is not a valid number in %qs", str,
5117 1.1 mrg "-mstack-protector-guard-offset=");
5118 1.1 mrg
5119 1.1 mrg if (!SMALL_OPERAND (offs))
5120 1.1 mrg error ("%qs is not a valid offset in %qs", str,
5121 1.1 mrg "-mstack-protector-guard-offset=");
5122 1.1 mrg
5123 1.1 mrg riscv_stack_protector_guard_offset = offs;
5124 1.1 mrg }
5125 1.1 mrg
5126 1.1 mrg }
5127 1.1 mrg
5128 1.1 mrg /* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */
5129 1.1 mrg
5130 1.1 mrg static void
5131 1.1 mrg riscv_conditional_register_usage (void)
5132 1.1 mrg {
5133 1.1 mrg /* We have only x0~x15 on RV32E. */
5134 1.1 mrg if (TARGET_RVE)
5135 1.1 mrg {
5136 1.1 mrg for (int r = 16; r <= 31; r++)
5137 1.1 mrg fixed_regs[r] = 1;
5138 1.1 mrg }
5139 1.1 mrg
5140 1.1 mrg if (riscv_abi == ABI_ILP32E)
5141 1.1 mrg {
5142 1.1 mrg for (int r = 16; r <= 31; r++)
5143 1.1 mrg call_used_regs[r] = 1;
5144 1.1 mrg }
5145 1.1 mrg
5146 1.1 mrg if (!TARGET_HARD_FLOAT)
5147 1.1 mrg {
5148 1.1 mrg for (int regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
5149 1.1 mrg fixed_regs[regno] = call_used_regs[regno] = 1;
5150 1.1 mrg }
5151 1.1 mrg
5152 1.1 mrg /* In the soft-float ABI, there are no callee-saved FP registers. */
5153 1.1 mrg if (UNITS_PER_FP_ARG == 0)
5154 1.1 mrg {
5155 1.1 mrg for (int regno = FP_REG_FIRST; regno <= FP_REG_LAST; regno++)
5156 1.1 mrg call_used_regs[regno] = 1;
5157 1.1 mrg }
5158 1.1 mrg }
5159 1.1 mrg
5160 1.1 mrg /* Return a register priority for hard reg REGNO. */
5161 1.1 mrg
5162 1.1 mrg static int
5163 1.1 mrg riscv_register_priority (int regno)
5164 1.1 mrg {
5165 1.1 mrg /* Favor compressed registers to improve the odds of RVC instruction
5166 1.1 mrg selection. */
5167 1.1 mrg if (riscv_compressed_reg_p (regno))
5168 1.1 mrg return 1;
5169 1.1 mrg
5170 1.1 mrg return 0;
5171 1.1 mrg }
5172 1.1 mrg
5173 1.1 mrg /* Implement TARGET_TRAMPOLINE_INIT. */
5174 1.1 mrg
5175 1.1 mrg static void
5176 1.1 mrg riscv_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
5177 1.1 mrg {
5178 1.1 mrg rtx addr, end_addr, mem;
5179 1.1 mrg uint32_t trampoline[4];
5180 1.1 mrg unsigned int i;
5181 1.1 mrg HOST_WIDE_INT static_chain_offset, target_function_offset;
5182 1.1 mrg
5183 1.1 mrg /* Work out the offsets of the pointers from the start of the
5184 1.1 mrg trampoline code. */
5185 1.1 mrg gcc_assert (ARRAY_SIZE (trampoline) * 4 == TRAMPOLINE_CODE_SIZE);
5186 1.1 mrg
5187 1.1 mrg /* Get pointers to the beginning and end of the code block. */
5188 1.1 mrg addr = force_reg (Pmode, XEXP (m_tramp, 0));
5189 1.1 mrg end_addr = riscv_force_binary (Pmode, PLUS, addr,
5190 1.1 mrg GEN_INT (TRAMPOLINE_CODE_SIZE));
5191 1.1 mrg
5192 1.1 mrg
5193 1.1 mrg if (Pmode == SImode)
5194 1.1 mrg {
5195 1.1 mrg chain_value = force_reg (Pmode, chain_value);
5196 1.1 mrg
5197 1.1 mrg rtx target_function = force_reg (Pmode, XEXP (DECL_RTL (fndecl), 0));
5198 1.1 mrg /* lui t2, hi(chain)
5199 1.1 mrg lui t0, hi(func)
5200 1.1 mrg addi t2, t2, lo(chain)
5201 1.1 mrg jr t0, lo(func)
5202 1.1 mrg */
5203 1.1 mrg unsigned HOST_WIDE_INT lui_hi_chain_code, lui_hi_func_code;
5204 1.1 mrg unsigned HOST_WIDE_INT lo_chain_code, lo_func_code;
5205 1.1 mrg
5206 1.1 mrg rtx uimm_mask = force_reg (SImode, gen_int_mode (-IMM_REACH, SImode));
5207 1.1 mrg
5208 1.1 mrg /* 0xfff. */
5209 1.1 mrg rtx imm12_mask = gen_reg_rtx (SImode);
5210 1.1 mrg emit_insn (gen_one_cmplsi2 (imm12_mask, uimm_mask));
5211 1.1 mrg
5212 1.1 mrg rtx fixup_value = force_reg (SImode, gen_int_mode (IMM_REACH/2, SImode));
5213 1.1 mrg
5214 1.1 mrg /* Gen lui t2, hi(chain). */
5215 1.1 mrg rtx hi_chain = riscv_force_binary (SImode, PLUS, chain_value,
5216 1.1 mrg fixup_value);
5217 1.1 mrg hi_chain = riscv_force_binary (SImode, AND, hi_chain,
5218 1.1 mrg uimm_mask);
5219 1.1 mrg lui_hi_chain_code = OPCODE_LUI | (STATIC_CHAIN_REGNUM << SHIFT_RD);
5220 1.1 mrg rtx lui_hi_chain = riscv_force_binary (SImode, IOR, hi_chain,
5221 1.1 mrg gen_int_mode (lui_hi_chain_code, SImode));
5222 1.1 mrg
5223 1.1 mrg mem = adjust_address (m_tramp, SImode, 0);
5224 1.1 mrg riscv_emit_move (mem, riscv_swap_instruction (lui_hi_chain));
5225 1.1 mrg
5226 1.1 mrg /* Gen lui t0, hi(func). */
5227 1.1 mrg rtx hi_func = riscv_force_binary (SImode, PLUS, target_function,
5228 1.1 mrg fixup_value);
5229 1.1 mrg hi_func = riscv_force_binary (SImode, AND, hi_func,
5230 1.1 mrg uimm_mask);
5231 1.1 mrg lui_hi_func_code = OPCODE_LUI | (RISCV_PROLOGUE_TEMP_REGNUM << SHIFT_RD);
5232 1.1 mrg rtx lui_hi_func = riscv_force_binary (SImode, IOR, hi_func,
5233 1.1 mrg gen_int_mode (lui_hi_func_code, SImode));
5234 1.1 mrg
5235 1.1 mrg mem = adjust_address (m_tramp, SImode, 1 * GET_MODE_SIZE (SImode));
5236 1.1 mrg riscv_emit_move (mem, riscv_swap_instruction (lui_hi_func));
5237 1.1 mrg
5238 1.1 mrg /* Gen addi t2, t2, lo(chain). */
5239 1.1 mrg rtx lo_chain = riscv_force_binary (SImode, AND, chain_value,
5240 1.1 mrg imm12_mask);
5241 1.1 mrg lo_chain = riscv_force_binary (SImode, ASHIFT, lo_chain, GEN_INT (20));
5242 1.1 mrg
5243 1.1 mrg lo_chain_code = OPCODE_ADDI
5244 1.1 mrg | (STATIC_CHAIN_REGNUM << SHIFT_RD)
5245 1.1 mrg | (STATIC_CHAIN_REGNUM << SHIFT_RS1);
5246 1.1 mrg
5247 1.1 mrg rtx addi_lo_chain = riscv_force_binary (SImode, IOR, lo_chain,
5248 1.1 mrg force_reg (SImode, GEN_INT (lo_chain_code)));
5249 1.1 mrg
5250 1.1 mrg mem = adjust_address (m_tramp, SImode, 2 * GET_MODE_SIZE (SImode));
5251 1.1 mrg riscv_emit_move (mem, riscv_swap_instruction (addi_lo_chain));
5252 1.1 mrg
5253 1.1 mrg /* Gen jr t0, lo(func). */
5254 1.1 mrg rtx lo_func = riscv_force_binary (SImode, AND, target_function,
5255 1.1 mrg imm12_mask);
5256 1.1 mrg lo_func = riscv_force_binary (SImode, ASHIFT, lo_func, GEN_INT (20));
5257 1.1 mrg
5258 1.1 mrg lo_func_code = OPCODE_JALR | (RISCV_PROLOGUE_TEMP_REGNUM << SHIFT_RS1);
5259 1.1 mrg
5260 1.1 mrg rtx jr_lo_func = riscv_force_binary (SImode, IOR, lo_func,
5261 1.1 mrg force_reg (SImode, GEN_INT (lo_func_code)));
5262 1.1 mrg
5263 1.1 mrg mem = adjust_address (m_tramp, SImode, 3 * GET_MODE_SIZE (SImode));
5264 1.1 mrg riscv_emit_move (mem, riscv_swap_instruction (jr_lo_func));
5265 1.1 mrg }
5266 1.1 mrg else
5267 1.1 mrg {
5268 1.1 mrg static_chain_offset = TRAMPOLINE_CODE_SIZE;
5269 1.1 mrg target_function_offset = static_chain_offset + GET_MODE_SIZE (ptr_mode);
5270 1.1 mrg
5271 1.1 mrg /* auipc t2, 0
5272 1.1 mrg l[wd] t0, target_function_offset(t2)
5273 1.1 mrg l[wd] t2, static_chain_offset(t2)
5274 1.1 mrg jr t0
5275 1.1 mrg */
5276 1.1 mrg trampoline[0] = OPCODE_AUIPC | (STATIC_CHAIN_REGNUM << SHIFT_RD);
5277 1.1 mrg trampoline[1] = (Pmode == DImode ? OPCODE_LD : OPCODE_LW)
5278 1.1 mrg | (RISCV_PROLOGUE_TEMP_REGNUM << SHIFT_RD)
5279 1.1 mrg | (STATIC_CHAIN_REGNUM << SHIFT_RS1)
5280 1.1 mrg | (target_function_offset << SHIFT_IMM);
5281 1.1 mrg trampoline[2] = (Pmode == DImode ? OPCODE_LD : OPCODE_LW)
5282 1.1 mrg | (STATIC_CHAIN_REGNUM << SHIFT_RD)
5283 1.1 mrg | (STATIC_CHAIN_REGNUM << SHIFT_RS1)
5284 1.1 mrg | (static_chain_offset << SHIFT_IMM);
5285 1.1 mrg trampoline[3] = OPCODE_JALR | (RISCV_PROLOGUE_TEMP_REGNUM << SHIFT_RS1);
5286 1.1 mrg
5287 1.1 mrg /* Copy the trampoline code. */
5288 1.1 mrg for (i = 0; i < ARRAY_SIZE (trampoline); i++)
5289 1.1 mrg {
5290 1.1 mrg if (BYTES_BIG_ENDIAN)
5291 1.1 mrg trampoline[i] = __builtin_bswap32(trampoline[i]);
5292 1.1 mrg mem = adjust_address (m_tramp, SImode, i * GET_MODE_SIZE (SImode));
5293 1.1 mrg riscv_emit_move (mem, gen_int_mode (trampoline[i], SImode));
5294 1.1 mrg }
5295 1.1 mrg
5296 1.1 mrg /* Set up the static chain pointer field. */
5297 1.1 mrg mem = adjust_address (m_tramp, ptr_mode, static_chain_offset);
5298 1.1 mrg riscv_emit_move (mem, chain_value);
5299 1.1 mrg
5300 1.1 mrg /* Set up the target function field. */
5301 1.1 mrg mem = adjust_address (m_tramp, ptr_mode, target_function_offset);
5302 1.1 mrg riscv_emit_move (mem, XEXP (DECL_RTL (fndecl), 0));
5303 1.1 mrg }
5304 1.1 mrg
5305 1.1 mrg /* Flush the code part of the trampoline. */
5306 1.1 mrg emit_insn (gen_add3_insn (end_addr, addr, GEN_INT (TRAMPOLINE_SIZE)));
5307 1.1 mrg emit_insn (gen_clear_cache (addr, end_addr));
5308 1.1 mrg }
5309 1.1 mrg
5310 1.1 mrg /* Implement TARGET_FUNCTION_OK_FOR_SIBCALL. */
5311 1.1 mrg
5312 1.1 mrg static bool
5313 1.1 mrg riscv_function_ok_for_sibcall (tree decl ATTRIBUTE_UNUSED,
5314 1.1 mrg tree exp ATTRIBUTE_UNUSED)
5315 1.1 mrg {
5316 1.1 mrg /* Don't use sibcalls when use save-restore routine. */
5317 1.1 mrg if (TARGET_SAVE_RESTORE)
5318 1.1 mrg return false;
5319 1.1 mrg
5320 1.1 mrg /* Don't use sibcall for naked functions. */
5321 1.1 mrg if (cfun->machine->naked_p)
5322 1.1 mrg return false;
5323 1.1 mrg
5324 1.1 mrg /* Don't use sibcall for interrupt functions. */
5325 1.1 mrg if (cfun->machine->interrupt_handler_p)
5326 1.1 mrg return false;
5327 1.1 mrg
5328 1.1 mrg return true;
5329 1.1 mrg }
5330 1.1 mrg
5331 1.1 mrg /* Get the interrupt type, return UNKNOWN_MODE if it's not
5332 1.1 mrg interrupt function. */
5333 1.1 mrg static enum riscv_privilege_levels
5334 1.1 mrg riscv_get_interrupt_type (tree decl)
5335 1.1 mrg {
5336 1.1 mrg gcc_assert (decl != NULL_TREE);
5337 1.1 mrg
5338 1.1 mrg if ((TREE_CODE(decl) != FUNCTION_DECL)
5339 1.1 mrg || (!riscv_interrupt_type_p (TREE_TYPE (decl))))
5340 1.1 mrg return UNKNOWN_MODE;
5341 1.1 mrg
5342 1.1 mrg tree attr_args
5343 1.1 mrg = TREE_VALUE (lookup_attribute ("interrupt",
5344 1.1 mrg TYPE_ATTRIBUTES (TREE_TYPE (decl))));
5345 1.1 mrg
5346 1.1 mrg if (attr_args && TREE_CODE (TREE_VALUE (attr_args)) != VOID_TYPE)
5347 1.1 mrg {
5348 1.1 mrg const char *string = TREE_STRING_POINTER (TREE_VALUE (attr_args));
5349 1.1 mrg
5350 1.1 mrg if (!strcmp (string, "user"))
5351 1.1 mrg return USER_MODE;
5352 1.1 mrg else if (!strcmp (string, "supervisor"))
5353 1.1 mrg return SUPERVISOR_MODE;
5354 1.1 mrg else /* Must be "machine". */
5355 1.1 mrg return MACHINE_MODE;
5356 1.1 mrg }
5357 1.1 mrg else
5358 1.1 mrg /* Interrupt attributes are machine mode by default. */
5359 1.1 mrg return MACHINE_MODE;
5360 1.1 mrg }
5361 1.1 mrg
5362 1.1 mrg /* Implement `TARGET_SET_CURRENT_FUNCTION'. */
5363 1.1 mrg /* Sanity cheching for above function attributes. */
5364 1.1 mrg static void
5365 1.1 mrg riscv_set_current_function (tree decl)
5366 1.1 mrg {
5367 1.1 mrg if (decl == NULL_TREE
5368 1.1 mrg || current_function_decl == NULL_TREE
5369 1.1 mrg || current_function_decl == error_mark_node
5370 1.1 mrg || ! cfun->machine
5371 1.1 mrg || cfun->machine->attributes_checked_p)
5372 1.1 mrg return;
5373 1.1 mrg
5374 1.1 mrg cfun->machine->naked_p = riscv_naked_function_p (decl);
5375 1.1 mrg cfun->machine->interrupt_handler_p
5376 1.1 mrg = riscv_interrupt_type_p (TREE_TYPE (decl));
5377 1.1 mrg
5378 1.1 mrg if (cfun->machine->naked_p && cfun->machine->interrupt_handler_p)
5379 1.1 mrg error ("function attributes %qs and %qs are mutually exclusive",
5380 1.1 mrg "interrupt", "naked");
5381 1.1 mrg
5382 1.1 mrg if (cfun->machine->interrupt_handler_p)
5383 1.1 mrg {
5384 1.1 mrg tree ret = TREE_TYPE (TREE_TYPE (decl));
5385 1.1 mrg tree args = TYPE_ARG_TYPES (TREE_TYPE (decl));
5386 1.1 mrg
5387 1.1 mrg if (TREE_CODE (ret) != VOID_TYPE)
5388 1.1 mrg error ("%qs function cannot return a value", "interrupt");
5389 1.1 mrg
5390 1.1 mrg if (args && TREE_CODE (TREE_VALUE (args)) != VOID_TYPE)
5391 1.1 mrg error ("%qs function cannot have arguments", "interrupt");
5392 1.1 mrg
5393 1.1 mrg cfun->machine->interrupt_mode = riscv_get_interrupt_type (decl);
5394 1.1 mrg
5395 1.1 mrg gcc_assert (cfun->machine->interrupt_mode != UNKNOWN_MODE);
5396 1.1 mrg }
5397 1.1 mrg
5398 1.1 mrg /* Don't print the above diagnostics more than once. */
5399 1.1 mrg cfun->machine->attributes_checked_p = 1;
5400 1.1 mrg }
5401 1.1 mrg
5402 1.1 mrg /* Implement TARGET_MERGE_DECL_ATTRIBUTES. */
5403 1.1 mrg static tree
5404 1.1 mrg riscv_merge_decl_attributes (tree olddecl, tree newdecl)
5405 1.1 mrg {
5406 1.1 mrg tree combined_attrs;
5407 1.1 mrg
5408 1.1 mrg enum riscv_privilege_levels old_interrupt_type
5409 1.1 mrg = riscv_get_interrupt_type (olddecl);
5410 1.1 mrg enum riscv_privilege_levels new_interrupt_type
5411 1.1 mrg = riscv_get_interrupt_type (newdecl);
5412 1.1 mrg
5413 1.1 mrg /* Check old and new has same interrupt type. */
5414 1.1 mrg if ((old_interrupt_type != UNKNOWN_MODE)
5415 1.1 mrg && (new_interrupt_type != UNKNOWN_MODE)
5416 1.1 mrg && (old_interrupt_type != new_interrupt_type))
5417 1.1 mrg error ("%qs function cannot have different interrupt type", "interrupt");
5418 1.1 mrg
5419 1.1 mrg /* Create combined attributes. */
5420 1.1 mrg combined_attrs = merge_attributes (DECL_ATTRIBUTES (olddecl),
5421 1.1 mrg DECL_ATTRIBUTES (newdecl));
5422 1.1 mrg
5423 1.1 mrg return combined_attrs;
5424 1.1 mrg }
5425 1.1 mrg
5426 1.1 mrg /* Implement TARGET_CANNOT_COPY_INSN_P. */
5427 1.1 mrg
5428 1.1 mrg static bool
5429 1.1 mrg riscv_cannot_copy_insn_p (rtx_insn *insn)
5430 1.1 mrg {
5431 1.1 mrg return recog_memoized (insn) >= 0 && get_attr_cannot_copy (insn);
5432 1.1 mrg }
5433 1.1 mrg
5434 1.1 mrg /* Implement TARGET_SLOW_UNALIGNED_ACCESS. */
5435 1.1 mrg
5436 1.1 mrg static bool
5437 1.1 mrg riscv_slow_unaligned_access (machine_mode, unsigned int)
5438 1.1 mrg {
5439 1.1 mrg return riscv_slow_unaligned_access_p;
5440 1.1 mrg }
5441 1.1 mrg
5442 1.1 mrg /* Implement TARGET_CAN_CHANGE_MODE_CLASS. */
5443 1.1 mrg
5444 1.1 mrg static bool
5445 1.1 mrg riscv_can_change_mode_class (machine_mode, machine_mode, reg_class_t rclass)
5446 1.1 mrg {
5447 1.1 mrg return !reg_classes_intersect_p (FP_REGS, rclass);
5448 1.1 mrg }
5449 1.1 mrg
5450 1.1 mrg
5451 1.1 mrg /* Implement TARGET_CONSTANT_ALIGNMENT. */
5452 1.1 mrg
5453 1.1 mrg static HOST_WIDE_INT
5454 1.1 mrg riscv_constant_alignment (const_tree exp, HOST_WIDE_INT align)
5455 1.1 mrg {
5456 1.1 mrg if ((TREE_CODE (exp) == STRING_CST || TREE_CODE (exp) == CONSTRUCTOR)
5457 1.1 mrg && (riscv_align_data_type == riscv_align_data_type_xlen))
5458 1.1 mrg return MAX (align, BITS_PER_WORD);
5459 1.1 mrg return align;
5460 1.1 mrg }
5461 1.1 mrg
5462 1.1 mrg /* Implement TARGET_PROMOTE_FUNCTION_MODE. */
5463 1.1 mrg
5464 1.1 mrg /* This function is equivalent to default_promote_function_mode_always_promote
5465 1.1 mrg except that it returns a promoted mode even if type is NULL_TREE. This is
5466 1.1 mrg needed by libcalls which have no type (only a mode) such as fixed conversion
5467 1.1 mrg routines that take a signed or unsigned char/short/int argument and convert
5468 1.1 mrg it to a fixed type. */
5469 1.1 mrg
5470 1.1 mrg static machine_mode
5471 1.1 mrg riscv_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
5472 1.1 mrg machine_mode mode,
5473 1.1 mrg int *punsignedp ATTRIBUTE_UNUSED,
5474 1.1 mrg const_tree fntype ATTRIBUTE_UNUSED,
5475 1.1 mrg int for_return ATTRIBUTE_UNUSED)
5476 1.1 mrg {
5477 1.1 mrg int unsignedp;
5478 1.1 mrg
5479 1.1 mrg if (type != NULL_TREE)
5480 1.1 mrg return promote_mode (type, mode, punsignedp);
5481 1.1 mrg
5482 1.1 mrg unsignedp = *punsignedp;
5483 1.1 mrg PROMOTE_MODE (mode, unsignedp, type);
5484 1.1 mrg *punsignedp = unsignedp;
5485 1.1 mrg return mode;
5486 1.1 mrg }
5487 1.1 mrg
5488 1.1 mrg /* Implement TARGET_MACHINE_DEPENDENT_REORG. */
5489 1.1 mrg
5490 1.1 mrg static void
5491 1.1 mrg riscv_reorg (void)
5492 1.1 mrg {
5493 1.1 mrg /* Do nothing unless we have -msave-restore */
5494 1.1 mrg if (TARGET_SAVE_RESTORE)
5495 1.1 mrg riscv_remove_unneeded_save_restore_calls ();
5496 1.1 mrg }
5497 1.1 mrg
5498 1.1 mrg /* Return nonzero if register FROM_REGNO can be renamed to register
5499 1.1 mrg TO_REGNO. */
5500 1.1 mrg
5501 1.1 mrg bool
5502 1.1 mrg riscv_hard_regno_rename_ok (unsigned from_regno ATTRIBUTE_UNUSED,
5503 1.1 mrg unsigned to_regno)
5504 1.1 mrg {
5505 1.1 mrg /* Interrupt functions can only use registers that have already been
5506 1.1 mrg saved by the prologue, even if they would normally be
5507 1.1 mrg call-clobbered. */
5508 1.1 mrg return !cfun->machine->interrupt_handler_p || df_regs_ever_live_p (to_regno);
5509 1.1 mrg }
5510 1.1 mrg
5511 1.1 mrg /* Implement TARGET_NEW_ADDRESS_PROFITABLE_P. */
5512 1.1 mrg
5513 1.1 mrg bool
5514 1.1 mrg riscv_new_address_profitable_p (rtx memref, rtx_insn *insn, rtx new_addr)
5515 1.1 mrg {
5516 1.1 mrg /* Prefer old address if it is less expensive. */
5517 1.1 mrg addr_space_t as = MEM_ADDR_SPACE (memref);
5518 1.1 mrg bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
5519 1.1 mrg int old_cost = address_cost (XEXP (memref, 0), GET_MODE (memref), as, speed);
5520 1.1 mrg int new_cost = address_cost (new_addr, GET_MODE (memref), as, speed);
5521 1.1 mrg return new_cost <= old_cost;
5522 1.1 mrg }
5523 1.1 mrg
5524 1.1 mrg /* Helper function for generating gpr_save pattern. */
5525 1.1 mrg
5526 1.1 mrg rtx
5527 1.1 mrg riscv_gen_gpr_save_insn (struct riscv_frame_info *frame)
5528 1.1 mrg {
5529 1.1 mrg unsigned count = riscv_save_libcall_count (frame->mask);
5530 1.1 mrg /* 1 for unspec 2 for clobber t0/t1 and 1 for ra. */
5531 1.1 mrg unsigned veclen = 1 + 2 + 1 + count;
5532 1.1 mrg rtvec vec = rtvec_alloc (veclen);
5533 1.1 mrg
5534 1.1 mrg gcc_assert (veclen <= ARRAY_SIZE (gpr_save_reg_order));
5535 1.1 mrg
5536 1.1 mrg RTVEC_ELT (vec, 0) =
5537 1.1 mrg gen_rtx_UNSPEC_VOLATILE (VOIDmode,
5538 1.1 mrg gen_rtvec (1, GEN_INT (count)), UNSPECV_GPR_SAVE);
5539 1.1 mrg
5540 1.1 mrg for (unsigned i = 1; i < veclen; ++i)
5541 1.1 mrg {
5542 1.1 mrg unsigned regno = gpr_save_reg_order[i];
5543 1.1 mrg rtx reg = gen_rtx_REG (Pmode, regno);
5544 1.1 mrg rtx elt;
5545 1.1 mrg
5546 1.1 mrg /* t0 and t1 are CLOBBERs, others are USEs. */
5547 1.1 mrg if (i < 3)
5548 1.1 mrg elt = gen_rtx_CLOBBER (Pmode, reg);
5549 1.1 mrg else
5550 1.1 mrg elt = gen_rtx_USE (Pmode, reg);
5551 1.1 mrg
5552 1.1 mrg RTVEC_ELT (vec, i) = elt;
5553 1.1 mrg }
5554 1.1 mrg
5555 1.1 mrg /* Largest number of caller-save register must set in mask if we are
5556 1.1 mrg not using __riscv_save_0. */
5557 1.1 mrg gcc_assert ((count == 0) ||
5558 1.1 mrg BITSET_P (frame->mask, gpr_save_reg_order[veclen - 1]));
5559 1.1 mrg
5560 1.1 mrg return gen_rtx_PARALLEL (VOIDmode, vec);
5561 1.1 mrg }
5562 1.1 mrg
5563 1.1 mrg /* Return true if it's valid gpr_save pattern. */
5564 1.1 mrg
5565 1.1 mrg bool
5566 1.1 mrg riscv_gpr_save_operation_p (rtx op)
5567 1.1 mrg {
5568 1.1 mrg unsigned len = XVECLEN (op, 0);
5569 1.1 mrg
5570 1.1 mrg if (len > ARRAY_SIZE (gpr_save_reg_order))
5571 1.1 mrg return false;
5572 1.1 mrg
5573 1.1 mrg for (unsigned i = 0; i < len; i++)
5574 1.1 mrg {
5575 1.1 mrg rtx elt = XVECEXP (op, 0, i);
5576 1.1 mrg if (i == 0)
5577 1.1 mrg {
5578 1.1 mrg /* First element in parallel is unspec. */
5579 1.1 mrg if (GET_CODE (elt) != UNSPEC_VOLATILE
5580 1.1 mrg || GET_CODE (XVECEXP (elt, 0, 0)) != CONST_INT
5581 1.1 mrg || XINT (elt, 1) != UNSPECV_GPR_SAVE)
5582 1.1 mrg return false;
5583 1.1 mrg }
5584 1.1 mrg else
5585 1.1 mrg {
5586 1.1 mrg /* Two CLOBBER and USEs, must check the order. */
5587 1.1 mrg unsigned expect_code = i < 3 ? CLOBBER : USE;
5588 1.1 mrg if (GET_CODE (elt) != expect_code
5589 1.1 mrg || !REG_P (XEXP (elt, 1))
5590 1.1 mrg || (REGNO (XEXP (elt, 1)) != gpr_save_reg_order[i]))
5591 1.1 mrg return false;
5592 1.1 mrg }
5593 1.1 mrg break;
5594 1.1 mrg }
5595 1.1 mrg return true;
5596 1.1 mrg }
5597 1.1 mrg
5598 1.1 mrg /* Implement TARGET_ASAN_SHADOW_OFFSET. */
5599 1.1 mrg
5600 1.1 mrg static unsigned HOST_WIDE_INT
5601 1.1 mrg riscv_asan_shadow_offset (void)
5602 1.1 mrg {
5603 1.1 mrg /* We only have libsanitizer support for RV64 at present.
5604 1.1 mrg
5605 1.1 mrg This number must match kRiscv*_ShadowOffset* in the file
5606 1.1 mrg libsanitizer/asan/asan_mapping.h. */
5607 1.1 mrg return TARGET_64BIT ? HOST_WIDE_INT_UC (0xd55550000) : 0;
5608 1.1 mrg }
5609 1.1 mrg
5610 1.1 mrg /* Initialize the GCC target structure. */
5611 1.1 mrg #undef TARGET_ASM_ALIGNED_HI_OP
5612 1.1 mrg #define TARGET_ASM_ALIGNED_HI_OP "\t.half\t"
5613 1.1 mrg #undef TARGET_ASM_ALIGNED_SI_OP
5614 1.1 mrg #define TARGET_ASM_ALIGNED_SI_OP "\t.word\t"
5615 1.1 mrg #undef TARGET_ASM_ALIGNED_DI_OP
5616 1.1 mrg #define TARGET_ASM_ALIGNED_DI_OP "\t.dword\t"
5617 1.1 mrg
5618 1.1 mrg #undef TARGET_OPTION_OVERRIDE
5619 1.1 mrg #define TARGET_OPTION_OVERRIDE riscv_option_override
5620 1.1 mrg
5621 1.1 mrg #undef TARGET_LEGITIMIZE_ADDRESS
5622 1.1 mrg #define TARGET_LEGITIMIZE_ADDRESS riscv_legitimize_address
5623 1.1 mrg
5624 1.1 mrg #undef TARGET_SCHED_ISSUE_RATE
5625 1.1 mrg #define TARGET_SCHED_ISSUE_RATE riscv_issue_rate
5626 1.1 mrg
5627 1.1 mrg #undef TARGET_FUNCTION_OK_FOR_SIBCALL
5628 1.1 mrg #define TARGET_FUNCTION_OK_FOR_SIBCALL riscv_function_ok_for_sibcall
5629 1.1 mrg
5630 1.1 mrg #undef TARGET_SET_CURRENT_FUNCTION
5631 1.1 mrg #define TARGET_SET_CURRENT_FUNCTION riscv_set_current_function
5632 1.1 mrg
5633 1.1 mrg #undef TARGET_REGISTER_MOVE_COST
5634 1.1 mrg #define TARGET_REGISTER_MOVE_COST riscv_register_move_cost
5635 1.1 mrg #undef TARGET_MEMORY_MOVE_COST
5636 1.1 mrg #define TARGET_MEMORY_MOVE_COST riscv_memory_move_cost
5637 1.1 mrg #undef TARGET_RTX_COSTS
5638 1.1 mrg #define TARGET_RTX_COSTS riscv_rtx_costs
5639 1.1 mrg #undef TARGET_ADDRESS_COST
5640 1.1 mrg #define TARGET_ADDRESS_COST riscv_address_cost
5641 1.1 mrg
5642 1.1 mrg #undef TARGET_ASM_FILE_START
5643 1.1 mrg #define TARGET_ASM_FILE_START riscv_file_start
5644 1.1 mrg #undef TARGET_ASM_FILE_START_FILE_DIRECTIVE
5645 1.1 mrg #define TARGET_ASM_FILE_START_FILE_DIRECTIVE true
5646 1.1 mrg
5647 1.1 mrg #undef TARGET_EXPAND_BUILTIN_VA_START
5648 1.1 mrg #define TARGET_EXPAND_BUILTIN_VA_START riscv_va_start
5649 1.1 mrg
5650 1.1 mrg #undef TARGET_PROMOTE_FUNCTION_MODE
5651 1.1 mrg #define TARGET_PROMOTE_FUNCTION_MODE riscv_promote_function_mode
5652 1.1 mrg
5653 1.1 mrg #undef TARGET_RETURN_IN_MEMORY
5654 1.1 mrg #define TARGET_RETURN_IN_MEMORY riscv_return_in_memory
5655 1.1 mrg
5656 1.1 mrg #undef TARGET_ASM_OUTPUT_MI_THUNK
5657 1.1 mrg #define TARGET_ASM_OUTPUT_MI_THUNK riscv_output_mi_thunk
5658 1.1 mrg #undef TARGET_ASM_CAN_OUTPUT_MI_THUNK
5659 1.1 mrg #define TARGET_ASM_CAN_OUTPUT_MI_THUNK hook_bool_const_tree_hwi_hwi_const_tree_true
5660 1.1 mrg
5661 1.1 mrg #undef TARGET_PRINT_OPERAND
5662 1.1 mrg #define TARGET_PRINT_OPERAND riscv_print_operand
5663 1.1 mrg #undef TARGET_PRINT_OPERAND_ADDRESS
5664 1.1 mrg #define TARGET_PRINT_OPERAND_ADDRESS riscv_print_operand_address
5665 1.1 mrg
5666 1.1 mrg #undef TARGET_SETUP_INCOMING_VARARGS
5667 1.1 mrg #define TARGET_SETUP_INCOMING_VARARGS riscv_setup_incoming_varargs
5668 1.1 mrg #undef TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS
5669 1.1 mrg #define TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS riscv_allocate_stack_slots_for_args
5670 1.1 mrg #undef TARGET_STRICT_ARGUMENT_NAMING
5671 1.1 mrg #define TARGET_STRICT_ARGUMENT_NAMING hook_bool_CUMULATIVE_ARGS_true
5672 1.1 mrg #undef TARGET_MUST_PASS_IN_STACK
5673 1.1 mrg #define TARGET_MUST_PASS_IN_STACK must_pass_in_stack_var_size
5674 1.1 mrg #undef TARGET_PASS_BY_REFERENCE
5675 1.1 mrg #define TARGET_PASS_BY_REFERENCE riscv_pass_by_reference
5676 1.1 mrg #undef TARGET_ARG_PARTIAL_BYTES
5677 1.1 mrg #define TARGET_ARG_PARTIAL_BYTES riscv_arg_partial_bytes
5678 1.1 mrg #undef TARGET_FUNCTION_ARG
5679 1.1 mrg #define TARGET_FUNCTION_ARG riscv_function_arg
5680 1.1 mrg #undef TARGET_FUNCTION_ARG_ADVANCE
5681 1.1 mrg #define TARGET_FUNCTION_ARG_ADVANCE riscv_function_arg_advance
5682 1.1 mrg #undef TARGET_FUNCTION_ARG_BOUNDARY
5683 1.1 mrg #define TARGET_FUNCTION_ARG_BOUNDARY riscv_function_arg_boundary
5684 1.1 mrg
5685 1.1 mrg /* The generic ELF target does not always have TLS support. */
5686 1.1 mrg #ifdef HAVE_AS_TLS
5687 1.1 mrg #undef TARGET_HAVE_TLS
5688 1.1 mrg #define TARGET_HAVE_TLS true
5689 1.1 mrg #endif
5690 1.1 mrg
5691 1.1 mrg #undef TARGET_CANNOT_FORCE_CONST_MEM
5692 1.1 mrg #define TARGET_CANNOT_FORCE_CONST_MEM riscv_cannot_force_const_mem
5693 1.1 mrg
5694 1.1 mrg #undef TARGET_LEGITIMATE_CONSTANT_P
5695 1.1 mrg #define TARGET_LEGITIMATE_CONSTANT_P riscv_legitimate_constant_p
5696 1.1 mrg
5697 1.1 mrg #undef TARGET_USE_BLOCKS_FOR_CONSTANT_P
5698 1.1 mrg #define TARGET_USE_BLOCKS_FOR_CONSTANT_P hook_bool_mode_const_rtx_true
5699 1.1 mrg
5700 1.1 mrg #undef TARGET_LEGITIMATE_ADDRESS_P
5701 1.1 mrg #define TARGET_LEGITIMATE_ADDRESS_P riscv_legitimate_address_p
5702 1.1 mrg
5703 1.1 mrg #undef TARGET_CAN_ELIMINATE
5704 1.1 mrg #define TARGET_CAN_ELIMINATE riscv_can_eliminate
5705 1.1 mrg
5706 1.1 mrg #undef TARGET_CONDITIONAL_REGISTER_USAGE
5707 1.1 mrg #define TARGET_CONDITIONAL_REGISTER_USAGE riscv_conditional_register_usage
5708 1.1 mrg
5709 1.1 mrg #undef TARGET_CLASS_MAX_NREGS
5710 1.1 mrg #define TARGET_CLASS_MAX_NREGS riscv_class_max_nregs
5711 1.1 mrg
5712 1.1 mrg #undef TARGET_TRAMPOLINE_INIT
5713 1.1 mrg #define TARGET_TRAMPOLINE_INIT riscv_trampoline_init
5714 1.1 mrg
5715 1.1 mrg #undef TARGET_IN_SMALL_DATA_P
5716 1.1 mrg #define TARGET_IN_SMALL_DATA_P riscv_in_small_data_p
5717 1.1 mrg
5718 1.1 mrg #undef TARGET_HAVE_SRODATA_SECTION
5719 1.1 mrg #define TARGET_HAVE_SRODATA_SECTION true
5720 1.1 mrg
5721 1.1 mrg #undef TARGET_ASM_SELECT_SECTION
5722 1.1 mrg #define TARGET_ASM_SELECT_SECTION riscv_select_section
5723 1.1 mrg
5724 1.1 mrg #undef TARGET_ASM_UNIQUE_SECTION
5725 1.1 mrg #define TARGET_ASM_UNIQUE_SECTION riscv_unique_section
5726 1.1 mrg
5727 1.1 mrg #undef TARGET_ASM_SELECT_RTX_SECTION
5728 1.1 mrg #define TARGET_ASM_SELECT_RTX_SECTION riscv_elf_select_rtx_section
5729 1.1 mrg
5730 1.1 mrg #undef TARGET_MIN_ANCHOR_OFFSET
5731 1.1 mrg #define TARGET_MIN_ANCHOR_OFFSET (-IMM_REACH/2)
5732 1.1 mrg
5733 1.1 mrg #undef TARGET_MAX_ANCHOR_OFFSET
5734 1.1 mrg #define TARGET_MAX_ANCHOR_OFFSET (IMM_REACH/2-1)
5735 1.1 mrg
5736 1.1 mrg #undef TARGET_REGISTER_PRIORITY
5737 1.1 mrg #define TARGET_REGISTER_PRIORITY riscv_register_priority
5738 1.1 mrg
5739 1.1 mrg #undef TARGET_CANNOT_COPY_INSN_P
5740 1.1 mrg #define TARGET_CANNOT_COPY_INSN_P riscv_cannot_copy_insn_p
5741 1.1 mrg
5742 1.1 mrg #undef TARGET_ATOMIC_ASSIGN_EXPAND_FENV
5743 1.1 mrg #define TARGET_ATOMIC_ASSIGN_EXPAND_FENV riscv_atomic_assign_expand_fenv
5744 1.1 mrg
5745 1.1 mrg #undef TARGET_INIT_BUILTINS
5746 1.1 mrg #define TARGET_INIT_BUILTINS riscv_init_builtins
5747 1.1 mrg
5748 1.1 mrg #undef TARGET_BUILTIN_DECL
5749 1.1 mrg #define TARGET_BUILTIN_DECL riscv_builtin_decl
5750 1.1 mrg
5751 1.1 mrg #undef TARGET_EXPAND_BUILTIN
5752 1.1 mrg #define TARGET_EXPAND_BUILTIN riscv_expand_builtin
5753 1.1 mrg
5754 1.1 mrg #undef TARGET_HARD_REGNO_NREGS
5755 1.1 mrg #define TARGET_HARD_REGNO_NREGS riscv_hard_regno_nregs
5756 1.1 mrg #undef TARGET_HARD_REGNO_MODE_OK
5757 1.1 mrg #define TARGET_HARD_REGNO_MODE_OK riscv_hard_regno_mode_ok
5758 1.1 mrg
5759 1.1 mrg #undef TARGET_MODES_TIEABLE_P
5760 1.1 mrg #define TARGET_MODES_TIEABLE_P riscv_modes_tieable_p
5761 1.1 mrg
5762 1.1 mrg #undef TARGET_SLOW_UNALIGNED_ACCESS
5763 1.1 mrg #define TARGET_SLOW_UNALIGNED_ACCESS riscv_slow_unaligned_access
5764 1.1 mrg
5765 1.1 mrg #undef TARGET_SECONDARY_MEMORY_NEEDED
5766 1.1 mrg #define TARGET_SECONDARY_MEMORY_NEEDED riscv_secondary_memory_needed
5767 1.1 mrg
5768 1.1 mrg #undef TARGET_CAN_CHANGE_MODE_CLASS
5769 1.1 mrg #define TARGET_CAN_CHANGE_MODE_CLASS riscv_can_change_mode_class
5770 1.1 mrg
5771 1.1 mrg #undef TARGET_CONSTANT_ALIGNMENT
5772 1.1 mrg #define TARGET_CONSTANT_ALIGNMENT riscv_constant_alignment
5773 1.1 mrg
5774 1.1 mrg #undef TARGET_MERGE_DECL_ATTRIBUTES
5775 1.1 mrg #define TARGET_MERGE_DECL_ATTRIBUTES riscv_merge_decl_attributes
5776 1.1 mrg
5777 1.1 mrg #undef TARGET_ATTRIBUTE_TABLE
5778 1.1 mrg #define TARGET_ATTRIBUTE_TABLE riscv_attribute_table
5779 1.1 mrg
5780 1.1 mrg #undef TARGET_WARN_FUNC_RETURN
5781 1.1 mrg #define TARGET_WARN_FUNC_RETURN riscv_warn_func_return
5782 1.1 mrg
5783 1.1 mrg /* The low bit is ignored by jump instructions so is safe to use. */
5784 1.1 mrg #undef TARGET_CUSTOM_FUNCTION_DESCRIPTORS
5785 1.1 mrg #define TARGET_CUSTOM_FUNCTION_DESCRIPTORS 1
5786 1.1 mrg
5787 1.1 mrg #undef TARGET_MACHINE_DEPENDENT_REORG
5788 1.1 mrg #define TARGET_MACHINE_DEPENDENT_REORG riscv_reorg
5789 1.1 mrg
5790 1.1 mrg #undef TARGET_NEW_ADDRESS_PROFITABLE_P
5791 1.1 mrg #define TARGET_NEW_ADDRESS_PROFITABLE_P riscv_new_address_profitable_p
5792 1.1 mrg
5793 1.1 mrg #undef TARGET_ASAN_SHADOW_OFFSET
5794 1.1 mrg #define TARGET_ASAN_SHADOW_OFFSET riscv_asan_shadow_offset
5795 1.1 mrg
5796 1.1 mrg #ifdef TARGET_BIG_ENDIAN_DEFAULT
5797 1.1 mrg #undef TARGET_DEFAULT_TARGET_FLAGS
5798 1.1 mrg #define TARGET_DEFAULT_TARGET_FLAGS (MASK_BIG_ENDIAN)
5799 1.1 mrg #endif
5800 1.1 mrg
5801 struct gcc_target targetm = TARGET_INITIALIZER;
5802
5803 #include "gt-riscv.h"
5804