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