| //===-- LoongArchTargetParser - Parser for LoongArch features --*- C++ -*-====// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file implements a target parser to recognise LoongArch hardware features | |
| // such as CPU/ARCH and extension names. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/TargetParser/LoongArchTargetParser.h" | |
| #include "llvm/ADT/SmallVector.h" | |
| using namespace llvm; | |
| using namespace llvm::LoongArch; | |
| const FeatureInfo AllFeatures[] = { | |
| #define LOONGARCH_FEATURE(NAME, KIND) {NAME, KIND}, | |
| #include "llvm/TargetParser/LoongArchTargetParser.def" | |
| }; | |
| const ArchInfo AllArchs[] = { | |
| #define LOONGARCH_ARCH(NAME, KIND, FEATURES) \ | |
| {NAME, LoongArch::ArchKind::KIND, FEATURES}, | |
| #include "llvm/TargetParser/LoongArchTargetParser.def" | |
| }; | |
| bool LoongArch::isValidArchName(StringRef Arch) { | |
| for (const auto A : AllArchs) | |
| if (A.Name == Arch) | |
| return true; | |
| return false; | |
| } | |
| bool LoongArch::isValidFeatureName(StringRef Feature) { | |
| if (Feature.starts_with("+") || Feature.starts_with("-")) | |
| return false; | |
| for (const auto &F : AllFeatures) { | |
| StringRef CanonicalName = | |
| F.Name.starts_with("+") ? F.Name.drop_front() : F.Name; | |
| if (CanonicalName == Feature) | |
| return true; | |
| } | |
| return false; | |
| } | |
| bool LoongArch::getArchFeatures(StringRef Arch, | |
| std::vector<StringRef> &Features) { | |
| for (const auto A : AllArchs) { | |
| if (A.Name == Arch) { | |
| for (const auto F : AllFeatures) | |
| if ((A.Features & F.Kind) == F.Kind) | |
| Features.push_back(F.Name); | |
| return true; | |
| } | |
| } | |
| if (Arch == "la64v1.0" || Arch == "la64v1.1") { | |
| Features.push_back("+64bit"); | |
| Features.push_back("+d"); | |
| Features.push_back("+lsx"); | |
| Features.push_back("+ual"); | |
| if (Arch == "la64v1.1") { | |
| Features.push_back("+frecipe"); | |
| Features.push_back("+lam-bh"); | |
| Features.push_back("+lamcas"); | |
| Features.push_back("+ld-seq-sa"); | |
| Features.push_back("+div32"); | |
| Features.push_back("+scq"); | |
| } | |
| return true; | |
| } | |
| if (Arch == "la32v1.0" || Arch == "la32rv1.0") { | |
| Features.push_back("+32bit"); | |
| if (Arch == "la32v1.0") | |
| Features.push_back("+32s"); | |
| return true; | |
| } | |
| return false; | |
| } | |
| bool LoongArch::isValidCPUName(StringRef Name) { return isValidArchName(Name); } | |
| void LoongArch::fillValidCPUList(SmallVectorImpl<StringRef> &Values) { | |
| for (const auto A : AllArchs) | |
| Values.emplace_back(A.Name); | |
| } | |
| StringRef LoongArch::getDefaultArch(bool Is64Bit) { | |
| return Is64Bit ? "loongarch64" : "loongarch32"; | |
| } |