CSKYTargetParser.h 5.7 KB

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