-Added API for retrieving the default FPU of a CPU from TargetParser.
[oota-llvm.git] / include / llvm / Support / TargetParser.h
1 //===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements a target parser to recognise hardware features such as
11 // FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_SUPPORT_TARGETPARSER_H
16 #define LLVM_SUPPORT_TARGETPARSER_H
17
18 // FIXME: vector is used because that's what clang uses for subtarget feature
19 // lists, but SmallVector would probably be better
20 #include <vector>
21
22 namespace llvm {
23   class StringRef;
24
25 // Target specific information into their own namespaces. These should be
26 // generated from TableGen because the information is already there, and there
27 // is where new information about targets will be added.
28 // FIXME: To TableGen this we need to make some table generated files available
29 // even if the back-end is not compiled with LLVM, plus we need to create a new
30 // back-end to TableGen to create these clean tables.
31 namespace ARM {
32   // FPU names.
33   enum FPUKind {
34     FK_INVALID = 0,
35     FK_NONE,
36     FK_VFP,
37     FK_VFPV2,
38     FK_VFPV3,
39     FK_VFPV3_FP16,
40     FK_VFPV3_D16,
41     FK_VFPV3_D16_FP16,
42     FK_VFPV3XD,
43     FK_VFPV3XD_FP16,
44     FK_VFPV4,
45     FK_VFPV4_D16,
46     FK_FPV4_SP_D16,
47     FK_FPV5_D16,
48     FK_FPV5_SP_D16,
49     FK_FP_ARMV8,
50     FK_NEON,
51     FK_NEON_FP16,
52     FK_NEON_VFPV4,
53     FK_NEON_FP_ARMV8,
54     FK_CRYPTO_NEON_FP_ARMV8,
55     FK_SOFTVFP,
56     FK_LAST
57   };
58
59   // FPU Version
60   enum FPUVersion {
61     FV_NONE = 0,
62     FV_VFPV2,
63     FV_VFPV3,
64     FV_VFPV3_FP16,
65     FV_VFPV4,
66     FV_VFPV5
67   };
68
69   // An FPU name implies one of three levels of Neon support:
70   enum NeonSupportLevel {
71     NS_None = 0, ///< No Neon
72     NS_Neon,     ///< Neon
73     NS_Crypto    ///< Neon with Crypto
74   };
75
76   // An FPU name restricts the FPU in one of three ways:
77   enum FPURestriction {
78     FR_None = 0, ///< No restriction
79     FR_D16,      ///< Only 16 D registers
80     FR_SP_D16    ///< Only single-precision instructions, with 16 D registers
81   };
82
83   // Arch names.
84   enum ArchKind {
85     AK_INVALID = 0,
86     AK_ARMV2,
87     AK_ARMV2A,
88     AK_ARMV3,
89     AK_ARMV3M,
90     AK_ARMV4,
91     AK_ARMV4T,
92     AK_ARMV5T,
93     AK_ARMV5TE,
94     AK_ARMV5TEJ,
95     AK_ARMV6,
96     AK_ARMV6K,
97     AK_ARMV6T2,
98     AK_ARMV6Z,
99     AK_ARMV6ZK,
100     AK_ARMV6M,
101     AK_ARMV6SM,
102     AK_ARMV7A,
103     AK_ARMV7R,
104     AK_ARMV7M,
105     AK_ARMV7EM,
106     AK_ARMV8A,
107     AK_ARMV8_1A,
108     // Non-standard Arch names.
109     AK_IWMMXT,
110     AK_IWMMXT2,
111     AK_XSCALE,
112     AK_ARMV5,
113     AK_ARMV5E,
114     AK_ARMV6J,
115     AK_ARMV6HL,
116     AK_ARMV7,
117     AK_ARMV7L,
118     AK_ARMV7HL,
119     AK_ARMV7S,
120     AK_LAST
121   };
122
123   // Arch extension modifiers for CPUs.
124   enum ArchExtKind {
125     AEK_INVALID = 0,
126     AEK_CRC,
127     AEK_CRYPTO,
128     AEK_FP,
129     AEK_HWDIV,
130     AEK_MP,
131     AEK_SIMD,
132     AEK_SEC,
133     AEK_VIRT,
134     // Unsupported extensions.
135     AEK_OS,
136     AEK_IWMMXT,
137     AEK_IWMMXT2,
138     AEK_MAVERICK,
139     AEK_XSCALE,
140     AEK_LAST
141   };
142
143   // ISA kinds.
144   enum ISAKind {
145     IK_INVALID = 0,
146     IK_ARM,
147     IK_THUMB,
148     IK_AARCH64
149   };
150
151   // Endianness
152   // FIXME: BE8 vs. BE32?
153   enum EndianKind {
154     EK_INVALID = 0,
155     EK_LITTLE,
156     EK_BIG
157   };
158
159   // v6/v7/v8 Profile
160   enum ProfileKind {
161     PK_INVALID = 0,
162     PK_A,
163     PK_R,
164     PK_M
165   };
166 } // namespace ARM
167
168 // Target Parsers, one per architecture.
169 class ARMTargetParser {
170   static StringRef getFPUSynonym(StringRef FPU);
171   static StringRef getArchSynonym(StringRef Arch);
172
173 public:
174   static StringRef getCanonicalArchName(StringRef Arch);
175
176   // Information by ID
177   static const char * getFPUName(unsigned FPUKind);
178   static     unsigned getFPUVersion(unsigned FPUKind);
179   static     unsigned getFPUNeonSupportLevel(unsigned FPUKind);
180   static     unsigned getFPURestriction(unsigned FPUKind);
181   static     unsigned getDefaultFPU(StringRef CPU);
182   // FIXME: This should be moved to TargetTuple once it exists
183   static       bool   getFPUFeatures(unsigned FPUKind,
184                                      std::vector<const char*> &Features);
185   static const char * getArchName(unsigned ArchKind);
186   static   unsigned   getArchAttr(unsigned ArchKind);
187   static const char * getCPUAttr(unsigned ArchKind);
188   static const char * getSubArch(unsigned ArchKind);
189   static const char * getArchExtName(unsigned ArchExtKind);
190   static const char * getDefaultCPU(StringRef Arch);
191
192   // Parser
193   static unsigned parseFPU(StringRef FPU);
194   static unsigned parseArch(StringRef Arch);
195   static unsigned parseArchExt(StringRef ArchExt);
196   static unsigned parseCPUArch(StringRef CPU);
197   static unsigned parseArchISA(StringRef Arch);
198   static unsigned parseArchEndian(StringRef Arch);
199   static unsigned parseArchProfile(StringRef Arch);
200   static unsigned parseArchVersion(StringRef Arch);
201
202 };
203
204 } // namespace llvm
205
206 #endif