Home | History | Annotate | Line # | Download | only in Targets
      1      1.1  joerg //===--- RISCV.cpp - Implement RISCV target feature support ---------------===//
      2      1.1  joerg //
      3      1.1  joerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4      1.1  joerg // See https://llvm.org/LICENSE.txt for license information.
      5      1.1  joerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6      1.1  joerg //
      7      1.1  joerg //===----------------------------------------------------------------------===//
      8      1.1  joerg //
      9      1.1  joerg // This file implements RISCV TargetInfo objects.
     10      1.1  joerg //
     11      1.1  joerg //===----------------------------------------------------------------------===//
     12      1.1  joerg 
     13      1.1  joerg #include "RISCV.h"
     14      1.1  joerg #include "clang/Basic/MacroBuilder.h"
     15  1.1.1.2  joerg #include "clang/Basic/TargetBuiltins.h"
     16      1.1  joerg #include "llvm/ADT/StringSwitch.h"
     17  1.1.1.2  joerg #include "llvm/Support/TargetParser.h"
     18      1.1  joerg 
     19      1.1  joerg using namespace clang;
     20      1.1  joerg using namespace clang::targets;
     21      1.1  joerg 
     22      1.1  joerg ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const {
     23      1.1  joerg   static const char *const GCCRegNames[] = {
     24      1.1  joerg       // Integer registers
     25      1.1  joerg       "x0",  "x1",  "x2",  "x3",  "x4",  "x5",  "x6",  "x7",
     26      1.1  joerg       "x8",  "x9",  "x10", "x11", "x12", "x13", "x14", "x15",
     27      1.1  joerg       "x16", "x17", "x18", "x19", "x20", "x21", "x22", "x23",
     28      1.1  joerg       "x24", "x25", "x26", "x27", "x28", "x29", "x30", "x31",
     29      1.1  joerg 
     30      1.1  joerg       // Floating point registers
     31      1.1  joerg       "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",
     32      1.1  joerg       "f8",  "f9",  "f10", "f11", "f12", "f13", "f14", "f15",
     33      1.1  joerg       "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
     34  1.1.1.2  joerg       "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
     35  1.1.1.2  joerg 
     36  1.1.1.2  joerg       // Vector registers
     37  1.1.1.2  joerg       "v0",  "v1",  "v2",  "v3",  "v4",  "v5",  "v6",  "v7",
     38  1.1.1.2  joerg       "v8",  "v9",  "v10", "v11", "v12", "v13", "v14", "v15",
     39  1.1.1.2  joerg       "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
     40  1.1.1.2  joerg       "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"};
     41      1.1  joerg   return llvm::makeArrayRef(GCCRegNames);
     42      1.1  joerg }
     43      1.1  joerg 
     44      1.1  joerg ArrayRef<TargetInfo::GCCRegAlias> RISCVTargetInfo::getGCCRegAliases() const {
     45      1.1  joerg   static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
     46      1.1  joerg       {{"zero"}, "x0"}, {{"ra"}, "x1"},   {{"sp"}, "x2"},    {{"gp"}, "x3"},
     47      1.1  joerg       {{"tp"}, "x4"},   {{"t0"}, "x5"},   {{"t1"}, "x6"},    {{"t2"}, "x7"},
     48      1.1  joerg       {{"s0"}, "x8"},   {{"s1"}, "x9"},   {{"a0"}, "x10"},   {{"a1"}, "x11"},
     49      1.1  joerg       {{"a2"}, "x12"},  {{"a3"}, "x13"},  {{"a4"}, "x14"},   {{"a5"}, "x15"},
     50      1.1  joerg       {{"a6"}, "x16"},  {{"a7"}, "x17"},  {{"s2"}, "x18"},   {{"s3"}, "x19"},
     51      1.1  joerg       {{"s4"}, "x20"},  {{"s5"}, "x21"},  {{"s6"}, "x22"},   {{"s7"}, "x23"},
     52      1.1  joerg       {{"s8"}, "x24"},  {{"s9"}, "x25"},  {{"s10"}, "x26"},  {{"s11"}, "x27"},
     53      1.1  joerg       {{"t3"}, "x28"},  {{"t4"}, "x29"},  {{"t5"}, "x30"},   {{"t6"}, "x31"},
     54      1.1  joerg       {{"ft0"}, "f0"},  {{"ft1"}, "f1"},  {{"ft2"}, "f2"},   {{"ft3"}, "f3"},
     55      1.1  joerg       {{"ft4"}, "f4"},  {{"ft5"}, "f5"},  {{"ft6"}, "f6"},   {{"ft7"}, "f7"},
     56      1.1  joerg       {{"fs0"}, "f8"},  {{"fs1"}, "f9"},  {{"fa0"}, "f10"},  {{"fa1"}, "f11"},
     57      1.1  joerg       {{"fa2"}, "f12"}, {{"fa3"}, "f13"}, {{"fa4"}, "f14"},  {{"fa5"}, "f15"},
     58      1.1  joerg       {{"fa6"}, "f16"}, {{"fa7"}, "f17"}, {{"fs2"}, "f18"},  {{"fs3"}, "f19"},
     59      1.1  joerg       {{"fs4"}, "f20"}, {{"fs5"}, "f21"}, {{"fs6"}, "f22"},  {{"fs7"}, "f23"},
     60      1.1  joerg       {{"fs8"}, "f24"}, {{"fs9"}, "f25"}, {{"fs10"}, "f26"}, {{"fs11"}, "f27"},
     61      1.1  joerg       {{"ft8"}, "f28"}, {{"ft9"}, "f29"}, {{"ft10"}, "f30"}, {{"ft11"}, "f31"}};
     62      1.1  joerg   return llvm::makeArrayRef(GCCRegAliases);
     63      1.1  joerg }
     64      1.1  joerg 
     65      1.1  joerg bool RISCVTargetInfo::validateAsmConstraint(
     66      1.1  joerg     const char *&Name, TargetInfo::ConstraintInfo &Info) const {
     67      1.1  joerg   switch (*Name) {
     68      1.1  joerg   default:
     69      1.1  joerg     return false;
     70      1.1  joerg   case 'I':
     71      1.1  joerg     // A 12-bit signed immediate.
     72      1.1  joerg     Info.setRequiresImmediate(-2048, 2047);
     73      1.1  joerg     return true;
     74      1.1  joerg   case 'J':
     75      1.1  joerg     // Integer zero.
     76      1.1  joerg     Info.setRequiresImmediate(0);
     77      1.1  joerg     return true;
     78      1.1  joerg   case 'K':
     79      1.1  joerg     // A 5-bit unsigned immediate for CSR access instructions.
     80      1.1  joerg     Info.setRequiresImmediate(0, 31);
     81      1.1  joerg     return true;
     82      1.1  joerg   case 'f':
     83      1.1  joerg     // A floating-point register.
     84      1.1  joerg     Info.setAllowsRegister();
     85      1.1  joerg     return true;
     86      1.1  joerg   case 'A':
     87      1.1  joerg     // An address that is held in a general-purpose register.
     88      1.1  joerg     Info.setAllowsMemory();
     89      1.1  joerg     return true;
     90  1.1.1.2  joerg   case 'v':
     91  1.1.1.2  joerg     // A vector register.
     92  1.1.1.2  joerg     if (Name[1] == 'r' || Name[1] == 'm') {
     93  1.1.1.2  joerg       Info.setAllowsRegister();
     94  1.1.1.2  joerg       Name += 1;
     95  1.1.1.2  joerg       return true;
     96  1.1.1.2  joerg     }
     97  1.1.1.2  joerg     return false;
     98      1.1  joerg   }
     99      1.1  joerg }
    100      1.1  joerg 
    101  1.1.1.2  joerg std::string RISCVTargetInfo::convertConstraint(const char *&Constraint) const {
    102  1.1.1.2  joerg   std::string R;
    103  1.1.1.2  joerg   switch (*Constraint) {
    104  1.1.1.2  joerg   case 'v':
    105  1.1.1.2  joerg     R = std::string("v");
    106  1.1.1.2  joerg     Constraint += 1;
    107  1.1.1.2  joerg     break;
    108  1.1.1.2  joerg   default:
    109  1.1.1.2  joerg     R = TargetInfo::convertConstraint(Constraint);
    110  1.1.1.2  joerg     break;
    111  1.1.1.2  joerg   }
    112  1.1.1.2  joerg   return R;
    113  1.1.1.2  joerg }
    114  1.1.1.2  joerg 
    115      1.1  joerg void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
    116      1.1  joerg                                        MacroBuilder &Builder) const {
    117      1.1  joerg   Builder.defineMacro("__ELF__");
    118      1.1  joerg   Builder.defineMacro("__riscv");
    119      1.1  joerg   bool Is64Bit = getTriple().getArch() == llvm::Triple::riscv64;
    120      1.1  joerg   Builder.defineMacro("__riscv_xlen", Is64Bit ? "64" : "32");
    121      1.1  joerg   StringRef CodeModel = getTargetOpts().CodeModel;
    122      1.1  joerg   if (CodeModel == "default")
    123      1.1  joerg     CodeModel = "small";
    124      1.1  joerg 
    125      1.1  joerg   if (CodeModel == "small")
    126      1.1  joerg     Builder.defineMacro("__riscv_cmodel_medlow");
    127      1.1  joerg   else if (CodeModel == "medium")
    128      1.1  joerg     Builder.defineMacro("__riscv_cmodel_medany");
    129      1.1  joerg 
    130      1.1  joerg   StringRef ABIName = getABI();
    131      1.1  joerg   if (ABIName == "ilp32f" || ABIName == "lp64f")
    132      1.1  joerg     Builder.defineMacro("__riscv_float_abi_single");
    133      1.1  joerg   else if (ABIName == "ilp32d" || ABIName == "lp64d")
    134      1.1  joerg     Builder.defineMacro("__riscv_float_abi_double");
    135      1.1  joerg   else
    136      1.1  joerg     Builder.defineMacro("__riscv_float_abi_soft");
    137      1.1  joerg 
    138      1.1  joerg   if (ABIName == "ilp32e")
    139      1.1  joerg     Builder.defineMacro("__riscv_abi_rve");
    140      1.1  joerg 
    141  1.1.1.2  joerg   Builder.defineMacro("__riscv_arch_test");
    142  1.1.1.2  joerg   Builder.defineMacro("__riscv_i", "2000000");
    143  1.1.1.2  joerg 
    144      1.1  joerg   if (HasM) {
    145  1.1.1.2  joerg     Builder.defineMacro("__riscv_m", "2000000");
    146      1.1  joerg     Builder.defineMacro("__riscv_mul");
    147      1.1  joerg     Builder.defineMacro("__riscv_div");
    148      1.1  joerg     Builder.defineMacro("__riscv_muldiv");
    149      1.1  joerg   }
    150      1.1  joerg 
    151  1.1.1.2  joerg   if (HasA) {
    152  1.1.1.2  joerg     Builder.defineMacro("__riscv_a", "2000000");
    153      1.1  joerg     Builder.defineMacro("__riscv_atomic");
    154  1.1.1.2  joerg     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
    155  1.1.1.2  joerg     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
    156  1.1.1.2  joerg     Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
    157  1.1.1.2  joerg     if (Is64Bit)
    158  1.1.1.2  joerg       Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
    159  1.1.1.2  joerg   }
    160      1.1  joerg 
    161      1.1  joerg   if (HasF || HasD) {
    162  1.1.1.2  joerg     Builder.defineMacro("__riscv_f", "2000000");
    163      1.1  joerg     Builder.defineMacro("__riscv_flen", HasD ? "64" : "32");
    164      1.1  joerg     Builder.defineMacro("__riscv_fdiv");
    165      1.1  joerg     Builder.defineMacro("__riscv_fsqrt");
    166      1.1  joerg   }
    167      1.1  joerg 
    168  1.1.1.2  joerg   if (HasD)
    169  1.1.1.2  joerg     Builder.defineMacro("__riscv_d", "2000000");
    170  1.1.1.2  joerg 
    171  1.1.1.2  joerg   if (HasC) {
    172  1.1.1.2  joerg     Builder.defineMacro("__riscv_c", "2000000");
    173      1.1  joerg     Builder.defineMacro("__riscv_compressed");
    174  1.1.1.2  joerg   }
    175  1.1.1.2  joerg 
    176  1.1.1.2  joerg   if (HasB) {
    177  1.1.1.2  joerg     Builder.defineMacro("__riscv_b", "93000");
    178  1.1.1.2  joerg     Builder.defineMacro("__riscv_bitmanip");
    179  1.1.1.2  joerg   }
    180  1.1.1.2  joerg 
    181  1.1.1.2  joerg   if (HasV) {
    182  1.1.1.2  joerg     Builder.defineMacro("__riscv_v", "10000");
    183  1.1.1.2  joerg     Builder.defineMacro("__riscv_vector");
    184  1.1.1.2  joerg   }
    185  1.1.1.2  joerg 
    186  1.1.1.2  joerg   if (HasZba)
    187  1.1.1.2  joerg     Builder.defineMacro("__riscv_zba", "93000");
    188  1.1.1.2  joerg 
    189  1.1.1.2  joerg   if (HasZbb)
    190  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbb", "93000");
    191  1.1.1.2  joerg 
    192  1.1.1.2  joerg   if (HasZbc)
    193  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbc", "93000");
    194  1.1.1.2  joerg 
    195  1.1.1.2  joerg   if (HasZbe)
    196  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbe", "93000");
    197  1.1.1.2  joerg 
    198  1.1.1.2  joerg   if (HasZbf)
    199  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbf", "93000");
    200  1.1.1.2  joerg 
    201  1.1.1.2  joerg   if (HasZbm)
    202  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbm", "93000");
    203  1.1.1.2  joerg 
    204  1.1.1.2  joerg   if (HasZbp)
    205  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbp", "93000");
    206  1.1.1.2  joerg 
    207  1.1.1.2  joerg   if (HasZbproposedc)
    208  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbproposedc", "93000");
    209  1.1.1.2  joerg 
    210  1.1.1.2  joerg   if (HasZbr)
    211  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbr", "93000");
    212  1.1.1.2  joerg 
    213  1.1.1.2  joerg   if (HasZbs)
    214  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbs", "93000");
    215  1.1.1.2  joerg 
    216  1.1.1.2  joerg   if (HasZbt)
    217  1.1.1.2  joerg     Builder.defineMacro("__riscv_zbt", "93000");
    218  1.1.1.2  joerg 
    219  1.1.1.2  joerg   if (HasZfh)
    220  1.1.1.2  joerg     Builder.defineMacro("__riscv_zfh", "1000");
    221  1.1.1.2  joerg 
    222  1.1.1.2  joerg   if (HasZvamo)
    223  1.1.1.2  joerg     Builder.defineMacro("__riscv_zvamo", "10000");
    224  1.1.1.2  joerg 
    225  1.1.1.2  joerg   if (HasZvlsseg)
    226  1.1.1.2  joerg     Builder.defineMacro("__riscv_zvlsseg", "10000");
    227  1.1.1.2  joerg }
    228  1.1.1.2  joerg 
    229  1.1.1.2  joerg const Builtin::Info RISCVTargetInfo::BuiltinInfo[] = {
    230  1.1.1.2  joerg #define BUILTIN(ID, TYPE, ATTRS)                                               \
    231  1.1.1.2  joerg   {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
    232  1.1.1.2  joerg #define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE)                               \
    233  1.1.1.2  joerg     {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
    234  1.1.1.2  joerg #include "clang/Basic/BuiltinsRISCV.def"
    235  1.1.1.2  joerg };
    236  1.1.1.2  joerg 
    237  1.1.1.2  joerg ArrayRef<Builtin::Info> RISCVTargetInfo::getTargetBuiltins() const {
    238  1.1.1.2  joerg   return llvm::makeArrayRef(BuiltinInfo, clang::RISCV::LastTSBuiltin -
    239  1.1.1.2  joerg                                              Builtin::FirstTSBuiltin);
    240  1.1.1.2  joerg }
    241  1.1.1.2  joerg 
    242  1.1.1.2  joerg bool RISCVTargetInfo::initFeatureMap(
    243  1.1.1.2  joerg     llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
    244  1.1.1.2  joerg     const std::vector<std::string> &FeaturesVec) const {
    245  1.1.1.2  joerg 
    246  1.1.1.2  joerg   if (getTriple().getArch() == llvm::Triple::riscv64)
    247  1.1.1.2  joerg     Features["64bit"] = true;
    248  1.1.1.2  joerg 
    249  1.1.1.2  joerg   return TargetInfo::initFeatureMap(Features, Diags, CPU, FeaturesVec);
    250      1.1  joerg }
    251      1.1  joerg 
    252      1.1  joerg /// Return true if has this feature, need to sync with handleTargetFeatures.
    253      1.1  joerg bool RISCVTargetInfo::hasFeature(StringRef Feature) const {
    254      1.1  joerg   bool Is64Bit = getTriple().getArch() == llvm::Triple::riscv64;
    255      1.1  joerg   return llvm::StringSwitch<bool>(Feature)
    256      1.1  joerg       .Case("riscv", true)
    257      1.1  joerg       .Case("riscv32", !Is64Bit)
    258      1.1  joerg       .Case("riscv64", Is64Bit)
    259  1.1.1.2  joerg       .Case("64bit", Is64Bit)
    260      1.1  joerg       .Case("m", HasM)
    261      1.1  joerg       .Case("a", HasA)
    262      1.1  joerg       .Case("f", HasF)
    263      1.1  joerg       .Case("d", HasD)
    264      1.1  joerg       .Case("c", HasC)
    265  1.1.1.2  joerg       .Case("experimental-b", HasB)
    266  1.1.1.2  joerg       .Case("experimental-v", HasV)
    267  1.1.1.2  joerg       .Case("experimental-zba", HasZba)
    268  1.1.1.2  joerg       .Case("experimental-zbb", HasZbb)
    269  1.1.1.2  joerg       .Case("experimental-zbc", HasZbc)
    270  1.1.1.2  joerg       .Case("experimental-zbe", HasZbe)
    271  1.1.1.2  joerg       .Case("experimental-zbf", HasZbf)
    272  1.1.1.2  joerg       .Case("experimental-zbm", HasZbm)
    273  1.1.1.2  joerg       .Case("experimental-zbp", HasZbp)
    274  1.1.1.2  joerg       .Case("experimental-zbproposedc", HasZbproposedc)
    275  1.1.1.2  joerg       .Case("experimental-zbr", HasZbr)
    276  1.1.1.2  joerg       .Case("experimental-zbs", HasZbs)
    277  1.1.1.2  joerg       .Case("experimental-zbt", HasZbt)
    278  1.1.1.2  joerg       .Case("experimental-zfh", HasZfh)
    279  1.1.1.2  joerg       .Case("experimental-zvamo", HasZvamo)
    280  1.1.1.2  joerg       .Case("experimental-zvlsseg", HasZvlsseg)
    281      1.1  joerg       .Default(false);
    282      1.1  joerg }
    283      1.1  joerg 
    284      1.1  joerg /// Perform initialization based on the user configured set of features.
    285      1.1  joerg bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
    286      1.1  joerg                                            DiagnosticsEngine &Diags) {
    287      1.1  joerg   for (const auto &Feature : Features) {
    288      1.1  joerg     if (Feature == "+m")
    289      1.1  joerg       HasM = true;
    290      1.1  joerg     else if (Feature == "+a")
    291      1.1  joerg       HasA = true;
    292      1.1  joerg     else if (Feature == "+f")
    293      1.1  joerg       HasF = true;
    294      1.1  joerg     else if (Feature == "+d")
    295      1.1  joerg       HasD = true;
    296      1.1  joerg     else if (Feature == "+c")
    297      1.1  joerg       HasC = true;
    298  1.1.1.2  joerg     else if (Feature == "+experimental-b")
    299  1.1.1.2  joerg       HasB = true;
    300  1.1.1.2  joerg     else if (Feature == "+experimental-v")
    301  1.1.1.2  joerg       HasV = true;
    302  1.1.1.2  joerg     else if (Feature == "+experimental-zba")
    303  1.1.1.2  joerg       HasZba = true;
    304  1.1.1.2  joerg     else if (Feature == "+experimental-zbb")
    305  1.1.1.2  joerg       HasZbb = true;
    306  1.1.1.2  joerg     else if (Feature == "+experimental-zbc")
    307  1.1.1.2  joerg       HasZbc = true;
    308  1.1.1.2  joerg     else if (Feature == "+experimental-zbe")
    309  1.1.1.2  joerg       HasZbe = true;
    310  1.1.1.2  joerg     else if (Feature == "+experimental-zbf")
    311  1.1.1.2  joerg       HasZbf = true;
    312  1.1.1.2  joerg     else if (Feature == "+experimental-zbm")
    313  1.1.1.2  joerg       HasZbm = true;
    314  1.1.1.2  joerg     else if (Feature == "+experimental-zbp")
    315  1.1.1.2  joerg       HasZbp = true;
    316  1.1.1.2  joerg     else if (Feature == "+experimental-zbproposedc")
    317  1.1.1.2  joerg       HasZbproposedc = true;
    318  1.1.1.2  joerg     else if (Feature == "+experimental-zbr")
    319  1.1.1.2  joerg       HasZbr = true;
    320  1.1.1.2  joerg     else if (Feature == "+experimental-zbs")
    321  1.1.1.2  joerg       HasZbs = true;
    322  1.1.1.2  joerg     else if (Feature == "+experimental-zbt")
    323  1.1.1.2  joerg       HasZbt = true;
    324  1.1.1.2  joerg     else if (Feature == "+experimental-zfh")
    325  1.1.1.2  joerg       HasZfh = true;
    326  1.1.1.2  joerg     else if (Feature == "+experimental-zvamo")
    327  1.1.1.2  joerg       HasZvamo = true;
    328  1.1.1.2  joerg     else if (Feature == "+experimental-zvlsseg")
    329  1.1.1.2  joerg       HasZvlsseg = true;
    330      1.1  joerg   }
    331      1.1  joerg 
    332      1.1  joerg   return true;
    333      1.1  joerg }
    334  1.1.1.2  joerg 
    335  1.1.1.2  joerg bool RISCV32TargetInfo::isValidCPUName(StringRef Name) const {
    336  1.1.1.2  joerg   return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name),
    337  1.1.1.2  joerg                                    /*Is64Bit=*/false);
    338  1.1.1.2  joerg }
    339  1.1.1.2  joerg 
    340  1.1.1.2  joerg void RISCV32TargetInfo::fillValidCPUList(
    341  1.1.1.2  joerg     SmallVectorImpl<StringRef> &Values) const {
    342  1.1.1.2  joerg   llvm::RISCV::fillValidCPUArchList(Values, false);
    343  1.1.1.2  joerg }
    344  1.1.1.2  joerg 
    345  1.1.1.2  joerg bool RISCV32TargetInfo::isValidTuneCPUName(StringRef Name) const {
    346  1.1.1.2  joerg   return llvm::RISCV::checkTuneCPUKind(
    347  1.1.1.2  joerg       llvm::RISCV::parseTuneCPUKind(Name, false),
    348  1.1.1.2  joerg       /*Is64Bit=*/false);
    349  1.1.1.2  joerg }
    350  1.1.1.2  joerg 
    351  1.1.1.2  joerg void RISCV32TargetInfo::fillValidTuneCPUList(
    352  1.1.1.2  joerg     SmallVectorImpl<StringRef> &Values) const {
    353  1.1.1.2  joerg   llvm::RISCV::fillValidTuneCPUArchList(Values, false);
    354  1.1.1.2  joerg }
    355  1.1.1.2  joerg 
    356  1.1.1.2  joerg bool RISCV64TargetInfo::isValidCPUName(StringRef Name) const {
    357  1.1.1.2  joerg   return llvm::RISCV::checkCPUKind(llvm::RISCV::parseCPUKind(Name),
    358  1.1.1.2  joerg                                    /*Is64Bit=*/true);
    359  1.1.1.2  joerg }
    360  1.1.1.2  joerg 
    361  1.1.1.2  joerg void RISCV64TargetInfo::fillValidCPUList(
    362  1.1.1.2  joerg     SmallVectorImpl<StringRef> &Values) const {
    363  1.1.1.2  joerg   llvm::RISCV::fillValidCPUArchList(Values, true);
    364  1.1.1.2  joerg }
    365  1.1.1.2  joerg 
    366  1.1.1.2  joerg bool RISCV64TargetInfo::isValidTuneCPUName(StringRef Name) const {
    367  1.1.1.2  joerg   return llvm::RISCV::checkTuneCPUKind(
    368  1.1.1.2  joerg       llvm::RISCV::parseTuneCPUKind(Name, true),
    369  1.1.1.2  joerg       /*Is64Bit=*/true);
    370  1.1.1.2  joerg }
    371  1.1.1.2  joerg 
    372  1.1.1.2  joerg void RISCV64TargetInfo::fillValidTuneCPUList(
    373  1.1.1.2  joerg     SmallVectorImpl<StringRef> &Values) const {
    374  1.1.1.2  joerg   llvm::RISCV::fillValidTuneCPUArchList(Values, true);
    375  1.1.1.2  joerg }
    376