File indexing completed on 2026-05-10 08:44:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #ifndef LLVM_TARGETPARSER_CSKYTARGETPARSER_H
0016 #define LLVM_TARGETPARSER_CSKYTARGETPARSER_H
0017
0018 #include "llvm/TargetParser/Triple.h"
0019 #include <vector>
0020
0021 namespace llvm {
0022 class StringRef;
0023
0024 namespace CSKY {
0025
0026
0027 enum ArchExtKind : uint64_t {
0028 AEK_INVALID = 0,
0029 AEK_NONE = 1,
0030 AEK_FPUV2SF = 1 << 1,
0031 AEK_FPUV2DF = 1 << 2,
0032 AEK_FDIVDU = 1 << 3,
0033 AEK_FPUV3HI = 1 << 4,
0034 AEK_FPUV3HF = 1 << 5,
0035 AEK_FPUV3SF = 1 << 6,
0036 AEK_FPUV3DF = 1 << 7,
0037 AEK_FLOATE1 = 1 << 8,
0038 AEK_FLOAT1E2 = 1 << 9,
0039 AEK_FLOAT1E3 = 1 << 10,
0040 AEK_FLOAT3E4 = 1 << 11,
0041 AEK_FLOAT7E60 = 1 << 12,
0042 AEK_HWDIV = 1 << 13,
0043 AEK_STLD = 1 << 14,
0044 AEK_PUSHPOP = 1 << 15,
0045 AEK_EDSP = 1 << 16,
0046 AEK_DSP1E2 = 1 << 17,
0047 AEK_DSPE60 = 1 << 18,
0048 AEK_DSPV2 = 1 << 19,
0049 AEK_DSPSILAN = 1 << 20,
0050 AEK_ELRW = 1 << 21,
0051 AEK_TRUST = 1 << 22,
0052 AEK_JAVA = 1 << 23,
0053 AEK_CACHE = 1 << 24,
0054 AEK_NVIC = 1 << 25,
0055 AEK_DOLOOP = 1 << 26,
0056 AEK_HIGHREG = 1 << 27,
0057 AEK_SMART = 1 << 28,
0058 AEK_VDSP2E3 = 1 << 29,
0059 AEK_VDSP2E60F = 1 << 30,
0060 AEK_VDSPV2 = 1ULL << 31,
0061 AEK_HARDTP = 1ULL << 32,
0062 AEK_SOFTTP = 1ULL << 33,
0063 AEK_ISTACK = 1ULL << 34,
0064 AEK_CONSTPOOL = 1ULL << 35,
0065 AEK_STACKSIZE = 1ULL << 36,
0066 AEK_CCRT = 1ULL << 37,
0067 AEK_VDSPV1 = 1ULL << 38,
0068 AEK_E1 = 1ULL << 39,
0069 AEK_E2 = 1ULL << 40,
0070 AEK_2E3 = 1ULL << 41,
0071 AEK_MP = 1ULL << 42,
0072 AEK_3E3R1 = 1ULL << 43,
0073 AEK_3E3R2 = 1ULL << 44,
0074 AEK_3E3R3 = 1ULL << 45,
0075 AEK_3E7 = 1ULL << 46,
0076 AEK_MP1E2 = 1ULL << 47,
0077 AEK_7E10 = 1ULL << 48,
0078 AEK_10E60 = 1ULL << 49
0079
0080 };
0081
0082
0083 enum MultiArchExtKind : uint64_t {
0084 MAEK_E1 = CSKY::AEK_E1 | CSKY::AEK_ELRW,
0085 MAEK_E2 = CSKY::AEK_E2 | CSKY::MAEK_E1,
0086 MAEK_2E3 = CSKY::AEK_2E3 | CSKY::MAEK_E2,
0087 MAEK_MP = CSKY::AEK_MP | CSKY::MAEK_2E3,
0088 MAEK_3E3R1 = CSKY::AEK_3E3R1,
0089 MAEK_3E3R2 = CSKY::AEK_3E3R1 | CSKY::AEK_3E3R2 | CSKY::AEK_DOLOOP,
0090 MAEK_3E7 = CSKY::AEK_3E7 | CSKY::MAEK_2E3,
0091 MAEK_MP1E2 = CSKY::AEK_MP1E2 | CSKY::MAEK_3E7,
0092 MAEK_7E10 = CSKY::AEK_7E10 | CSKY::MAEK_3E7,
0093 MAEK_10E60 = CSKY::AEK_10E60 | CSKY::MAEK_7E10,
0094 };
0095
0096 enum CSKYFPUKind {
0097 #define CSKY_FPU(NAME, KIND, VERSION) KIND,
0098 #include "CSKYTargetParser.def"
0099 FK_LAST
0100 };
0101
0102
0103 enum class FPUVersion {
0104 NONE,
0105 FPV2,
0106 FPV3,
0107 };
0108
0109
0110 enum class ArchKind {
0111 #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) ID,
0112 #include "CSKYTargetParser.def"
0113 };
0114
0115
0116
0117 struct ExtName {
0118 const char *NameCStr;
0119 size_t NameLength;
0120 uint64_t ID;
0121 const char *Feature;
0122 const char *NegFeature;
0123
0124 StringRef getName() const { return StringRef(NameCStr, NameLength); }
0125 };
0126
0127 const CSKY::ExtName CSKYARCHExtNames[] = {
0128 #define CSKY_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \
0129 {NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE},
0130 #include "CSKYTargetParser.def"
0131 };
0132
0133
0134 template <typename T> struct CpuNames {
0135 const char *NameCStr;
0136 size_t NameLength;
0137 T ArchID;
0138 uint64_t defaultExt;
0139
0140 StringRef getName() const { return StringRef(NameCStr, NameLength); }
0141 };
0142 const CpuNames<CSKY::ArchKind> CPUNames[] = {
0143 #define CSKY_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) \
0144 {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ARCH_ID, DEFAULT_EXT},
0145 #include "llvm/TargetParser/CSKYTargetParser.def"
0146 };
0147
0148
0149
0150
0151 struct FPUName {
0152 const char *NameCStr;
0153 size_t NameLength;
0154 CSKYFPUKind ID;
0155 FPUVersion FPUVer;
0156
0157 StringRef getName() const { return StringRef(NameCStr, NameLength); }
0158 };
0159
0160 static const FPUName FPUNames[] = {
0161 #define CSKY_FPU(NAME, KIND, VERSION) {NAME, sizeof(NAME) - 1, KIND, VERSION},
0162 #include "llvm/TargetParser/CSKYTargetParser.def"
0163 };
0164
0165
0166 template <typename T> struct ArchNames {
0167 const char *NameCStr;
0168 size_t NameLength;
0169 T ID;
0170 uint64_t archBaseExt;
0171 StringRef getName() const { return StringRef(NameCStr, NameLength); }
0172 };
0173 const ArchNames<CSKY::ArchKind> ARCHNames[] = {
0174 #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) \
0175 {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ID, ARCH_BASE_EXT},
0176 #include "llvm/TargetParser/CSKYTargetParser.def"
0177 };
0178
0179 StringRef getArchName(ArchKind AK);
0180 StringRef getDefaultCPU(StringRef Arch);
0181 StringRef getArchExtName(uint64_t ArchExtKind);
0182 StringRef getArchExtFeature(StringRef ArchExt);
0183 uint64_t getDefaultExtensions(StringRef CPU);
0184 bool getExtensionFeatures(uint64_t Extensions,
0185 std::vector<StringRef> &Features);
0186
0187
0188 StringRef getFPUName(unsigned FPUKind);
0189 FPUVersion getFPUVersion(unsigned FPUKind);
0190
0191 bool getFPUFeatures(CSKYFPUKind Kind, std::vector<StringRef> &Features);
0192
0193
0194 ArchKind parseArch(StringRef Arch);
0195 ArchKind parseCPUArch(StringRef CPU);
0196 uint64_t parseArchExt(StringRef ArchExt);
0197 void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
0198
0199 }
0200
0201 }
0202
0203 #endif