123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- CSKYTargetParser - Parser for CSKY target features --------*- C++
- //-*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- //
- // This file implements a target parser to recognise CSKY hardware features
- // such as FPU/CPU/ARCH/extensions and specific support such as HWDIV.
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_TARGETPARSER_CSKYTARGETPARSER_H
- #define LLVM_TARGETPARSER_CSKYTARGETPARSER_H
- #include "llvm/TargetParser/Triple.h"
- #include <vector>
- namespace llvm {
- class StringRef;
- namespace CSKY {
- // Arch extension modifiers for CPUs.
- enum ArchExtKind : uint64_t {
- AEK_INVALID = 0,
- AEK_NONE = 1,
- AEK_FPUV2SF = 1 << 1,
- AEK_FPUV2DF = 1 << 2,
- AEK_FDIVDU = 1 << 3,
- AEK_FPUV3HI = 1 << 4,
- AEK_FPUV3HF = 1 << 5,
- AEK_FPUV3SF = 1 << 6,
- AEK_FPUV3DF = 1 << 7,
- AEK_FLOATE1 = 1 << 8,
- AEK_FLOAT1E2 = 1 << 9,
- AEK_FLOAT1E3 = 1 << 10,
- AEK_FLOAT3E4 = 1 << 11,
- AEK_FLOAT7E60 = 1 << 12,
- AEK_HWDIV = 1 << 13,
- AEK_STLD = 1 << 14,
- AEK_PUSHPOP = 1 << 15,
- AEK_EDSP = 1 << 16,
- AEK_DSP1E2 = 1 << 17,
- AEK_DSPE60 = 1 << 18,
- AEK_DSPV2 = 1 << 19,
- AEK_DSPSILAN = 1 << 20,
- AEK_ELRW = 1 << 21,
- AEK_TRUST = 1 << 22,
- AEK_JAVA = 1 << 23,
- AEK_CACHE = 1 << 24,
- AEK_NVIC = 1 << 25,
- AEK_DOLOOP = 1 << 26,
- AEK_HIGHREG = 1 << 27,
- AEK_SMART = 1 << 28,
- AEK_VDSP2E3 = 1 << 29,
- AEK_VDSP2E60F = 1 << 30,
- AEK_VDSPV2 = 1ULL << 31,
- AEK_HARDTP = 1ULL << 32,
- AEK_SOFTTP = 1ULL << 33,
- AEK_ISTACK = 1ULL << 34,
- AEK_CONSTPOOL = 1ULL << 35,
- AEK_STACKSIZE = 1ULL << 36,
- AEK_CCRT = 1ULL << 37,
- AEK_VDSPV1 = 1ULL << 38,
- AEK_E1 = 1ULL << 39,
- AEK_E2 = 1ULL << 40,
- AEK_2E3 = 1ULL << 41,
- AEK_MP = 1ULL << 42,
- AEK_3E3R1 = 1ULL << 43,
- AEK_3E3R2 = 1ULL << 44,
- AEK_3E3R3 = 1ULL << 45,
- AEK_3E7 = 1ULL << 46,
- AEK_MP1E2 = 1ULL << 47,
- AEK_7E10 = 1ULL << 48,
- AEK_10E60 = 1ULL << 49
- };
- // Arch extension modifiers for CPUs.
- enum MultiArchExtKind : uint64_t {
- MAEK_E1 = CSKY::AEK_E1 | CSKY::AEK_ELRW,
- MAEK_E2 = CSKY::AEK_E2 | CSKY::MAEK_E1,
- MAEK_2E3 = CSKY::AEK_2E3 | CSKY::MAEK_E2,
- MAEK_MP = CSKY::AEK_MP | CSKY::MAEK_2E3,
- MAEK_3E3R1 = CSKY::AEK_3E3R1,
- MAEK_3E3R2 = CSKY::AEK_3E3R1 | CSKY::AEK_3E3R2 | CSKY::AEK_DOLOOP,
- MAEK_3E7 = CSKY::AEK_3E7 | CSKY::MAEK_2E3,
- MAEK_MP1E2 = CSKY::AEK_MP1E2 | CSKY::MAEK_3E7,
- MAEK_7E10 = CSKY::AEK_7E10 | CSKY::MAEK_3E7,
- MAEK_10E60 = CSKY::AEK_10E60 | CSKY::MAEK_7E10,
- };
- // FPU names.
- enum CSKYFPUKind {
- #define CSKY_FPU(NAME, KIND, VERSION) KIND,
- #include "CSKYTargetParser.def"
- FK_LAST
- };
- // FPU Version
- enum class FPUVersion {
- NONE,
- FPV2,
- FPV3,
- };
- // Arch names.
- enum class ArchKind {
- #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) ID,
- #include "CSKYTargetParser.def"
- };
- // List of Arch Extension names.
- // FIXME: TableGen this.
- struct ExtName {
- const char *NameCStr;
- size_t NameLength;
- uint64_t ID;
- const char *Feature;
- const char *NegFeature;
- StringRef getName() const { return StringRef(NameCStr, NameLength); }
- };
- const CSKY::ExtName CSKYARCHExtNames[] = {
- #define CSKY_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) \
- {NAME, sizeof(NAME) - 1, ID, FEATURE, NEGFEATURE},
- #include "CSKYTargetParser.def"
- };
- // List of CPU names and their arches.
- template <typename T> struct CpuNames {
- const char *NameCStr;
- size_t NameLength;
- T ArchID;
- uint64_t defaultExt;
- StringRef getName() const { return StringRef(NameCStr, NameLength); }
- };
- const CpuNames<CSKY::ArchKind> CPUNames[] = {
- #define CSKY_CPU_NAME(NAME, ARCH_ID, DEFAULT_EXT) \
- {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ARCH_ID, DEFAULT_EXT},
- #include "llvm/TargetParser/CSKYTargetParser.def"
- };
- // FIXME: TableGen this.
- // The entries must appear in the order listed in CSKY::CSKYFPUKind for correct
- // indexing
- struct FPUName {
- const char *NameCStr;
- size_t NameLength;
- CSKYFPUKind ID;
- FPUVersion FPUVer;
- StringRef getName() const { return StringRef(NameCStr, NameLength); }
- };
- static const FPUName FPUNames[] = {
- #define CSKY_FPU(NAME, KIND, VERSION) {NAME, sizeof(NAME) - 1, KIND, VERSION},
- #include "llvm/TargetParser/CSKYTargetParser.def"
- };
- // List of canonical arch names.
- template <typename T> struct ArchNames {
- const char *NameCStr;
- size_t NameLength;
- T ID;
- uint64_t archBaseExt;
- StringRef getName() const { return StringRef(NameCStr, NameLength); }
- };
- const ArchNames<CSKY::ArchKind> ARCHNames[] = {
- #define CSKY_ARCH(NAME, ID, ARCH_BASE_EXT) \
- {NAME, sizeof(NAME) - 1, CSKY::ArchKind::ID, ARCH_BASE_EXT},
- #include "llvm/TargetParser/CSKYTargetParser.def"
- };
- StringRef getArchName(ArchKind AK);
- StringRef getDefaultCPU(StringRef Arch);
- StringRef getArchExtName(uint64_t ArchExtKind);
- StringRef getArchExtFeature(StringRef ArchExt);
- uint64_t getDefaultExtensions(StringRef CPU);
- bool getExtensionFeatures(uint64_t Extensions,
- std::vector<StringRef> &Features);
- // Information by ID
- StringRef getFPUName(unsigned FPUKind);
- FPUVersion getFPUVersion(unsigned FPUKind);
- bool getFPUFeatures(CSKYFPUKind Kind, std::vector<StringRef> &Features);
- // Parser
- ArchKind parseArch(StringRef Arch);
- ArchKind parseCPUArch(StringRef CPU);
- uint64_t parseArchExt(StringRef ArchExt);
- void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values);
- } // namespace CSKY
- } // namespace llvm
- #endif
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|