| //==-- LoongArch64TargetParser - Parser for LoongArch64 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" | |
| 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" | |
| }; | |
| LoongArch::ArchKind LoongArch::parseArch(StringRef Arch) { | |
| for (const auto A : AllArchs) | |
| if (A.Name == Arch) | |
| return A.Kind; | |
| return LoongArch::ArchKind::AK_INVALID; | |
| } | |
| 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 && F.Kind != FK_INVALID) | |
| Features.push_back(F.Name); | |
| return true; | |
| } | |
| } | |
| return false; | |
| } |