Home | History | Annotate | Line # | Download | only in riscv
      1 /* Definition of RISC-V target for GNU compiler.
      2    Copyright (C) 2016-2024 Free Software Foundation, Inc.
      3    Contributed by Andrew Waterman (andrew (at) sifive.com).
      4 
      5 This file is part of GCC.
      6 
      7 GCC is free software; you can redistribute it and/or modify
      8 it under the terms of the GNU General Public License as published by
      9 the Free Software Foundation; either version 3, or (at your option)
     10 any later version.
     11 
     12 GCC is distributed in the hope that it will be useful,
     13 but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15 GNU General Public License for more details.
     16 
     17 You should have received a copy of the GNU General Public License
     18 along with GCC; see the file COPYING3.  If not see
     19 <http://www.gnu.org/licenses/>.  */
     20 
     21 #ifndef GCC_RISCV_OPTS_H
     22 #define GCC_RISCV_OPTS_H
     23 
     24 enum riscv_abi_type {
     25   ABI_ILP32,
     26   ABI_ILP32E,
     27   ABI_ILP32F,
     28   ABI_ILP32D,
     29   ABI_LP64,
     30   ABI_LP64E,
     31   ABI_LP64F,
     32   ABI_LP64D
     33 };
     34 extern enum riscv_abi_type riscv_abi;
     35 
     36 enum riscv_code_model {
     37   CM_MEDLOW,
     38   CM_MEDANY,
     39   CM_LARGE,
     40   CM_PIC
     41 };
     42 extern enum riscv_code_model riscv_cmodel;
     43 
     44 enum riscv_isa_spec_class {
     45   ISA_SPEC_CLASS_NONE,
     46 
     47   ISA_SPEC_CLASS_2P2,
     48   ISA_SPEC_CLASS_20190608,
     49   ISA_SPEC_CLASS_20191213
     50 };
     51 
     52 extern enum riscv_isa_spec_class riscv_isa_spec;
     53 
     54 /* Keep this list in sync with define_attr "tune" in riscv.md.  */
     55 enum riscv_microarchitecture_type {
     56   generic,
     57   sifive_7,
     58   sifive_p400,
     59   sifive_p600,
     60   xiangshan,
     61   generic_ooo
     62 };
     63 extern enum riscv_microarchitecture_type riscv_microarchitecture;
     64 
     65 enum riscv_align_data {
     66   riscv_align_data_type_xlen,
     67   riscv_align_data_type_natural
     68 };
     69 
     70 /* Where to get the canary for the stack protector.  */
     71 enum stack_protector_guard {
     72   SSP_TLS,			/* per-thread canary in TLS block */
     73   SSP_GLOBAL			/* global canary */
     74 };
     75 
     76 /* RISC-V auto-vectorization RVV LMUL.  */
     77 enum rvv_max_lmul_enum {
     78   RVV_M1 = 1,
     79   RVV_M2 = 2,
     80   RVV_M4 = 4,
     81   RVV_M8 = 8,
     82   /* For dynamic LMUL, we compare COST start with LMUL8.  */
     83   RVV_DYNAMIC = 9
     84 };
     85 
     86 enum riscv_multilib_select_kind {
     87   /* Select multilib by builtin way.  */
     88   select_by_builtin,
     89   /* Select multilib by ABI, arch and code model.  */
     90   select_by_abi_arch_cmodel,
     91   /* Select multilib by ABI only.  */
     92   select_by_abi,
     93 };
     94 
     95 /* ENTITIES in mode switching.  */
     96 enum riscv_entity
     97 {
     98   RISCV_VXRM = 0,
     99   RISCV_FRM,
    100   MAX_RISCV_ENTITIES
    101 };
    102 
    103 /* RISC-V stringop strategy. */
    104 enum stringop_strategy_enum {
    105   /* No expansion. */
    106   STRATEGY_LIBCALL = 1,
    107   /* Use scalar expansion if possible. */
    108   STRATEGY_SCALAR = 2,
    109   /* Only vector expansion if possible. */
    110   STRATEGY_VECTOR = 4,
    111   /* Use any. */
    112   STRATEGY_AUTO = STRATEGY_SCALAR | STRATEGY_VECTOR
    113 };
    114 
    115 /* Behavior of VSETVL Pass.  */
    116 enum vsetvl_strategy_enum {
    117   /* Optimized: Run LCM dataflow analysis to reduce vsetvl* insns and
    118      delete any redundant ones generated in the process.  */
    119   VSETVL_OPT,
    120   /* Simple: Insert a vsetvl* instruction for each Vector instruction.  */
    121   VSETVL_SIMPLE,
    122   /* No fusion: Disable Phase 2 earliest global fusion.  */
    123   VSETVL_OPT_NO_FUSION,
    124 };
    125 
    126 /* RVV vector bits for option -mrvv-vector-bits, default is scalable.  */
    127 enum rvv_vector_bits_enum {
    128   /* scalable indicates taking the value of zvl*b as the minimal vlen.  */
    129   RVV_VECTOR_BITS_SCALABLE,
    130   /* zvl indicates taking the value of zvl*b as the exactly vlen.  */
    131   RVV_VECTOR_BITS_ZVL,
    132 };
    133 
    134 #define TARGET_ZICOND_LIKE (TARGET_ZICOND || (TARGET_XVENTANACONDOPS && TARGET_64BIT))
    135 
    136 /* Bit of riscv_zvl_flags will set contintuly, N-1 bit will set if N-bit is
    137    set, e.g. MASK_ZVL64B has set then MASK_ZVL32B is set, so we can use
    138    popcount to caclulate the minimal VLEN.  */
    139 #define TARGET_MIN_VLEN \
    140   ((riscv_zvl_flags == 0) \
    141    ? 0 \
    142    : 32 << (__builtin_popcount (riscv_zvl_flags) - 1))
    143 
    144 /* Same as TARGET_MIN_VLEN, but take an OPTS as gcc_options.  */
    145 #define TARGET_MIN_VLEN_OPTS(opts)                                             \
    146   ((opts->x_riscv_zvl_flags == 0)                                              \
    147      ? 0                                                                       \
    148      : 32 << (__builtin_popcount (opts->x_riscv_zvl_flags) - 1))
    149 
    150 /* TODO: Enable RVV movmisalign by default for now.  */
    151 #define TARGET_VECTOR_MISALIGN_SUPPORTED 1
    152 
    153 /* The maximmum LMUL according to user configuration.  */
    154 #define TARGET_MAX_LMUL                                                        \
    155   (int) (rvv_max_lmul == RVV_DYNAMIC ? RVV_M8 : rvv_max_lmul)
    156 
    157 /* TLS types.  */
    158 enum riscv_tls_type {
    159   TLS_TRADITIONAL,
    160   TLS_DESCRIPTORS
    161 };
    162 
    163 #endif /* ! GCC_RISCV_OPTS_H */
    164