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