Home | History | Annotate | Line # | Download | only in riscv
      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