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