xref: /llvm-project/llvm/lib/TargetParser/CSKYTargetParser.cpp (revision 586ecdf205aa8b3d162da6f955170a6736656615)
1f09cf34dSArchibald Elliott //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2f09cf34dSArchibald Elliott //
3f09cf34dSArchibald Elliott //                     The LLVM Compiler Infrastructure
4f09cf34dSArchibald Elliott //
5f09cf34dSArchibald Elliott // This file is distributed under the University of Illinois Open Source
6f09cf34dSArchibald Elliott // License. See LICENSE.TXT for details.
7f09cf34dSArchibald Elliott //
8f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===//
9f09cf34dSArchibald Elliott //
10f09cf34dSArchibald Elliott // This file implements a target parser to recognise CSKY hardware features
11f09cf34dSArchibald Elliott // such as CPU/ARCH names.
12f09cf34dSArchibald Elliott //
13f09cf34dSArchibald Elliott //===----------------------------------------------------------------------===//
14f09cf34dSArchibald Elliott 
15f09cf34dSArchibald Elliott #include "llvm/TargetParser/CSKYTargetParser.h"
16f09cf34dSArchibald Elliott #include "llvm/ADT/StringSwitch.h"
17f09cf34dSArchibald Elliott 
18f09cf34dSArchibald Elliott using namespace llvm;
19f09cf34dSArchibald Elliott 
getFPUFeatures(CSKYFPUKind CSKYFPUKind,std::vector<StringRef> & Features)20f09cf34dSArchibald Elliott bool CSKY::getFPUFeatures(CSKYFPUKind CSKYFPUKind,
21f09cf34dSArchibald Elliott                           std::vector<StringRef> &Features) {
22f09cf34dSArchibald Elliott 
23f09cf34dSArchibald Elliott   if (CSKYFPUKind >= FK_LAST || CSKYFPUKind == FK_INVALID)
24f09cf34dSArchibald Elliott     return false;
25f09cf34dSArchibald Elliott 
26f09cf34dSArchibald Elliott   switch (CSKYFPUKind) {
27f09cf34dSArchibald Elliott   case FK_AUTO:
28f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_sf");
29f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_df");
30f09cf34dSArchibald Elliott     Features.push_back("+fdivdu");
31f09cf34dSArchibald Elliott     break;
32f09cf34dSArchibald Elliott   case FK_FPV2:
33f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_sf");
34f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_df");
35f09cf34dSArchibald Elliott     break;
36f09cf34dSArchibald Elliott   case FK_FPV2_DIVD:
37f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_sf");
38f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_df");
39f09cf34dSArchibald Elliott     Features.push_back("+fdivdu");
40f09cf34dSArchibald Elliott     break;
41f09cf34dSArchibald Elliott   case FK_FPV2_SF:
42f09cf34dSArchibald Elliott     Features.push_back("+fpuv2_sf");
43f09cf34dSArchibald Elliott     break;
44f09cf34dSArchibald Elliott   case FK_FPV3:
45f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hf");
46f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hi");
47f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_sf");
48f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_df");
49f09cf34dSArchibald Elliott     break;
50f09cf34dSArchibald Elliott   case FK_FPV3_HF:
51f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hf");
52f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hi");
53f09cf34dSArchibald Elliott     break;
54f09cf34dSArchibald Elliott   case FK_FPV3_HSF:
55f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hf");
56f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_hi");
57f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_sf");
58f09cf34dSArchibald Elliott     break;
59f09cf34dSArchibald Elliott   case FK_FPV3_SDF:
60f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_sf");
61f09cf34dSArchibald Elliott     Features.push_back("+fpuv3_df");
62f09cf34dSArchibald Elliott     break;
63f09cf34dSArchibald Elliott   default:
64f09cf34dSArchibald Elliott     llvm_unreachable("Unknown FPU Kind");
65f09cf34dSArchibald Elliott     return false;
66f09cf34dSArchibald Elliott   }
67f09cf34dSArchibald Elliott 
68f09cf34dSArchibald Elliott   return true;
69f09cf34dSArchibald Elliott }
70f09cf34dSArchibald Elliott 
71f09cf34dSArchibald Elliott // ======================================================= //
72f09cf34dSArchibald Elliott // Information by ID
73f09cf34dSArchibald Elliott // ======================================================= //
74f09cf34dSArchibald Elliott 
getArchName(ArchKind AK)75f09cf34dSArchibald Elliott StringRef CSKY::getArchName(ArchKind AK) {
76f09cf34dSArchibald Elliott   return ARCHNames[static_cast<unsigned>(AK)].getName();
77f09cf34dSArchibald Elliott }
78f09cf34dSArchibald Elliott 
79f09cf34dSArchibald Elliott // The default cpu's name is same as arch name.
getDefaultCPU(StringRef Arch)80f09cf34dSArchibald Elliott StringRef CSKY::getDefaultCPU(StringRef Arch) {
81f09cf34dSArchibald Elliott   ArchKind AK = parseArch(Arch);
82f09cf34dSArchibald Elliott   if (AK == CSKY::ArchKind::INVALID)
83f09cf34dSArchibald Elliott     return StringRef();
84f09cf34dSArchibald Elliott 
85f09cf34dSArchibald Elliott   return Arch;
86f09cf34dSArchibald Elliott }
87f09cf34dSArchibald Elliott 
88f09cf34dSArchibald Elliott // ======================================================= //
89f09cf34dSArchibald Elliott // Parsers
90f09cf34dSArchibald Elliott // ======================================================= //
parseArch(StringRef Arch)91f09cf34dSArchibald Elliott CSKY::ArchKind CSKY::parseArch(StringRef Arch) {
92f09cf34dSArchibald Elliott   for (const auto A : ARCHNames) {
93f09cf34dSArchibald Elliott     if (A.getName() == Arch)
94f09cf34dSArchibald Elliott       return A.ID;
95f09cf34dSArchibald Elliott   }
96f09cf34dSArchibald Elliott 
97f09cf34dSArchibald Elliott   return CSKY::ArchKind::INVALID;
98f09cf34dSArchibald Elliott }
99f09cf34dSArchibald Elliott 
parseCPUArch(StringRef CPU)100f09cf34dSArchibald Elliott CSKY::ArchKind CSKY::parseCPUArch(StringRef CPU) {
101f09cf34dSArchibald Elliott   for (const auto C : CPUNames) {
102f09cf34dSArchibald Elliott     if (CPU == C.getName())
103f09cf34dSArchibald Elliott       return C.ArchID;
104f09cf34dSArchibald Elliott   }
105f09cf34dSArchibald Elliott 
106f09cf34dSArchibald Elliott   return CSKY::ArchKind::INVALID;
107f09cf34dSArchibald Elliott }
108f09cf34dSArchibald Elliott 
parseArchExt(StringRef ArchExt)109f09cf34dSArchibald Elliott uint64_t CSKY::parseArchExt(StringRef ArchExt) {
110f09cf34dSArchibald Elliott   for (const auto &A : CSKYARCHExtNames) {
111f09cf34dSArchibald Elliott     if (ArchExt == A.getName())
112f09cf34dSArchibald Elliott       return A.ID;
113f09cf34dSArchibald Elliott   }
114f09cf34dSArchibald Elliott   return AEK_INVALID;
115f09cf34dSArchibald Elliott }
116f09cf34dSArchibald Elliott 
fillValidCPUArchList(SmallVectorImpl<StringRef> & Values)117f09cf34dSArchibald Elliott void CSKY::fillValidCPUArchList(SmallVectorImpl<StringRef> &Values) {
118f09cf34dSArchibald Elliott   for (const CpuNames<CSKY::ArchKind> &Arch : CPUNames) {
119f09cf34dSArchibald Elliott     if (Arch.ArchID != CSKY::ArchKind::INVALID)
120f09cf34dSArchibald Elliott       Values.push_back(Arch.getName());
121f09cf34dSArchibald Elliott   }
122f09cf34dSArchibald Elliott }
123f09cf34dSArchibald Elliott 
getFPUName(unsigned FPUKind)124f09cf34dSArchibald Elliott StringRef CSKY::getFPUName(unsigned FPUKind) {
125f09cf34dSArchibald Elliott   if (FPUKind >= FK_LAST)
126f09cf34dSArchibald Elliott     return StringRef();
127f09cf34dSArchibald Elliott   return FPUNames[FPUKind].getName();
128f09cf34dSArchibald Elliott }
129f09cf34dSArchibald Elliott 
getFPUVersion(unsigned FPUKind)130f09cf34dSArchibald Elliott CSKY::FPUVersion CSKY::getFPUVersion(unsigned FPUKind) {
131f09cf34dSArchibald Elliott   if (FPUKind >= FK_LAST)
132f09cf34dSArchibald Elliott     return FPUVersion::NONE;
133f09cf34dSArchibald Elliott   return FPUNames[FPUKind].FPUVer;
134f09cf34dSArchibald Elliott }
135f09cf34dSArchibald Elliott 
getDefaultExtensions(StringRef CPU)136f09cf34dSArchibald Elliott uint64_t CSKY::getDefaultExtensions(StringRef CPU) {
137f09cf34dSArchibald Elliott   return StringSwitch<uint64_t>(CPU)
138f09cf34dSArchibald Elliott #define CSKY_CPU_NAME(NAME, ID, DEFAULT_EXT)                                   \
139f09cf34dSArchibald Elliott   .Case(NAME, ARCHNames[static_cast<unsigned>(ArchKind::ID)].archBaseExt |     \
140f09cf34dSArchibald Elliott                   DEFAULT_EXT)
141f09cf34dSArchibald Elliott #include "llvm/TargetParser/CSKYTargetParser.def"
142f09cf34dSArchibald Elliott       .Default(CSKY::AEK_INVALID);
143f09cf34dSArchibald Elliott }
144f09cf34dSArchibald Elliott 
getArchExtName(uint64_t ArchExtKind)145f09cf34dSArchibald Elliott StringRef CSKY::getArchExtName(uint64_t ArchExtKind) {
146f09cf34dSArchibald Elliott   for (const auto &AE : CSKYARCHExtNames)
147f09cf34dSArchibald Elliott     if (ArchExtKind == AE.ID)
148f09cf34dSArchibald Elliott       return AE.getName();
149f09cf34dSArchibald Elliott   return StringRef();
150f09cf34dSArchibald Elliott }
151f09cf34dSArchibald Elliott 
stripNegationPrefix(StringRef & Name)152f09cf34dSArchibald Elliott static bool stripNegationPrefix(StringRef &Name) {
153*586ecdf2SKazu Hirata   if (Name.starts_with("no")) {
154f09cf34dSArchibald Elliott     Name = Name.substr(2);
155f09cf34dSArchibald Elliott     return true;
156f09cf34dSArchibald Elliott   }
157f09cf34dSArchibald Elliott   return false;
158f09cf34dSArchibald Elliott }
159f09cf34dSArchibald Elliott 
getArchExtFeature(StringRef ArchExt)160f09cf34dSArchibald Elliott StringRef CSKY::getArchExtFeature(StringRef ArchExt) {
161f09cf34dSArchibald Elliott   bool Negated = stripNegationPrefix(ArchExt);
162f09cf34dSArchibald Elliott   for (const auto &AE : CSKYARCHExtNames) {
163f09cf34dSArchibald Elliott     if (AE.Feature && ArchExt == AE.getName())
164f09cf34dSArchibald Elliott       return StringRef(Negated ? AE.NegFeature : AE.Feature);
165f09cf34dSArchibald Elliott   }
166f09cf34dSArchibald Elliott 
167f09cf34dSArchibald Elliott   return StringRef();
168f09cf34dSArchibald Elliott }
169f09cf34dSArchibald Elliott 
getExtensionFeatures(uint64_t Extensions,std::vector<StringRef> & Features)170f09cf34dSArchibald Elliott bool CSKY::getExtensionFeatures(uint64_t Extensions,
171f09cf34dSArchibald Elliott                                 std::vector<StringRef> &Features) {
172f09cf34dSArchibald Elliott   if (Extensions == CSKY::AEK_INVALID)
173f09cf34dSArchibald Elliott     return false;
174f09cf34dSArchibald Elliott 
175f09cf34dSArchibald Elliott   for (const auto &AE : CSKYARCHExtNames) {
176f09cf34dSArchibald Elliott     if ((Extensions & AE.ID) == AE.ID && AE.Feature)
177f09cf34dSArchibald Elliott       Features.push_back(AE.Feature);
178f09cf34dSArchibald Elliott   }
179f09cf34dSArchibald Elliott 
180f09cf34dSArchibald Elliott   return true;
181f09cf34dSArchibald Elliott }
182