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