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