Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-05-10 08:44:36

0001 //===-- CSKYTargetParser - Parser for CSKY target features --------*- C++
0002 //-*-===//
0003 //
0004 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
0005 // See https://llvm.org/LICENSE.txt for license information.
0006 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
0007 //
0008 //===----------------------------------------------------------------------===//
0009 //
0010 // This file implements a target parser to recognise CSKY hardware features
0011 // such as FPU/CPU/ARCH/extensions and specific support such as HWDIV.
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 // Arch extension modifiers for CPUs.
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 // Arch extension modifiers for CPUs.
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 // FPU names.
0096 enum CSKYFPUKind {
0097 #define CSKY_FPU(NAME, KIND, VERSION) KIND,
0098 #include "CSKYTargetParser.def"
0099   FK_LAST
0100 };
0101 
0102 // FPU Version
0103 enum class FPUVersion {
0104   NONE,
0105   FPV2,
0106   FPV3,
0107 };
0108 
0109 // Arch names.
0110 enum class ArchKind {
0111 #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) ID,
0112 #include "CSKYTargetParser.def"
0113 };
0114 
0115 // List of Arch Extension names.
0116 // FIXME: TableGen this.
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 // List of CPU names and their arches.
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 // FIXME: TableGen this.
0149 // The entries must appear in the order listed in CSKY::CSKYFPUKind for correct
0150 // indexing
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 // List of canonical arch names.
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 // Information by ID
0188 StringRef getFPUName(unsigned FPUKind);
0189 FPUVersion getFPUVersion(unsigned FPUKind);
0190 
0191 bool getFPUFeatures(CSKYFPUKind Kind, std::vector<StringRef> &Features);
0192 
0193 // Parser
0194 ArchKind parseArch(StringRef Arch);
0195 ArchKind parseCPUArch(StringRef CPU);
0196 uint64_t parseArchExt(StringRef ArchExt);
0197 void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
0198 
0199 } // namespace CSKY
0200 
0201 } // namespace llvm
0202 
0203 #endif