1fe013be4SDimitry Andric //===-- LoongArchTargetParser - Parser for LoongArch features --*- C++ -*-====//
2bdd1243dSDimitry Andric //
3bdd1243dSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bdd1243dSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5bdd1243dSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bdd1243dSDimitry Andric //
7bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
8bdd1243dSDimitry Andric //
9bdd1243dSDimitry Andric // This file implements a target parser to recognise LoongArch hardware features
10bdd1243dSDimitry Andric // such as CPU/ARCH and extension names.
11bdd1243dSDimitry Andric //
12bdd1243dSDimitry Andric //===----------------------------------------------------------------------===//
13bdd1243dSDimitry Andric
14bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.h"
15bdd1243dSDimitry Andric
16bdd1243dSDimitry Andric using namespace llvm;
17bdd1243dSDimitry Andric using namespace llvm::LoongArch;
18bdd1243dSDimitry Andric
19bdd1243dSDimitry Andric const FeatureInfo AllFeatures[] = {
20bdd1243dSDimitry Andric #define LOONGARCH_FEATURE(NAME, KIND) {NAME, KIND},
21bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.def"
22bdd1243dSDimitry Andric };
23bdd1243dSDimitry Andric
24bdd1243dSDimitry Andric const ArchInfo AllArchs[] = {
25bdd1243dSDimitry Andric #define LOONGARCH_ARCH(NAME, KIND, FEATURES) \
26bdd1243dSDimitry Andric {NAME, LoongArch::ArchKind::KIND, FEATURES},
27bdd1243dSDimitry Andric #include "llvm/TargetParser/LoongArchTargetParser.def"
28bdd1243dSDimitry Andric };
29bdd1243dSDimitry Andric
isValidArchName(StringRef Arch)30fe013be4SDimitry Andric bool LoongArch::isValidArchName(StringRef Arch) {
31bdd1243dSDimitry Andric for (const auto A : AllArchs)
32bdd1243dSDimitry Andric if (A.Name == Arch)
33fe013be4SDimitry Andric return true;
34fe013be4SDimitry Andric return false;
35bdd1243dSDimitry Andric }
36bdd1243dSDimitry Andric
getArchFeatures(StringRef Arch,std::vector<StringRef> & Features)37bdd1243dSDimitry Andric bool LoongArch::getArchFeatures(StringRef Arch,
38bdd1243dSDimitry Andric std::vector<StringRef> &Features) {
39bdd1243dSDimitry Andric for (const auto A : AllArchs) {
40bdd1243dSDimitry Andric if (A.Name == Arch) {
41bdd1243dSDimitry Andric for (const auto F : AllFeatures)
42fe013be4SDimitry Andric if ((A.Features & F.Kind) == F.Kind)
43bdd1243dSDimitry Andric Features.push_back(F.Name);
44bdd1243dSDimitry Andric return true;
45bdd1243dSDimitry Andric }
46bdd1243dSDimitry Andric }
47bdd1243dSDimitry Andric return false;
48bdd1243dSDimitry Andric }
49*271697daSDimitry Andric
isValidCPUName(StringRef Name)50*271697daSDimitry Andric bool LoongArch::isValidCPUName(StringRef Name) { return isValidArchName(Name); }
51*271697daSDimitry Andric
fillValidCPUList(SmallVectorImpl<StringRef> & Values)52*271697daSDimitry Andric void LoongArch::fillValidCPUList(SmallVectorImpl<StringRef> &Values) {
53*271697daSDimitry Andric for (const auto A : AllArchs)
54*271697daSDimitry Andric Values.emplace_back(A.Name);
55*271697daSDimitry Andric }
56*271697daSDimitry Andric
getDefaultArch(bool Is64Bit)57*271697daSDimitry Andric StringRef LoongArch::getDefaultArch(bool Is64Bit) {
58*271697daSDimitry Andric // TODO: use a real 32-bit arch name.
59*271697daSDimitry Andric return Is64Bit ? "loongarch64" : "";
60*271697daSDimitry Andric }
61