xref: /freebsd/contrib/llvm-project/llvm/include/llvm/TargetParser/CSKYTargetParser.h (revision 95b4436e989df29f6368f13832cb13d7cbc52eac)
1 //===-- CSKYTargetParser - Parser for CSKY target features --------*- C++
2 //-*-===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements a target parser to recognise CSKY hardware features
11 // such as FPU/CPU/ARCH/extensions and specific support such as HWDIV.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_TARGETPARSER_CSKYTARGETPARSER_H
16 #define LLVM_TARGETPARSER_CSKYTARGETPARSER_H
17 
18 #include "llvm/Support/Compiler.h"
19 #include "llvm/TargetParser/Triple.h"
20 #include <vector>
21 
22 namespace llvm {
23 class StringRef;
24 
25 namespace CSKY {
26 
27 // Arch extension modifiers for CPUs.
28 enum ArchExtKind : uint64_t {
29   AEK_INVALID = 0,
30   AEK_NONE = 1,
31   AEK_FPUV2SF = 1 << 1,
32   AEK_FPUV2DF = 1 << 2,
33   AEK_FDIVDU = 1 << 3,
34   AEK_FPUV3HI = 1 << 4,
35   AEK_FPUV3HF = 1 << 5,
36   AEK_FPUV3SF = 1 << 6,
37   AEK_FPUV3DF = 1 << 7,
38   AEK_FLOATE1 = 1 << 8,
39   AEK_FLOAT1E2 = 1 << 9,
40   AEK_FLOAT1E3 = 1 << 10,
41   AEK_FLOAT3E4 = 1 << 11,
42   AEK_FLOAT7E60 = 1 << 12,
43   AEK_HWDIV = 1 << 13,
44   AEK_STLD = 1 << 14,
45   AEK_PUSHPOP = 1 << 15,
46   AEK_EDSP = 1 << 16,
47   AEK_DSP1E2 = 1 << 17,
48   AEK_DSPE60 = 1 << 18,
49   AEK_DSPV2 = 1 << 19,
50   AEK_DSPSILAN = 1 << 20,
51   AEK_ELRW = 1 << 21,
52   AEK_TRUST = 1 << 22,
53   AEK_JAVA = 1 << 23,
54   AEK_CACHE = 1 << 24,
55   AEK_NVIC = 1 << 25,
56   AEK_DOLOOP = 1 << 26,
57   AEK_HIGHREG = 1 << 27,
58   AEK_SMART = 1 << 28,
59   AEK_VDSP2E3 = 1 << 29,
60   AEK_VDSP2E60F = 1 << 30,
61   AEK_VDSPV2 = 1ULL << 31,
62   AEK_HARDTP = 1ULL << 32,
63   AEK_SOFTTP = 1ULL << 33,
64   AEK_ISTACK = 1ULL << 34,
65   AEK_CONSTPOOL = 1ULL << 35,
66   AEK_STACKSIZE = 1ULL << 36,
67   AEK_CCRT = 1ULL << 37,
68   AEK_VDSPV1 = 1ULL << 38,
69   AEK_E1 = 1ULL << 39,
70   AEK_E2 = 1ULL << 40,
71   AEK_2E3 = 1ULL << 41,
72   AEK_MP = 1ULL << 42,
73   AEK_3E3R1 = 1ULL << 43,
74   AEK_3E3R2 = 1ULL << 44,
75   AEK_3E3R3 = 1ULL << 45,
76   AEK_3E7 = 1ULL << 46,
77   AEK_MP1E2 = 1ULL << 47,
78   AEK_7E10 = 1ULL << 48,
79   AEK_10E60 = 1ULL << 49
80 
81 };
82 
83 // Arch extension modifiers for CPUs.
84 enum MultiArchExtKind : uint64_t {
85   MAEK_E1 = CSKY::AEK_E1 | CSKY::AEK_ELRW,
86   MAEK_E2 = CSKY::AEK_E2 | CSKY::MAEK_E1,
87   MAEK_2E3 = CSKY::AEK_2E3 | CSKY::MAEK_E2,
88   MAEK_MP = CSKY::AEK_MP | CSKY::MAEK_2E3,
89   MAEK_3E3R1 = CSKY::AEK_3E3R1,
90   MAEK_3E3R2 = CSKY::AEK_3E3R1 | CSKY::AEK_3E3R2 | CSKY::AEK_DOLOOP,
91   MAEK_3E7 = CSKY::AEK_3E7 | CSKY::MAEK_2E3,
92   MAEK_MP1E2 = CSKY::AEK_MP1E2 | CSKY::MAEK_3E7,
93   MAEK_7E10 = CSKY::AEK_7E10 | CSKY::MAEK_3E7,
94   MAEK_10E60 = CSKY::AEK_10E60 | CSKY::MAEK_7E10,
95 };
96 // FPU names.
97 enum CSKYFPUKind {
98 #define CSKY_FPU(NAME, KIND, VERSION) KIND,
99 #include "CSKYTargetParser.def"
100   FK_LAST
101 };
102 
103 // FPU Version
104 enum class FPUVersion {
105   NONE,
106   FPV2,
107   FPV3,
108 };
109 
110 // Arch names.
111 enum class ArchKind {
112 #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) ID,
113 #include "CSKYTargetParser.def"
114 };
115 
116 // List of Arch Extension names.
117 // FIXME: TableGen this.
118 struct ExtName {
119   const char *NameCStr;
120   size_t NameLength;
121   uint64_t ID;
122   const char *Feature;
123   const char *NegFeature;
124 
125   StringRef getName() const { return StringRef(NameCStr, NameLength); }
126 };
127 
128 const CSKY::ExtName CSKYARCHExtNames[] = {
129 #define CSKY_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE)                      \
130   {NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE},
131 #include "CSKYTargetParser.def"
132 };
133 
134 // List of CPU names and their arches.
135 template <typename T> struct CpuNames {
136   const char *NameCStr;
137   size_t NameLength;
138   T ArchID;
139   uint64_t defaultExt;
140 
141   StringRef getName() const { return StringRef(NameCStr, NameLength); }
142 };
143 const CpuNames<CSKY::ArchKind> CPUNames[] = {
144 #define CSKY_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT)                              \
145   {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ARCH_ID, DEFAULT_EXT},
146 #include "llvm/TargetParser/CSKYTargetParser.def"
147 };
148 
149 // FIXME: TableGen this.
150 // The entries must appear in the order listed in CSKY::CSKYFPUKind for correct
151 // indexing
152 struct FPUName {
153   const char *NameCStr;
154   size_t NameLength;
155   CSKYFPUKind ID;
156   FPUVersion FPUVer;
157 
158   StringRef getName() const { return StringRef(NameCStr, NameLength); }
159 };
160 
161 static const FPUName FPUNames[] = {
162 #define CSKY_FPU(NAME, KIND, VERSION) {NAME, sizeof(NAME) - 1, KIND, VERSION},
163 #include "llvm/TargetParser/CSKYTargetParser.def"
164 };
165 
166 // List of canonical arch names.
167 template <typename T> struct ArchNames {
168   const char *NameCStr;
169   size_t NameLength;
170   T ID;
171   uint64_t archBaseExt;
172   StringRef getName() const { return StringRef(NameCStr, NameLength); }
173 };
174 const ArchNames<CSKY::ArchKind> ARCHNames[] = {
175 #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT)                                     \
176   {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ID, ARCH_BASE_EXT},
177 #include "llvm/TargetParser/CSKYTargetParser.def"
178 };
179 
180 LLVM_ABI StringRef getArchName(ArchKind AK);
181 LLVM_ABI StringRef getDefaultCPU(StringRef Arch);
182 LLVM_ABI StringRef getArchExtName(uint64_t ArchExtKind);
183 LLVM_ABI StringRef getArchExtFeature(StringRef ArchExt);
184 LLVM_ABI uint64_t getDefaultExtensions(StringRef CPU);
185 LLVM_ABI bool getExtensionFeatures(uint64_t Extensions,
186                                    std::vector<StringRef> &Features);
187 
188 // Information by ID
189 LLVM_ABI StringRef getFPUName(unsigned FPUKind);
190 LLVM_ABI FPUVersion getFPUVersion(unsigned FPUKind);
191 
192 LLVM_ABI bool getFPUFeatures(CSKYFPUKind Kind,
193                              std::vector<StringRef> &Features);
194 
195 // Parser
196 LLVM_ABI ArchKind parseArch(StringRef Arch);
197 LLVM_ABI ArchKind parseCPUArch(StringRef CPU);
198 LLVM_ABI uint64_t parseArchExt(StringRef ArchExt);
199 LLVM_ABI void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
200 
201 } // namespace CSKY
202 
203 } // namespace llvm
204 
205 #endif
206