1 //===----------- TargetParser.cpp - Target Parser -------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "llvm/Support/TargetParser.h"
10 #include "llvm/ADT/STLExtras.h"
11 #include "llvm/ADT/StringExtras.h"
12 #include "llvm/Support/ARMBuildAttributes.h"
13 #include "llvm/Support/FormatVariadic.h"
14 #include "gtest/gtest.h"
20 const char *ARMArch
[] = {
21 "armv2", "armv2a", "armv3", "armv3m", "armv4",
22 "armv4t", "armv5", "armv5t", "armv5e", "armv5te",
23 "armv5tej", "armv6", "armv6j", "armv6k", "armv6hl",
24 "armv6t2", "armv6kz", "armv6z", "armv6zk", "armv6-m",
25 "armv6m", "armv6sm", "armv6s-m", "armv7-a", "armv7",
26 "armv7a", "armv7ve", "armv7hl", "armv7l", "armv7-r",
27 "armv7r", "armv7-m", "armv7m", "armv7k", "armv7s",
28 "armv7e-m", "armv7em", "armv8-a", "armv8", "armv8a",
29 "armv8l", "armv8.1-a", "armv8.1a", "armv8.2-a", "armv8.2a",
30 "armv8.3-a", "armv8.3a", "armv8.4-a", "armv8.4a", "armv8.5-a",
31 "armv8.5a", "armv8.6-a", "armv8.6a", "armv8.7-a", "armv8.7a",
32 "armv8-r", "armv8r", "armv8-m.base","armv8m.base", "armv8-m.main",
33 "armv8m.main", "iwmmxt", "iwmmxt2", "xscale", "armv8.1-m.main",
36 template <ARM::ISAKind ISAKind
>
37 std::string
FormatExtensionFlags(uint64_t Flags
) {
38 std::vector
<StringRef
> Features
;
40 if (ISAKind
== ARM::ISAKind::AARCH64
) {
41 // AEK_NONE is not meant to be shown to the user so the target parser
42 // does not recognise it. It is relevant here though.
43 if (Flags
& AArch64::AEK_NONE
)
44 Features
.push_back("none");
45 AArch64::getExtensionFeatures(Flags
, Features
);
47 if (Flags
& ARM::AEK_NONE
)
48 Features
.push_back("none");
49 ARM::getExtensionFeatures(Flags
, Features
);
52 // The target parser also includes every extension you don't have.
53 // E.g. if AEK_CRC is not set then it adds "-crc". Not useful here.
54 Features
.erase(std::remove_if(Features
.begin(), Features
.end(),
55 [](StringRef extension
) {
56 return extension
.startswith("-");
60 return llvm::join(Features
, ", ");
63 template <ARM::ISAKind ISAKind
>
64 testing::AssertionResult
65 AssertSameExtensionFlags(const char *m_expr
, const char *n_expr
,
66 uint64_t ExpectedFlags
, uint64_t GotFlags
) {
67 if (ExpectedFlags
== GotFlags
)
68 return testing::AssertionSuccess();
70 return testing::AssertionFailure() << llvm::formatv(
71 "Expected extension flags: {0} ({1:x})\n"
72 " Got extension flags: {2} ({3:x})\n",
73 FormatExtensionFlags
<ISAKind
>(ExpectedFlags
), ExpectedFlags
,
74 FormatExtensionFlags
<ISAKind
>(GotFlags
), GotFlags
);
77 struct ARMCPUTestParams
{
78 ARMCPUTestParams(StringRef CPUName
, StringRef ExpectedArch
,
79 StringRef ExpectedFPU
, uint64_t ExpectedFlags
,
81 : CPUName(CPUName
), ExpectedArch(ExpectedArch
), ExpectedFPU(ExpectedFPU
),
82 ExpectedFlags(ExpectedFlags
), CPUAttr(CPUAttr
) {}
84 friend std::ostream
&operator<<(std::ostream
&os
,
85 const ARMCPUTestParams
¶ms
) {
86 return os
<< "\"" << params
.CPUName
.str() << "\", \""
87 << params
.ExpectedArch
.str() << "\", \""
88 << params
.ExpectedFPU
.str() << "\", 0x" << std::hex
89 << params
.ExpectedFlags
<< ", \"" << params
.CPUAttr
.str() << "\"";
93 StringRef ExpectedArch
;
94 StringRef ExpectedFPU
;
95 uint64_t ExpectedFlags
;
99 class ARMCPUTestFixture
: public ::testing::TestWithParam
<ARMCPUTestParams
> {};
101 TEST_P(ARMCPUTestFixture
, ARMCPUTests
) {
102 auto params
= GetParam();
104 ARM::ArchKind AK
= ARM::parseCPUArch(params
.CPUName
);
105 EXPECT_EQ(params
.ExpectedArch
, ARM::getArchName(AK
));
107 unsigned FPUKind
= ARM::getDefaultFPU(params
.CPUName
, AK
);
108 EXPECT_EQ(params
.ExpectedFPU
, ARM::getFPUName(FPUKind
));
110 uint64_t default_extensions
= ARM::getDefaultExtensions(params
.CPUName
, AK
);
111 EXPECT_PRED_FORMAT2(AssertSameExtensionFlags
<ARM::ISAKind::ARM
>,
112 params
.ExpectedFlags
, default_extensions
);
114 EXPECT_EQ(params
.CPUAttr
, ARM::getCPUAttr(AK
));
117 // Note that we include ARM::AEK_NONE even when there are other extensions
118 // we expect. This is because the default extensions for a CPU are the sum
119 // of the default extensions for its architecture and for the CPU.
120 // So if a CPU has no extra extensions, it adds AEK_NONE.
121 INSTANTIATE_TEST_SUITE_P(
122 ARMCPUTestsPart1
, ARMCPUTestFixture
,
124 ARMCPUTestParams("invalid", "invalid", "invalid", ARM::AEK_NONE
, ""),
125 ARMCPUTestParams("generic", "invalid", "none", ARM::AEK_NONE
, ""),
127 ARMCPUTestParams("arm8", "armv4", "none", ARM::AEK_NONE
, "4"),
128 ARMCPUTestParams("arm810", "armv4", "none", ARM::AEK_NONE
, "4"),
129 ARMCPUTestParams("strongarm", "armv4", "none", ARM::AEK_NONE
, "4"),
130 ARMCPUTestParams("strongarm110", "armv4", "none", ARM::AEK_NONE
, "4"),
131 ARMCPUTestParams("strongarm1100", "armv4", "none", ARM::AEK_NONE
, "4"),
132 ARMCPUTestParams("strongarm1110", "armv4", "none", ARM::AEK_NONE
, "4"),
133 ARMCPUTestParams("arm7tdmi", "armv4t", "none", ARM::AEK_NONE
, "4T"),
134 ARMCPUTestParams("arm7tdmi-s", "armv4t", "none", ARM::AEK_NONE
, "4T"),
135 ARMCPUTestParams("arm710t", "armv4t", "none", ARM::AEK_NONE
, "4T"),
136 ARMCPUTestParams("arm720t", "armv4t", "none", ARM::AEK_NONE
, "4T"),
137 ARMCPUTestParams("arm9", "armv4t", "none", ARM::AEK_NONE
, "4T"),
138 ARMCPUTestParams("arm9tdmi", "armv4t", "none", ARM::AEK_NONE
, "4T"),
139 ARMCPUTestParams("arm920", "armv4t", "none", ARM::AEK_NONE
, "4T"),
140 ARMCPUTestParams("arm920t", "armv4t", "none", ARM::AEK_NONE
, "4T"),
141 ARMCPUTestParams("arm922t", "armv4t", "none", ARM::AEK_NONE
, "4T"),
142 ARMCPUTestParams("arm940t", "armv4t", "none", ARM::AEK_NONE
, "4T"),
143 ARMCPUTestParams("ep9312", "armv4t", "none", ARM::AEK_NONE
, "4T"),
144 ARMCPUTestParams("arm10tdmi", "armv5t", "none", ARM::AEK_NONE
, "5T"),
145 ARMCPUTestParams("arm1020t", "armv5t", "none", ARM::AEK_NONE
, "5T"),
146 ARMCPUTestParams("arm9e", "armv5te", "none",
147 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
148 ARMCPUTestParams("arm946e-s", "armv5te", "none",
149 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
150 ARMCPUTestParams("arm966e-s", "armv5te", "none",
151 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
152 ARMCPUTestParams("arm968e-s", "armv5te", "none",
153 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
154 ARMCPUTestParams("arm10e", "armv5te", "none",
155 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
156 ARMCPUTestParams("arm1020e", "armv5te", "none",
157 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
158 ARMCPUTestParams("arm1022e", "armv5te", "none",
159 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TE"),
160 ARMCPUTestParams("arm926ej-s", "armv5tej", "none",
161 ARM::AEK_NONE
| ARM::AEK_DSP
, "5TEJ"),
162 ARMCPUTestParams("arm1136j-s", "armv6", "none",
163 ARM::AEK_NONE
| ARM::AEK_DSP
, "6"),
164 ARMCPUTestParams("arm1136jf-s", "armv6", "vfpv2",
165 ARM::AEK_NONE
| ARM::AEK_DSP
, "6"),
166 ARMCPUTestParams("arm1176jz-s", "armv6kz", "none",
167 ARM::AEK_NONE
| ARM::AEK_SEC
| ARM::AEK_DSP
, "6KZ"),
168 ARMCPUTestParams("mpcore", "armv6k", "vfpv2",
169 ARM::AEK_NONE
| ARM::AEK_DSP
, "6K"),
170 ARMCPUTestParams("mpcorenovfp", "armv6k", "none",
171 ARM::AEK_NONE
| ARM::AEK_DSP
, "6K"),
172 ARMCPUTestParams("arm1176jzf-s", "armv6kz", "vfpv2",
173 ARM::AEK_NONE
| ARM::AEK_SEC
| ARM::AEK_DSP
, "6KZ"),
174 ARMCPUTestParams("arm1156t2-s", "armv6t2", "none",
175 ARM::AEK_NONE
| ARM::AEK_DSP
, "6T2"),
176 ARMCPUTestParams("arm1156t2f-s", "armv6t2", "vfpv2",
177 ARM::AEK_NONE
| ARM::AEK_DSP
, "6T2"),
178 ARMCPUTestParams("cortex-m0", "armv6-m", "none", ARM::AEK_NONE
, "6-M"),
179 ARMCPUTestParams("cortex-m0plus", "armv6-m", "none", ARM::AEK_NONE
,
181 ARMCPUTestParams("cortex-m1", "armv6-m", "none", ARM::AEK_NONE
, "6-M"),
182 ARMCPUTestParams("sc000", "armv6-m", "none", ARM::AEK_NONE
, "6-M"),
183 ARMCPUTestParams("cortex-a5", "armv7-a", "neon-vfpv4",
184 ARM::AEK_MP
| ARM::AEK_SEC
| ARM::AEK_DSP
, "7-A"),
185 ARMCPUTestParams("cortex-a7", "armv7-a", "neon-vfpv4",
186 ARM::AEK_HWDIVTHUMB
| ARM::AEK_HWDIVARM
| ARM::AEK_MP
|
187 ARM::AEK_SEC
| ARM::AEK_VIRT
| ARM::AEK_DSP
,
189 ARMCPUTestParams("cortex-a8", "armv7-a", "neon",
190 ARM::AEK_SEC
| ARM::AEK_DSP
, "7-A")));
192 // gtest in llvm has a limit of 50 test cases when using ::Values so we split
193 // them into 2 blocks
194 INSTANTIATE_TEST_SUITE_P(
195 ARMCPUTestsPart2
, ARMCPUTestFixture
,
197 ARMCPUTestParams("cortex-a9", "armv7-a", "neon-fp16",
198 ARM::AEK_MP
| ARM::AEK_SEC
| ARM::AEK_DSP
, "7-A"),
199 ARMCPUTestParams("cortex-a12", "armv7-a", "neon-vfpv4",
200 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
201 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
204 ARMCPUTestParams("cortex-a15", "armv7-a", "neon-vfpv4",
205 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
206 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
209 ARMCPUTestParams("cortex-a17", "armv7-a", "neon-vfpv4",
210 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
211 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
214 ARMCPUTestParams("krait", "armv7-a", "neon-vfpv4",
215 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
217 ARMCPUTestParams("cortex-r4", "armv7-r", "none",
218 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
220 ARMCPUTestParams("cortex-r4f", "armv7-r", "vfpv3-d16",
221 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
223 ARMCPUTestParams("cortex-r5", "armv7-r", "vfpv3-d16",
224 ARM::AEK_MP
| ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
227 ARMCPUTestParams("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
228 ARM::AEK_MP
| ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
231 ARMCPUTestParams("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
232 ARM::AEK_MP
| ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
235 ARMCPUTestParams("cortex-r52", "armv8-r", "neon-fp-armv8",
236 ARM::AEK_NONE
| ARM::AEK_CRC
| ARM::AEK_MP
|
237 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
238 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
240 ARMCPUTestParams("sc300", "armv7-m", "none",
241 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
, "7-M"),
242 ARMCPUTestParams("cortex-m3", "armv7-m", "none",
243 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
, "7-M"),
244 ARMCPUTestParams("cortex-m4", "armv7e-m", "fpv4-sp-d16",
245 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
247 ARMCPUTestParams("cortex-m7", "armv7e-m", "fpv5-d16",
248 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
250 ARMCPUTestParams("cortex-a32", "armv8-a", "crypto-neon-fp-armv8",
251 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
252 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
253 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
255 ARMCPUTestParams("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
256 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
257 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
258 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
260 ARMCPUTestParams("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
261 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
262 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
263 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
265 ARMCPUTestParams("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
266 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
267 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
268 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
269 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
271 ARMCPUTestParams("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
272 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
273 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
274 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
276 ARMCPUTestParams("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
277 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
278 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
279 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
281 ARMCPUTestParams("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
282 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
283 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
284 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
286 ARMCPUTestParams("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
287 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
288 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
289 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
290 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
292 ARMCPUTestParams("cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
293 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
294 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
295 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
296 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
298 ARMCPUTestParams("cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
299 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
300 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
301 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
302 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
304 ARMCPUTestParams("cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",
305 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
306 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
307 ARM::AEK_DSP
| ARM::AEK_CRC
| ARM::AEK_RAS
|
308 ARM::AEK_FP16
| ARM::AEK_DOTPROD
,
310 ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
311 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
312 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
313 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
314 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
316 ARMCPUTestParams("cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
317 ARM::AEK_DOTPROD
| ARM::AEK_FP16
| ARM::AEK_SEC
|
318 ARM::AEK_MP
| ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
319 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
| ARM::AEK_CRC
|
322 ARMCPUTestParams("cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
323 ARM::AEK_RAS
| ARM::AEK_FP16
| ARM::AEK_DOTPROD
|
324 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
325 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
326 ARM::AEK_DSP
| ARM::AEK_CRC
| ARM::AEK_RAS
,
328 ARMCPUTestParams("neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
329 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
330 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
331 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
332 ARM::AEK_FP16
| ARM::AEK_RAS
| ARM::AEK_DOTPROD
,
334 ARMCPUTestParams("neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
335 ARM::AEK_CRC
| ARM::AEK_HWDIVTHUMB
|
336 ARM::AEK_HWDIVARM
| ARM::AEK_MP
| ARM::AEK_SEC
|
337 ARM::AEK_VIRT
| ARM::AEK_DSP
| ARM::AEK_BF16
|
338 ARM::AEK_DOTPROD
| ARM::AEK_RAS
| ARM::AEK_I8MM
|
341 ARMCPUTestParams("neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
342 ARM::AEK_SEC
| ARM::AEK_MP
| ARM::AEK_VIRT
|
343 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
|
344 ARM::AEK_DSP
| ARM::AEK_CRC
| ARM::AEK_RAS
|
345 ARM::AEK_FP16
| ARM::AEK_BF16
| ARM::AEK_DOTPROD
,
347 ARMCPUTestParams("cyclone", "armv8-a", "crypto-neon-fp-armv8",
348 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
349 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
350 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
352 ARMCPUTestParams("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
353 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
354 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
355 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
357 ARMCPUTestParams("exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
358 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
359 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
360 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
361 ARM::AEK_DOTPROD
| ARM::AEK_FP16
| ARM::AEK_RAS
,
363 ARMCPUTestParams("exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
364 ARM::AEK_CRC
| ARM::AEK_SEC
| ARM::AEK_MP
|
365 ARM::AEK_VIRT
| ARM::AEK_HWDIVARM
|
366 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
|
367 ARM::AEK_DOTPROD
| ARM::AEK_FP16
| ARM::AEK_RAS
,
369 ARMCPUTestParams("cortex-m23", "armv8-m.base", "none",
370 ARM::AEK_NONE
| ARM::AEK_HWDIVTHUMB
, "8-M.Baseline"),
371 ARMCPUTestParams("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
372 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
, "8-M.Mainline"),
373 ARMCPUTestParams("cortex-m35p", "armv8-m.main", "fpv5-sp-d16",
374 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
, "8-M.Mainline"),
375 ARMCPUTestParams("cortex-m55", "armv8.1-m.main",
376 "fp-armv8-fullfp16-d16",
377 ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
| ARM::AEK_SIMD
|
378 ARM::AEK_FP
| ARM::AEK_RAS
| ARM::AEK_LOB
|
381 ARMCPUTestParams("iwmmxt", "iwmmxt", "none", ARM::AEK_NONE
, "iwmmxt"),
382 ARMCPUTestParams("xscale", "xscale", "none", ARM::AEK_NONE
, "xscale"),
383 ARMCPUTestParams("swift", "armv7s", "neon-vfpv4",
384 ARM::AEK_HWDIVARM
| ARM::AEK_HWDIVTHUMB
| ARM::AEK_DSP
,
387 static constexpr unsigned NumARMCPUArchs
= 86;
389 TEST(TargetParserTest
, testARMCPUArchList
) {
390 SmallVector
<StringRef
, NumARMCPUArchs
> List
;
391 ARM::fillValidCPUArchList(List
);
393 // No list exists for these in this test suite, so ensure all are
394 // valid, and match the expected 'magic' count.
395 EXPECT_EQ(List
.size(), NumARMCPUArchs
);
396 for(StringRef CPU
: List
) {
397 EXPECT_NE(ARM::parseCPUArch(CPU
), ARM::ArchKind::INVALID
);
401 TEST(TargetParserTest
, testInvalidARMArch
) {
402 auto InvalidArchStrings
= {"armv", "armv99", "noarm"};
403 for (const char* InvalidArch
: InvalidArchStrings
)
404 EXPECT_EQ(ARM::parseArch(InvalidArch
), ARM::ArchKind::INVALID
);
407 bool testARMArch(StringRef Arch
, StringRef DefaultCPU
, StringRef SubArch
,
409 ARM::ArchKind AK
= ARM::parseArch(Arch
);
410 bool Result
= (AK
!= ARM::ArchKind::INVALID
);
411 Result
&= ARM::getDefaultCPU(Arch
).equals(DefaultCPU
);
412 Result
&= ARM::getSubArch(AK
).equals(SubArch
);
413 Result
&= (ARM::getArchAttr(AK
) == ArchAttr
);
417 TEST(TargetParserTest
, testARMArch
) {
419 testARMArch("armv2", "generic", "v2", ARMBuildAttrs::CPUArch::Pre_v4
));
421 testARMArch("armv2a", "generic", "v2a", ARMBuildAttrs::CPUArch::Pre_v4
));
423 testARMArch("armv3", "generic", "v3", ARMBuildAttrs::CPUArch::Pre_v4
));
425 testARMArch("armv3m", "generic", "v3m", ARMBuildAttrs::CPUArch::Pre_v4
));
427 testARMArch("armv4", "strongarm", "v4",
428 ARMBuildAttrs::CPUArch::v4
));
430 testARMArch("armv4t", "arm7tdmi", "v4t",
431 ARMBuildAttrs::CPUArch::v4T
));
433 testARMArch("armv5t", "arm10tdmi", "v5",
434 ARMBuildAttrs::CPUArch::v5T
));
436 testARMArch("armv5te", "arm1022e", "v5e",
437 ARMBuildAttrs::CPUArch::v5TE
));
439 testARMArch("armv5tej", "arm926ej-s", "v5e",
440 ARMBuildAttrs::CPUArch::v5TEJ
));
442 testARMArch("armv6", "arm1136jf-s", "v6",
443 ARMBuildAttrs::CPUArch::v6
));
445 testARMArch("armv6k", "mpcore", "v6k",
446 ARMBuildAttrs::CPUArch::v6K
));
448 testARMArch("armv6t2", "arm1156t2-s", "v6t2",
449 ARMBuildAttrs::CPUArch::v6T2
));
451 testARMArch("armv6kz", "arm1176jzf-s", "v6kz",
452 ARMBuildAttrs::CPUArch::v6KZ
));
454 testARMArch("armv6-m", "cortex-m0", "v6m",
455 ARMBuildAttrs::CPUArch::v6_M
));
457 testARMArch("armv7-a", "generic", "v7",
458 ARMBuildAttrs::CPUArch::v7
));
460 testARMArch("armv7ve", "generic", "v7ve",
461 ARMBuildAttrs::CPUArch::v7
));
463 testARMArch("armv7-r", "cortex-r4", "v7r",
464 ARMBuildAttrs::CPUArch::v7
));
466 testARMArch("armv7-m", "cortex-m3", "v7m",
467 ARMBuildAttrs::CPUArch::v7
));
469 testARMArch("armv7e-m", "cortex-m4", "v7em",
470 ARMBuildAttrs::CPUArch::v7E_M
));
472 testARMArch("armv8-a", "generic", "v8",
473 ARMBuildAttrs::CPUArch::v8_A
));
475 testARMArch("armv8.1-a", "generic", "v8.1a",
476 ARMBuildAttrs::CPUArch::v8_A
));
478 testARMArch("armv8.2-a", "generic", "v8.2a",
479 ARMBuildAttrs::CPUArch::v8_A
));
481 testARMArch("armv8.3-a", "generic", "v8.3a",
482 ARMBuildAttrs::CPUArch::v8_A
));
484 testARMArch("armv8.4-a", "generic", "v8.4a",
485 ARMBuildAttrs::CPUArch::v8_A
));
487 testARMArch("armv8.5-a", "generic", "v8.5a",
488 ARMBuildAttrs::CPUArch::v8_A
));
490 testARMArch("armv8.6-a", "generic", "v8.6a",
491 ARMBuildAttrs::CPUArch::v8_A
));
493 testARMArch("armv8.7-a", "generic", "v8.7a",
494 ARMBuildAttrs::CPUArch::v8_A
));
496 testARMArch("armv8-r", "cortex-r52", "v8r",
497 ARMBuildAttrs::CPUArch::v8_R
));
499 testARMArch("armv8-m.base", "generic", "v8m.base",
500 ARMBuildAttrs::CPUArch::v8_M_Base
));
502 testARMArch("armv8-m.main", "generic", "v8m.main",
503 ARMBuildAttrs::CPUArch::v8_M_Main
));
505 testARMArch("armv8.1-m.main", "generic", "v8.1m.main",
506 ARMBuildAttrs::CPUArch::v8_1_M_Main
));
508 testARMArch("iwmmxt", "iwmmxt", "",
509 ARMBuildAttrs::CPUArch::v5TE
));
511 testARMArch("iwmmxt2", "generic", "",
512 ARMBuildAttrs::CPUArch::v5TE
));
514 testARMArch("xscale", "xscale", "v5e",
515 ARMBuildAttrs::CPUArch::v5TE
));
517 testARMArch("armv7s", "swift", "v7s",
518 ARMBuildAttrs::CPUArch::v7
));
520 testARMArch("armv7k", "generic", "v7k",
521 ARMBuildAttrs::CPUArch::v7
));
524 bool testARMExtension(StringRef CPUName
,ARM::ArchKind ArchKind
, StringRef ArchExt
) {
525 return ARM::getDefaultExtensions(CPUName
, ArchKind
) &
526 ARM::parseArchExt(ArchExt
);
529 TEST(TargetParserTest
, testARMExtension
) {
530 EXPECT_FALSE(testARMExtension("strongarm", ARM::ArchKind::INVALID
, "dsp"));
531 EXPECT_FALSE(testARMExtension("arm7tdmi", ARM::ArchKind::INVALID
, "dsp"));
532 EXPECT_FALSE(testARMExtension("arm10tdmi",
533 ARM::ArchKind::INVALID
, "simd"));
534 EXPECT_FALSE(testARMExtension("arm1022e", ARM::ArchKind::INVALID
, "simd"));
535 EXPECT_FALSE(testARMExtension("arm926ej-s",
536 ARM::ArchKind::INVALID
, "simd"));
537 EXPECT_FALSE(testARMExtension("arm1136jf-s",
538 ARM::ArchKind::INVALID
, "crypto"));
539 EXPECT_FALSE(testARMExtension("arm1156t2-s",
540 ARM::ArchKind::INVALID
, "crypto"));
541 EXPECT_FALSE(testARMExtension("arm1176jzf-s",
542 ARM::ArchKind::INVALID
, "crypto"));
543 EXPECT_FALSE(testARMExtension("cortex-m0",
544 ARM::ArchKind::INVALID
, "crypto"));
545 EXPECT_FALSE(testARMExtension("cortex-a8",
546 ARM::ArchKind::INVALID
, "crypto"));
547 EXPECT_FALSE(testARMExtension("cortex-r4",
548 ARM::ArchKind::INVALID
, "crypto"));
549 EXPECT_FALSE(testARMExtension("cortex-m3",
550 ARM::ArchKind::INVALID
, "crypto"));
551 EXPECT_FALSE(testARMExtension("cortex-a53",
552 ARM::ArchKind::INVALID
, "ras"));
553 EXPECT_FALSE(testARMExtension("cortex-a53",
554 ARM::ArchKind::INVALID
, "fp16"));
555 EXPECT_TRUE(testARMExtension("cortex-a55",
556 ARM::ArchKind::INVALID
, "fp16"));
557 EXPECT_FALSE(testARMExtension("cortex-a55",
558 ARM::ArchKind::INVALID
, "fp16fml"));
559 EXPECT_TRUE(testARMExtension("cortex-a75",
560 ARM::ArchKind::INVALID
, "fp16"));
561 EXPECT_FALSE(testARMExtension("cortex-a75",
562 ARM::ArchKind::INVALID
, "fp16fml"));
563 EXPECT_FALSE(testARMExtension("cortex-r52",
564 ARM::ArchKind::INVALID
, "ras"));
565 EXPECT_FALSE(testARMExtension("iwmmxt", ARM::ArchKind::INVALID
, "crc"));
566 EXPECT_FALSE(testARMExtension("xscale", ARM::ArchKind::INVALID
, "crc"));
567 EXPECT_FALSE(testARMExtension("swift", ARM::ArchKind::INVALID
, "crc"));
569 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV2
, "thumb"));
570 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV2A
, "thumb"));
571 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV3
, "thumb"));
572 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV3M
, "thumb"));
573 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4
, "dsp"));
574 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4T
, "dsp"));
575 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5T
, "simd"));
576 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TE
, "simd"));
577 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TEJ
, "simd"));
578 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6
, "crypto"));
579 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6K
, "crypto"));
580 EXPECT_FALSE(testARMExtension("generic",
581 ARM::ArchKind::ARMV6T2
, "crypto"));
582 EXPECT_FALSE(testARMExtension("generic",
583 ARM::ArchKind::ARMV6KZ
, "crypto"));
584 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6M
, "crypto"));
585 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7A
, "crypto"));
586 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7R
, "crypto"));
587 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7M
, "crypto"));
588 EXPECT_FALSE(testARMExtension("generic",
589 ARM::ArchKind::ARMV7EM
, "crypto"));
590 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8A
, "ras"));
591 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_1A
, "ras"));
592 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A
, "profile"));
593 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A
, "fp16"));
594 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A
, "fp16fml"));
595 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A
, "fp16"));
596 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A
, "fp16fml"));
597 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A
, "fp16"));
598 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A
, "fp16fml"));
599 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8R
, "ras"));
600 EXPECT_FALSE(testARMExtension("generic",
601 ARM::ArchKind::ARMV8MBaseline
, "crc"));
602 EXPECT_FALSE(testARMExtension("generic",
603 ARM::ArchKind::ARMV8MMainline
, "crc"));
604 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT
, "crc"));
605 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT2
, "crc"));
606 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::XSCALE
, "crc"));
607 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7S
, "crypto"));
608 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7K
, "crypto"));
611 TEST(TargetParserTest
, ARMFPUVersion
) {
612 for (ARM::FPUKind FK
= static_cast<ARM::FPUKind
>(0);
613 FK
<= ARM::FPUKind::FK_LAST
;
614 FK
= static_cast<ARM::FPUKind
>(static_cast<unsigned>(FK
) + 1))
615 if (FK
== ARM::FK_LAST
|| ARM::getFPUName(FK
) == "invalid" ||
616 ARM::getFPUName(FK
) == "none" || ARM::getFPUName(FK
) == "softvfp")
617 EXPECT_EQ(ARM::FPUVersion::NONE
, ARM::getFPUVersion(FK
));
619 EXPECT_NE(ARM::FPUVersion::NONE
, ARM::getFPUVersion(FK
));
622 TEST(TargetParserTest
, ARMFPUNeonSupportLevel
) {
623 for (ARM::FPUKind FK
= static_cast<ARM::FPUKind
>(0);
624 FK
<= ARM::FPUKind::FK_LAST
;
625 FK
= static_cast<ARM::FPUKind
>(static_cast<unsigned>(FK
) + 1))
626 if (FK
== ARM::FK_LAST
||
627 ARM::getFPUName(FK
).find("neon") == std::string::npos
)
628 EXPECT_EQ(ARM::NeonSupportLevel::None
,
629 ARM::getFPUNeonSupportLevel(FK
));
631 EXPECT_NE(ARM::NeonSupportLevel::None
,
632 ARM::getFPUNeonSupportLevel(FK
));
635 TEST(TargetParserTest
, ARMFPURestriction
) {
636 for (ARM::FPUKind FK
= static_cast<ARM::FPUKind
>(0);
637 FK
<= ARM::FPUKind::FK_LAST
;
638 FK
= static_cast<ARM::FPUKind
>(static_cast<unsigned>(FK
) + 1)) {
639 if (FK
== ARM::FK_LAST
||
640 (ARM::getFPUName(FK
).find("d16") == std::string::npos
&&
641 ARM::getFPUName(FK
).find("vfpv3xd") == std::string::npos
))
642 EXPECT_EQ(ARM::FPURestriction::None
, ARM::getFPURestriction(FK
));
644 EXPECT_NE(ARM::FPURestriction::None
, ARM::getFPURestriction(FK
));
648 TEST(TargetParserTest
, ARMExtensionFeatures
) {
649 std::map
<uint64_t, std::vector
<StringRef
>> Extensions
;
651 for (auto &Ext
: ARM::ARCHExtNames
) {
652 if (Ext
.Feature
&& Ext
.NegFeature
)
653 Extensions
[Ext
.ID
] = { StringRef(Ext
.Feature
),
654 StringRef(Ext
.NegFeature
) };
657 Extensions
[ARM::AEK_HWDIVARM
] = { "+hwdiv-arm", "-hwdiv-arm" };
658 Extensions
[ARM::AEK_HWDIVTHUMB
] = { "+hwdiv", "-hwdiv" };
660 std::vector
<StringRef
> Features
;
662 EXPECT_FALSE(ARM::getExtensionFeatures(ARM::AEK_INVALID
, Features
));
664 for (auto &E
: Extensions
) {
667 ARM::getExtensionFeatures(E
.first
, Features
);
668 EXPECT_TRUE(llvm::is_contained(Features
, E
.second
.at(0)));
669 EXPECT_TRUE(Extensions
.size() == Features
.size());
673 ARM::getExtensionFeatures(~E
.first
, Features
);
674 EXPECT_TRUE(llvm::is_contained(Features
, E
.second
.at(1)));
675 EXPECT_TRUE(Extensions
.size() == Features
.size());
679 TEST(TargetParserTest
, ARMFPUFeatures
) {
680 std::vector
<StringRef
> Features
;
681 for (ARM::FPUKind FK
= static_cast<ARM::FPUKind
>(0);
682 FK
<= ARM::FPUKind::FK_LAST
;
683 FK
= static_cast<ARM::FPUKind
>(static_cast<unsigned>(FK
) + 1))
684 EXPECT_TRUE((FK
== ARM::FK_INVALID
|| FK
>= ARM::FK_LAST
)
685 ? !ARM::getFPUFeatures(FK
, Features
)
686 : ARM::getFPUFeatures(FK
, Features
));
689 TEST(TargetParserTest
, ARMArchExtFeature
) {
690 const char *ArchExt
[][4] = {{"crc", "nocrc", "+crc", "-crc"},
691 {"crypto", "nocrypto", "+crypto", "-crypto"},
692 {"dsp", "nodsp", "+dsp", "-dsp"},
693 {"fp", "nofp", nullptr, nullptr},
694 {"idiv", "noidiv", nullptr, nullptr},
695 {"mp", "nomp", nullptr, nullptr},
696 {"simd", "nosimd", nullptr, nullptr},
697 {"sec", "nosec", nullptr, nullptr},
698 {"virt", "novirt", nullptr, nullptr},
699 {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
700 {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
701 {"ras", "noras", "+ras", "-ras"},
702 {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
703 {"os", "noos", nullptr, nullptr},
704 {"iwmmxt", "noiwmmxt", nullptr, nullptr},
705 {"iwmmxt2", "noiwmmxt2", nullptr, nullptr},
706 {"maverick", "maverick", nullptr, nullptr},
707 {"xscale", "noxscale", nullptr, nullptr},
708 {"sb", "nosb", "+sb", "-sb"},
709 {"i8mm", "noi8mm", "+i8mm", "-i8mm"},
710 {"mve", "nomve", "+mve", "-mve"},
711 {"mve.fp", "nomve.fp", "+mve.fp", "-mve.fp"}};
713 for (unsigned i
= 0; i
< array_lengthof(ArchExt
); i
++) {
714 EXPECT_EQ(StringRef(ArchExt
[i
][2]), ARM::getArchExtFeature(ArchExt
[i
][0]));
715 EXPECT_EQ(StringRef(ArchExt
[i
][3]), ARM::getArchExtFeature(ArchExt
[i
][1]));
720 testArchExtDependency(const char *ArchExt
,
721 const std::initializer_list
<const char *> &Expected
) {
722 std::vector
<StringRef
> Features
;
725 if (!ARM::appendArchExtFeatures("", ARM::ArchKind::ARMV8_1MMainline
, ArchExt
,
729 return llvm::all_of(Expected
, [&](StringRef Ext
) {
730 return llvm::is_contained(Features
, Ext
);
734 TEST(TargetParserTest
, ARMArchExtDependencies
) {
735 EXPECT_TRUE(testArchExtDependency("mve", {"+mve", "+dsp"}));
736 EXPECT_TRUE(testArchExtDependency("mve.fp", {"+mve.fp", "+mve", "+dsp"}));
737 EXPECT_TRUE(testArchExtDependency("nodsp", {"-dsp", "-mve", "-mve.fp"}));
738 EXPECT_TRUE(testArchExtDependency("nomve", {"-mve", "-mve.fp"}));
741 TEST(TargetParserTest
, ARMparseHWDiv
) {
742 const char *hwdiv
[] = {"thumb", "arm", "arm,thumb", "thumb,arm"};
744 for (unsigned i
= 0; i
< array_lengthof(hwdiv
); i
++)
745 EXPECT_NE(ARM::AEK_INVALID
, ARM::parseHWDiv((StringRef
)hwdiv
[i
]));
748 TEST(TargetParserTest
, ARMparseArchEndianAndISA
) {
749 const char *Arch
[] = {
750 "v2", "v2a", "v3", "v3m", "v4", "v4t", "v5", "v5t",
751 "v5e", "v5te", "v5tej", "v6", "v6j", "v6k", "v6hl", "v6t2",
752 "v6kz", "v6z", "v6zk", "v6-m", "v6m", "v6sm", "v6s-m", "v7-a",
753 "v7", "v7a", "v7ve", "v7hl", "v7l", "v7-r", "v7r", "v7-m",
754 "v7m", "v7k", "v7s", "v7e-m", "v7em", "v8-a", "v8", "v8a",
755 "v8l", "v8.1-a", "v8.1a", "v8.2-a", "v8.2a", "v8.3-a", "v8.3a", "v8.4-a",
756 "v8.4a", "v8.5-a","v8.5a", "v8.6-a", "v8.6a", "v8.7-a", "v8.7a", "v8-r",
757 "v8m.base", "v8m.main", "v8.1m.main"
760 for (unsigned i
= 0; i
< array_lengthof(Arch
); i
++) {
761 std::string arm_1
= "armeb" + (std::string
)(Arch
[i
]);
762 std::string arm_2
= "arm" + (std::string
)(Arch
[i
]) + "eb";
763 std::string arm_3
= "arm" + (std::string
)(Arch
[i
]);
764 std::string thumb_1
= "thumbeb" + (std::string
)(Arch
[i
]);
765 std::string thumb_2
= "thumb" + (std::string
)(Arch
[i
]) + "eb";
766 std::string thumb_3
= "thumb" + (std::string
)(Arch
[i
]);
768 EXPECT_EQ(ARM::EndianKind::BIG
, ARM::parseArchEndian(arm_1
));
769 EXPECT_EQ(ARM::EndianKind::BIG
, ARM::parseArchEndian(arm_2
));
770 EXPECT_EQ(ARM::EndianKind::LITTLE
, ARM::parseArchEndian(arm_3
));
772 EXPECT_EQ(ARM::ISAKind::ARM
, ARM::parseArchISA(arm_1
));
773 EXPECT_EQ(ARM::ISAKind::ARM
, ARM::parseArchISA(arm_2
));
774 EXPECT_EQ(ARM::ISAKind::ARM
, ARM::parseArchISA(arm_3
));
776 EXPECT_EQ(ARM::EndianKind::BIG
, ARM::parseArchEndian(thumb_1
));
777 EXPECT_EQ(ARM::EndianKind::BIG
, ARM::parseArchEndian(thumb_2
));
778 EXPECT_EQ(ARM::EndianKind::LITTLE
, ARM::parseArchEndian(thumb_3
));
780 EXPECT_EQ(ARM::ISAKind::THUMB
, ARM::parseArchISA(thumb_1
));
781 EXPECT_EQ(ARM::ISAKind::THUMB
, ARM::parseArchISA(thumb_2
));
782 EXPECT_EQ(ARM::ISAKind::THUMB
, ARM::parseArchISA(thumb_3
));
786 EXPECT_EQ(ARM::EndianKind::LITTLE
, ARM::parseArchEndian("aarch64"));
787 EXPECT_EQ(ARM::EndianKind::LITTLE
, ARM::parseArchEndian("arm64_32"));
788 EXPECT_EQ(ARM::EndianKind::BIG
, ARM::parseArchEndian("aarch64_be"));
790 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("aarch64"));
791 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("aarch64_be"));
792 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("arm64"));
793 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("arm64_be"));
794 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("arm64_32"));
795 EXPECT_EQ(ARM::ISAKind::AARCH64
, ARM::parseArchISA("aarch64_32"));
798 TEST(TargetParserTest
, ARMparseArchProfile
) {
799 for (unsigned i
= 0; i
< array_lengthof(ARMArch
); i
++) {
800 switch (ARM::parseArch(ARMArch
[i
])) {
801 case ARM::ArchKind::ARMV6M
:
802 case ARM::ArchKind::ARMV7M
:
803 case ARM::ArchKind::ARMV7EM
:
804 case ARM::ArchKind::ARMV8MMainline
:
805 case ARM::ArchKind::ARMV8MBaseline
:
806 case ARM::ArchKind::ARMV8_1MMainline
:
807 EXPECT_EQ(ARM::ProfileKind::M
, ARM::parseArchProfile(ARMArch
[i
]));
809 case ARM::ArchKind::ARMV7R
:
810 case ARM::ArchKind::ARMV8R
:
811 EXPECT_EQ(ARM::ProfileKind::R
, ARM::parseArchProfile(ARMArch
[i
]));
813 case ARM::ArchKind::ARMV7A
:
814 case ARM::ArchKind::ARMV7VE
:
815 case ARM::ArchKind::ARMV7K
:
816 case ARM::ArchKind::ARMV8A
:
817 case ARM::ArchKind::ARMV8_1A
:
818 case ARM::ArchKind::ARMV8_2A
:
819 case ARM::ArchKind::ARMV8_3A
:
820 case ARM::ArchKind::ARMV8_4A
:
821 case ARM::ArchKind::ARMV8_5A
:
822 case ARM::ArchKind::ARMV8_6A
:
823 case ARM::ArchKind::ARMV8_7A
:
824 EXPECT_EQ(ARM::ProfileKind::A
, ARM::parseArchProfile(ARMArch
[i
]));
827 EXPECT_EQ(ARM::ProfileKind::INVALID
, ARM::parseArchProfile(ARMArch
[i
]));
833 TEST(TargetParserTest
, ARMparseArchVersion
) {
834 for (unsigned i
= 0; i
< array_lengthof(ARMArch
); i
++)
835 if (((std::string
)ARMArch
[i
]).substr(0, 4) == "armv")
836 EXPECT_EQ((ARMArch
[i
][4] - 48u), ARM::parseArchVersion(ARMArch
[i
]));
838 EXPECT_EQ(5u, ARM::parseArchVersion(ARMArch
[i
]));
841 class AArch64CPUTestFixture
842 : public ::testing::TestWithParam
<ARMCPUTestParams
> {};
844 TEST_P(AArch64CPUTestFixture
, testAArch64CPU
) {
845 ARMCPUTestParams params
= GetParam();
847 AArch64::ArchKind AK
= AArch64::parseCPUArch(params
.CPUName
);
848 EXPECT_EQ(params
.ExpectedArch
, AArch64::getArchName(AK
));
850 uint64_t default_extensions
=
851 AArch64::getDefaultExtensions(params
.CPUName
, AK
);
852 EXPECT_PRED_FORMAT2(AssertSameExtensionFlags
<ARM::ISAKind::AARCH64
>,
853 params
.ExpectedFlags
, default_extensions
);
855 unsigned FPUKind
= AArch64::getDefaultFPU(params
.CPUName
, AK
);
856 EXPECT_EQ(params
.ExpectedFPU
, ARM::getFPUName(FPUKind
));
858 EXPECT_EQ(params
.CPUAttr
, AArch64::getCPUAttr(AK
));
861 INSTANTIATE_TEST_SUITE_P(
862 AArch64CPUTests
, AArch64CPUTestFixture
,
864 ARMCPUTestParams("invalid", "invalid", "invalid", AArch64::AEK_NONE
,
866 ARMCPUTestParams("generic", "invalid", "none", AArch64::AEK_NONE
, ""),
868 ARMCPUTestParams("cortex-a34", "armv8-a", "crypto-neon-fp-armv8",
869 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
870 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
872 ARMCPUTestParams("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
873 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
874 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
876 ARMCPUTestParams("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
877 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
878 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
880 ARMCPUTestParams("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
881 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
882 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
883 AArch64::AEK_RAS
| AArch64::AEK_LSE
|
884 AArch64::AEK_RDM
| AArch64::AEK_FP16
|
885 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
,
887 ARMCPUTestParams("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
888 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
889 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
891 ARMCPUTestParams("cortex-a65", "armv8.2-a", "crypto-neon-fp-armv8",
892 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
893 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
894 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
895 AArch64::AEK_RAS
| AArch64::AEK_RCPC
|
896 AArch64::AEK_RDM
| AArch64::AEK_SIMD
|
899 ARMCPUTestParams("cortex-a65ae", "armv8.2-a", "crypto-neon-fp-armv8",
900 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
901 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
902 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
903 AArch64::AEK_RAS
| AArch64::AEK_RCPC
|
904 AArch64::AEK_RDM
| AArch64::AEK_SIMD
|
907 ARMCPUTestParams("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
908 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
909 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
911 ARMCPUTestParams("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
912 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
913 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
915 ARMCPUTestParams("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
916 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
917 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
918 AArch64::AEK_RAS
| AArch64::AEK_LSE
|
919 AArch64::AEK_RDM
| AArch64::AEK_FP16
|
920 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
,
922 ARMCPUTestParams("cortex-a76", "armv8.2-a", "crypto-neon-fp-armv8",
923 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
924 AArch64::AEK_FP
| AArch64::AEK_RDM
|
925 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
926 AArch64::AEK_LSE
| AArch64::AEK_FP16
|
927 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
930 ARMCPUTestParams("cortex-a76ae", "armv8.2-a", "crypto-neon-fp-armv8",
931 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
932 AArch64::AEK_FP
| AArch64::AEK_RDM
|
933 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
934 AArch64::AEK_LSE
| AArch64::AEK_FP16
|
935 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
938 ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",
939 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
940 AArch64::AEK_FP
| AArch64::AEK_RDM
|
941 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
942 AArch64::AEK_LSE
| AArch64::AEK_FP16
|
943 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
946 ARMCPUTestParams("cortex-a78", "armv8.2-a", "crypto-neon-fp-armv8",
947 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
948 AArch64::AEK_FP
| AArch64::AEK_RDM
|
949 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
950 AArch64::AEK_LSE
| AArch64::AEK_FP16
|
951 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
954 ARMCPUTestParams("cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",
955 AArch64::AEK_RAS
| AArch64::AEK_CRC
|
956 AArch64::AEK_CRYPTO
| AArch64::AEK_FP
|
957 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
958 AArch64::AEK_LSE
| AArch64::AEK_RDM
|
959 AArch64::AEK_FP16
| AArch64::AEK_DOTPROD
|
960 AArch64::AEK_RCPC
| AArch64::AEK_SSBS
,
963 "neoverse-v1", "armv8.4-a", "crypto-neon-fp-armv8",
964 AArch64::AEK_RAS
| AArch64::AEK_SVE
| AArch64::AEK_SSBS
|
965 AArch64::AEK_RCPC
| AArch64::AEK_CRC
| AArch64::AEK_FP
|
966 AArch64::AEK_SIMD
| AArch64::AEK_RAS
| AArch64::AEK_LSE
|
967 AArch64::AEK_RDM
| AArch64::AEK_RCPC
| AArch64::AEK_DOTPROD
|
968 AArch64::AEK_CRYPTO
| AArch64::AEK_FP16
| AArch64::AEK_BF16
,
970 ARMCPUTestParams("cortex-r82", "armv8-r", "crypto-neon-fp-armv8",
971 AArch64::AEK_CRC
| AArch64::AEK_RDM
|
972 AArch64::AEK_SSBS
| AArch64::AEK_DOTPROD
|
973 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
974 AArch64::AEK_FP16
| AArch64::AEK_FP16FML
|
975 AArch64::AEK_RAS
| AArch64::AEK_RCPC
|
976 AArch64::AEK_LSE
| AArch64::AEK_SB
,
978 ARMCPUTestParams("cortex-x1", "armv8.2-a", "crypto-neon-fp-armv8",
979 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
980 AArch64::AEK_FP
| AArch64::AEK_RDM
|
981 AArch64::AEK_SIMD
| AArch64::AEK_RAS
|
982 AArch64::AEK_LSE
| AArch64::AEK_FP16
|
983 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
986 ARMCPUTestParams("cyclone", "armv8-a", "crypto-neon-fp-armv8",
987 AArch64::AEK_NONE
| AArch64::AEK_CRYPTO
|
988 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
990 ARMCPUTestParams("apple-a7", "armv8-a", "crypto-neon-fp-armv8",
991 AArch64::AEK_NONE
| AArch64::AEK_CRYPTO
|
992 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
994 ARMCPUTestParams("apple-a8", "armv8-a", "crypto-neon-fp-armv8",
995 AArch64::AEK_NONE
| AArch64::AEK_CRYPTO
|
996 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
998 ARMCPUTestParams("apple-a9", "armv8-a", "crypto-neon-fp-armv8",
999 AArch64::AEK_NONE
| AArch64::AEK_CRYPTO
|
1000 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
1002 ARMCPUTestParams("apple-a10", "armv8-a", "crypto-neon-fp-armv8",
1003 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1004 AArch64::AEK_FP
| AArch64::AEK_RDM
|
1007 ARMCPUTestParams("apple-a11", "armv8.2-a", "crypto-neon-fp-armv8",
1008 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1009 AArch64::AEK_FP
| AArch64::AEK_LSE
|
1010 AArch64::AEK_RAS
| AArch64::AEK_RDM
|
1011 AArch64::AEK_SIMD
| AArch64::AEK_FP16
,
1013 ARMCPUTestParams("apple-a12", "armv8.3-a", "crypto-neon-fp-armv8",
1014 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1015 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1016 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1017 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1020 ARMCPUTestParams("apple-a13", "armv8.4-a", "crypto-neon-fp-armv8",
1021 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1022 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1023 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1024 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1025 AArch64::AEK_DOTPROD
| AArch64::AEK_FP16
|
1026 AArch64::AEK_FP16FML
,
1028 ARMCPUTestParams("apple-a14", "armv8.5-a", "crypto-neon-fp-armv8",
1029 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1030 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1031 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1032 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1033 AArch64::AEK_DOTPROD
| AArch64::AEK_FP16
|
1034 AArch64::AEK_FP16FML
,
1036 ARMCPUTestParams("apple-m1", "armv8.5-a", "crypto-neon-fp-armv8",
1037 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1038 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1039 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1040 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1041 AArch64::AEK_DOTPROD
| AArch64::AEK_FP16
|
1042 AArch64::AEK_FP16FML
,
1044 ARMCPUTestParams("apple-s4", "armv8.3-a", "crypto-neon-fp-armv8",
1045 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1046 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1047 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1048 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1051 ARMCPUTestParams("apple-s5", "armv8.3-a", "crypto-neon-fp-armv8",
1052 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1053 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1054 AArch64::AEK_LSE
| AArch64::AEK_RAS
|
1055 AArch64::AEK_RDM
| AArch64::AEK_RCPC
|
1058 ARMCPUTestParams("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
1059 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1060 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
1062 ARMCPUTestParams("exynos-m4", "armv8.2-a", "crypto-neon-fp-armv8",
1063 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1064 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
1065 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
1066 AArch64::AEK_RAS
| AArch64::AEK_RDM
|
1069 ARMCPUTestParams("exynos-m5", "armv8.2-a", "crypto-neon-fp-armv8",
1070 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1071 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
1072 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
1073 AArch64::AEK_RAS
| AArch64::AEK_RDM
|
1076 ARMCPUTestParams("falkor", "armv8-a", "crypto-neon-fp-armv8",
1077 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1078 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1081 ARMCPUTestParams("kryo", "armv8-a", "crypto-neon-fp-armv8",
1082 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1083 AArch64::AEK_FP
| AArch64::AEK_SIMD
,
1085 ARMCPUTestParams("neoverse-e1", "armv8.2-a", "crypto-neon-fp-armv8",
1086 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1087 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
1088 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
1089 AArch64::AEK_RAS
| AArch64::AEK_RCPC
|
1090 AArch64::AEK_RDM
| AArch64::AEK_SIMD
|
1093 ARMCPUTestParams("neoverse-n1", "armv8.2-a", "crypto-neon-fp-armv8",
1094 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1095 AArch64::AEK_DOTPROD
| AArch64::AEK_FP
|
1096 AArch64::AEK_FP16
| AArch64::AEK_LSE
|
1097 AArch64::AEK_PROFILE
| AArch64::AEK_RAS
|
1098 AArch64::AEK_RCPC
| AArch64::AEK_RDM
|
1099 AArch64::AEK_SIMD
| AArch64::AEK_SSBS
,
1101 ARMCPUTestParams("neoverse-n2", "armv8.5-a", "crypto-neon-fp-armv8",
1102 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1103 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1104 AArch64::AEK_FP16
| AArch64::AEK_RAS
|
1105 AArch64::AEK_LSE
| AArch64::AEK_SVE
|
1106 AArch64::AEK_DOTPROD
| AArch64::AEK_RCPC
|
1107 AArch64::AEK_RDM
| AArch64::AEK_MTE
|
1108 AArch64::AEK_SSBS
| AArch64::AEK_SB
|
1109 AArch64::AEK_SVE2
| AArch64::AEK_SVE2BITPERM
|
1110 AArch64::AEK_BF16
| AArch64::AEK_I8MM
,
1112 ARMCPUTestParams("thunderx2t99", "armv8.1-a", "crypto-neon-fp-armv8",
1113 AArch64::AEK_NONE
| AArch64::AEK_CRC
|
1114 AArch64::AEK_CRYPTO
| AArch64::AEK_LSE
|
1115 AArch64::AEK_RDM
| AArch64::AEK_FP
|
1118 ARMCPUTestParams("thunderx3t110", "armv8.3-a", "crypto-neon-fp-armv8",
1119 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1120 AArch64::AEK_LSE
| AArch64::AEK_RDM
|
1121 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1122 AArch64::AEK_PROFILE
| AArch64::AEK_RAS
|
1123 AArch64::AEK_RAND
| AArch64::AEK_RCPC
,
1125 ARMCPUTestParams("thunderx", "armv8-a", "crypto-neon-fp-armv8",
1126 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1127 AArch64::AEK_SIMD
| AArch64::AEK_FP
|
1128 AArch64::AEK_PROFILE
,
1130 ARMCPUTestParams("thunderxt81", "armv8-a", "crypto-neon-fp-armv8",
1131 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1132 AArch64::AEK_SIMD
| AArch64::AEK_FP
|
1133 AArch64::AEK_PROFILE
,
1135 ARMCPUTestParams("thunderxt83", "armv8-a", "crypto-neon-fp-armv8",
1136 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1137 AArch64::AEK_SIMD
| AArch64::AEK_FP
|
1138 AArch64::AEK_PROFILE
,
1140 ARMCPUTestParams("thunderxt88", "armv8-a", "crypto-neon-fp-armv8",
1141 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1142 AArch64::AEK_SIMD
| AArch64::AEK_FP
|
1143 AArch64::AEK_PROFILE
,
1145 ARMCPUTestParams("tsv110", "armv8.2-a", "crypto-neon-fp-armv8",
1146 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1147 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1148 AArch64::AEK_RAS
| AArch64::AEK_LSE
|
1149 AArch64::AEK_RDM
| AArch64::AEK_PROFILE
|
1150 AArch64::AEK_FP16
| AArch64::AEK_FP16FML
|
1151 AArch64::AEK_DOTPROD
,
1153 ARMCPUTestParams("a64fx", "armv8.2-a", "crypto-neon-fp-armv8",
1154 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1155 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1156 AArch64::AEK_FP16
| AArch64::AEK_RAS
|
1157 AArch64::AEK_LSE
| AArch64::AEK_SVE
|
1160 ARMCPUTestParams("carmel", "armv8.2-a", "crypto-neon-fp-armv8",
1161 AArch64::AEK_CRC
| AArch64::AEK_CRYPTO
|
1162 AArch64::AEK_FP
| AArch64::AEK_SIMD
|
1163 AArch64::AEK_FP16
| AArch64::AEK_RAS
|
1164 AArch64::AEK_LSE
| AArch64::AEK_RDM
,
1167 static constexpr unsigned NumAArch64CPUArchs
= 48;
1169 TEST(TargetParserTest
, testAArch64CPUArchList
) {
1170 SmallVector
<StringRef
, NumAArch64CPUArchs
> List
;
1171 AArch64::fillValidCPUArchList(List
);
1173 // No list exists for these in this test suite, so ensure all are
1174 // valid, and match the expected 'magic' count.
1175 EXPECT_EQ(List
.size(), NumAArch64CPUArchs
);
1176 for(StringRef CPU
: List
) {
1177 EXPECT_NE(AArch64::parseCPUArch(CPU
), AArch64::ArchKind::INVALID
);
1181 bool testAArch64Arch(StringRef Arch
, StringRef DefaultCPU
, StringRef SubArch
,
1182 unsigned ArchAttr
) {
1183 AArch64::ArchKind AK
= AArch64::parseArch(Arch
);
1184 return (AK
!= AArch64::ArchKind::INVALID
) &
1185 AArch64::getDefaultCPU(Arch
).equals(DefaultCPU
) &
1186 AArch64::getSubArch(AK
).equals(SubArch
) &
1187 (AArch64::getArchAttr(AK
) == ArchAttr
);
1190 TEST(TargetParserTest
, testAArch64Arch
) {
1191 EXPECT_TRUE(testAArch64Arch("armv8-a", "cortex-a53", "v8",
1192 ARMBuildAttrs::CPUArch::v8_A
));
1193 EXPECT_TRUE(testAArch64Arch("armv8.1-a", "generic", "v8.1a",
1194 ARMBuildAttrs::CPUArch::v8_A
));
1195 EXPECT_TRUE(testAArch64Arch("armv8.2-a", "generic", "v8.2a",
1196 ARMBuildAttrs::CPUArch::v8_A
));
1197 EXPECT_TRUE(testAArch64Arch("armv8.3-a", "generic", "v8.3a",
1198 ARMBuildAttrs::CPUArch::v8_A
));
1199 EXPECT_TRUE(testAArch64Arch("armv8.4-a", "generic", "v8.4a",
1200 ARMBuildAttrs::CPUArch::v8_A
));
1201 EXPECT_TRUE(testAArch64Arch("armv8.5-a", "generic", "v8.5a",
1202 ARMBuildAttrs::CPUArch::v8_A
));
1203 EXPECT_TRUE(testAArch64Arch("armv8.6-a", "generic", "v8.6a",
1204 ARMBuildAttrs::CPUArch::v8_A
));
1205 EXPECT_TRUE(testAArch64Arch("armv8.7-a", "generic", "v8.7a",
1206 ARMBuildAttrs::CPUArch::v8_A
));
1209 bool testAArch64Extension(StringRef CPUName
, AArch64::ArchKind AK
,
1210 StringRef ArchExt
) {
1211 return AArch64::getDefaultExtensions(CPUName
, AK
) &
1212 AArch64::parseArchExt(ArchExt
);
1215 TEST(TargetParserTest
, testAArch64Extension
) {
1216 EXPECT_FALSE(testAArch64Extension("cortex-a34",
1217 AArch64::ArchKind::INVALID
, "ras"));
1218 EXPECT_FALSE(testAArch64Extension("cortex-a35",
1219 AArch64::ArchKind::INVALID
, "ras"));
1220 EXPECT_FALSE(testAArch64Extension("cortex-a53",
1221 AArch64::ArchKind::INVALID
, "ras"));
1222 EXPECT_TRUE(testAArch64Extension("cortex-a55",
1223 AArch64::ArchKind::INVALID
, "ras"));
1224 EXPECT_TRUE(testAArch64Extension("cortex-a55",
1225 AArch64::ArchKind::INVALID
, "fp16"));
1226 EXPECT_FALSE(testAArch64Extension("cortex-a55",
1227 AArch64::ArchKind::INVALID
, "fp16fml"));
1228 EXPECT_TRUE(testAArch64Extension("cortex-a55",
1229 AArch64::ArchKind::INVALID
, "dotprod"));
1230 EXPECT_FALSE(testAArch64Extension("cortex-a57",
1231 AArch64::ArchKind::INVALID
, "ras"));
1232 EXPECT_FALSE(testAArch64Extension("cortex-a72",
1233 AArch64::ArchKind::INVALID
, "ras"));
1234 EXPECT_FALSE(testAArch64Extension("cortex-a73",
1235 AArch64::ArchKind::INVALID
, "ras"));
1236 EXPECT_TRUE(testAArch64Extension("cortex-a75",
1237 AArch64::ArchKind::INVALID
, "ras"));
1238 EXPECT_TRUE(testAArch64Extension("cortex-a75",
1239 AArch64::ArchKind::INVALID
, "fp16"));
1240 EXPECT_FALSE(testAArch64Extension("cortex-a75",
1241 AArch64::ArchKind::INVALID
, "fp16fml"));
1242 EXPECT_TRUE(testAArch64Extension("cortex-a75",
1243 AArch64::ArchKind::INVALID
, "dotprod"));
1244 EXPECT_TRUE(testAArch64Extension("cortex-r82",
1245 AArch64::ArchKind::INVALID
, "ras"));
1246 EXPECT_TRUE(testAArch64Extension("cortex-r82",
1247 AArch64::ArchKind::INVALID
, "fp16"));
1248 EXPECT_TRUE(testAArch64Extension("cortex-r82",
1249 AArch64::ArchKind::INVALID
, "fp16fml"));
1250 EXPECT_TRUE(testAArch64Extension("cortex-r82",
1251 AArch64::ArchKind::INVALID
, "dotprod"));
1252 EXPECT_TRUE(testAArch64Extension("cortex-r82",
1253 AArch64::ArchKind::INVALID
, "lse"));
1254 EXPECT_FALSE(testAArch64Extension("cyclone",
1255 AArch64::ArchKind::INVALID
, "ras"));
1256 EXPECT_FALSE(testAArch64Extension("exynos-m3",
1257 AArch64::ArchKind::INVALID
, "ras"));
1258 EXPECT_TRUE(testAArch64Extension("exynos-m4",
1259 AArch64::ArchKind::INVALID
, "dotprod"));
1260 EXPECT_TRUE(testAArch64Extension("exynos-m4",
1261 AArch64::ArchKind::INVALID
, "fp16"));
1262 EXPECT_TRUE(testAArch64Extension("exynos-m4",
1263 AArch64::ArchKind::INVALID
, "lse"));
1264 EXPECT_TRUE(testAArch64Extension("exynos-m4",
1265 AArch64::ArchKind::INVALID
, "ras"));
1266 EXPECT_TRUE(testAArch64Extension("exynos-m4",
1267 AArch64::ArchKind::INVALID
, "rdm"));
1268 EXPECT_TRUE(testAArch64Extension("exynos-m5",
1269 AArch64::ArchKind::INVALID
, "dotprod"));
1270 EXPECT_TRUE(testAArch64Extension("exynos-m5",
1271 AArch64::ArchKind::INVALID
, "fp16"));
1272 EXPECT_TRUE(testAArch64Extension("exynos-m5",
1273 AArch64::ArchKind::INVALID
, "lse"));
1274 EXPECT_TRUE(testAArch64Extension("exynos-m5",
1275 AArch64::ArchKind::INVALID
, "ras"));
1276 EXPECT_TRUE(testAArch64Extension("exynos-m5",
1277 AArch64::ArchKind::INVALID
, "rdm"));
1278 EXPECT_TRUE(testAArch64Extension("falkor",
1279 AArch64::ArchKind::INVALID
, "rdm"));
1280 EXPECT_FALSE(testAArch64Extension("kryo",
1281 AArch64::ArchKind::INVALID
, "ras"));
1282 EXPECT_TRUE(testAArch64Extension("saphira",
1283 AArch64::ArchKind::INVALID
, "crc"));
1284 EXPECT_TRUE(testAArch64Extension("saphira",
1285 AArch64::ArchKind::INVALID
, "lse"));
1286 EXPECT_TRUE(testAArch64Extension("saphira",
1287 AArch64::ArchKind::INVALID
, "rdm"));
1288 EXPECT_TRUE(testAArch64Extension("saphira",
1289 AArch64::ArchKind::INVALID
, "ras"));
1290 EXPECT_TRUE(testAArch64Extension("saphira",
1291 AArch64::ArchKind::INVALID
, "rcpc"));
1292 EXPECT_TRUE(testAArch64Extension("saphira",
1293 AArch64::ArchKind::INVALID
, "profile"));
1294 EXPECT_FALSE(testAArch64Extension("saphira",
1295 AArch64::ArchKind::INVALID
, "fp16"));
1296 EXPECT_FALSE(testAArch64Extension("thunderx2t99",
1297 AArch64::ArchKind::INVALID
, "ras"));
1298 EXPECT_FALSE(testAArch64Extension("thunderx",
1299 AArch64::ArchKind::INVALID
, "lse"));
1300 EXPECT_FALSE(testAArch64Extension("thunderxt81",
1301 AArch64::ArchKind::INVALID
, "lse"));
1302 EXPECT_FALSE(testAArch64Extension("thunderxt83",
1303 AArch64::ArchKind::INVALID
, "lse"));
1304 EXPECT_FALSE(testAArch64Extension("thunderxt88",
1305 AArch64::ArchKind::INVALID
, "lse"));
1306 EXPECT_TRUE(testAArch64Extension("tsv110",
1307 AArch64::ArchKind::INVALID
, "crypto"));
1308 EXPECT_FALSE(testAArch64Extension("tsv110",
1309 AArch64::ArchKind::INVALID
, "sha3"));
1310 EXPECT_FALSE(testAArch64Extension("tsv110",
1311 AArch64::ArchKind::INVALID
, "sm4"));
1312 EXPECT_TRUE(testAArch64Extension("tsv110",
1313 AArch64::ArchKind::INVALID
, "ras"));
1314 EXPECT_TRUE(testAArch64Extension("tsv110",
1315 AArch64::ArchKind::INVALID
, "profile"));
1316 EXPECT_TRUE(testAArch64Extension("tsv110",
1317 AArch64::ArchKind::INVALID
, "fp16"));
1318 EXPECT_TRUE(testAArch64Extension("tsv110",
1319 AArch64::ArchKind::INVALID
, "fp16fml"));
1320 EXPECT_TRUE(testAArch64Extension("tsv110",
1321 AArch64::ArchKind::INVALID
, "dotprod"));
1322 EXPECT_TRUE(testAArch64Extension("a64fx",
1323 AArch64::ArchKind::INVALID
, "fp16"));
1324 EXPECT_TRUE(testAArch64Extension("a64fx",
1325 AArch64::ArchKind::INVALID
, "sve"));
1326 EXPECT_FALSE(testAArch64Extension("a64fx",
1327 AArch64::ArchKind::INVALID
, "sve2"));
1329 testAArch64Extension("carmel", AArch64::ArchKind::INVALID
, "crypto"));
1331 testAArch64Extension("carmel", AArch64::ArchKind::INVALID
, "fp16"));
1333 EXPECT_FALSE(testAArch64Extension(
1334 "generic", AArch64::ArchKind::ARMV8A
, "ras"));
1335 EXPECT_FALSE(testAArch64Extension(
1336 "generic", AArch64::ArchKind::ARMV8_1A
, "ras"));
1337 EXPECT_FALSE(testAArch64Extension(
1338 "generic", AArch64::ArchKind::ARMV8_2A
, "profile"));
1339 EXPECT_FALSE(testAArch64Extension(
1340 "generic", AArch64::ArchKind::ARMV8_2A
, "fp16"));
1341 EXPECT_FALSE(testAArch64Extension(
1342 "generic", AArch64::ArchKind::ARMV8_2A
, "fp16fml"));
1343 EXPECT_FALSE(testAArch64Extension(
1344 "generic", AArch64::ArchKind::ARMV8_3A
, "fp16"));
1345 EXPECT_FALSE(testAArch64Extension(
1346 "generic", AArch64::ArchKind::ARMV8_3A
, "fp16fml"));
1347 EXPECT_FALSE(testAArch64Extension(
1348 "generic", AArch64::ArchKind::ARMV8_4A
, "fp16"));
1349 EXPECT_FALSE(testAArch64Extension(
1350 "generic", AArch64::ArchKind::ARMV8_4A
, "fp16fml"));
1353 TEST(TargetParserTest
, AArch64ExtensionFeatures
) {
1354 std::vector
<uint64_t> Extensions
= {
1355 AArch64::AEK_CRC
, AArch64::AEK_CRYPTO
,
1356 AArch64::AEK_FP
, AArch64::AEK_SIMD
,
1357 AArch64::AEK_FP16
, AArch64::AEK_PROFILE
,
1358 AArch64::AEK_RAS
, AArch64::AEK_LSE
,
1359 AArch64::AEK_RDM
, AArch64::AEK_DOTPROD
,
1360 AArch64::AEK_SVE
, AArch64::AEK_SVE2
,
1361 AArch64::AEK_SVE2AES
, AArch64::AEK_SVE2SM4
,
1362 AArch64::AEK_SVE2SHA3
, AArch64::AEK_SVE2BITPERM
,
1363 AArch64::AEK_RCPC
, AArch64::AEK_FP16FML
,
1364 AArch64::AEK_SME
, AArch64::AEK_SMEF64
,
1365 AArch64::AEK_SMEI64
};
1367 std::vector
<StringRef
> Features
;
1369 uint64_t ExtVal
= 0;
1370 for (auto Ext
: Extensions
)
1373 EXPECT_FALSE(AArch64::getExtensionFeatures(AArch64::AEK_INVALID
, Features
));
1374 EXPECT_TRUE(!Features
.size());
1376 AArch64::getExtensionFeatures(ExtVal
, Features
);
1377 EXPECT_TRUE(Extensions
.size() == Features
.size());
1379 EXPECT_TRUE(llvm::is_contained(Features
, "+crc"));
1380 EXPECT_TRUE(llvm::is_contained(Features
, "+crypto"));
1381 EXPECT_TRUE(llvm::is_contained(Features
, "+fp-armv8"));
1382 EXPECT_TRUE(llvm::is_contained(Features
, "+neon"));
1383 EXPECT_TRUE(llvm::is_contained(Features
, "+fullfp16"));
1384 EXPECT_TRUE(llvm::is_contained(Features
, "+spe"));
1385 EXPECT_TRUE(llvm::is_contained(Features
, "+ras"));
1386 EXPECT_TRUE(llvm::is_contained(Features
, "+lse"));
1387 EXPECT_TRUE(llvm::is_contained(Features
, "+rdm"));
1388 EXPECT_TRUE(llvm::is_contained(Features
, "+dotprod"));
1389 EXPECT_TRUE(llvm::is_contained(Features
, "+rcpc"));
1390 EXPECT_TRUE(llvm::is_contained(Features
, "+fp16fml"));
1391 EXPECT_TRUE(llvm::is_contained(Features
, "+sve"));
1392 EXPECT_TRUE(llvm::is_contained(Features
, "+sve2"));
1393 EXPECT_TRUE(llvm::is_contained(Features
, "+sve2-aes"));
1394 EXPECT_TRUE(llvm::is_contained(Features
, "+sve2-sm4"));
1395 EXPECT_TRUE(llvm::is_contained(Features
, "+sve2-sha3"));
1396 EXPECT_TRUE(llvm::is_contained(Features
, "+sve2-bitperm"));
1397 EXPECT_TRUE(llvm::is_contained(Features
, "+sme"));
1398 EXPECT_TRUE(llvm::is_contained(Features
, "+sme-f64"));
1399 EXPECT_TRUE(llvm::is_contained(Features
, "+sme-i64"));
1402 TEST(TargetParserTest
, AArch64ArchFeatures
) {
1403 std::vector
<StringRef
> Features
;
1405 for (auto AK
: AArch64::ArchKinds
)
1406 EXPECT_TRUE((AK
== AArch64::ArchKind::INVALID
)
1407 ? !AArch64::getArchFeatures(AK
, Features
)
1408 : AArch64::getArchFeatures(AK
, Features
));
1411 TEST(TargetParserTest
, AArch64ArchExtFeature
) {
1412 const char *ArchExt
[][4] = {{"crc", "nocrc", "+crc", "-crc"},
1413 {"crypto", "nocrypto", "+crypto", "-crypto"},
1414 {"flagm", "noflagm", "+flagm", "-flagm"},
1415 {"fp", "nofp", "+fp-armv8", "-fp-armv8"},
1416 {"simd", "nosimd", "+neon", "-neon"},
1417 {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
1418 {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
1419 {"profile", "noprofile", "+spe", "-spe"},
1420 {"ras", "noras", "+ras", "-ras"},
1421 {"lse", "nolse", "+lse", "-lse"},
1422 {"rdm", "nordm", "+rdm", "-rdm"},
1423 {"sve", "nosve", "+sve", "-sve"},
1424 {"sve2", "nosve2", "+sve2", "-sve2"},
1425 {"sve2-aes", "nosve2-aes", "+sve2-aes",
1427 {"sve2-sm4", "nosve2-sm4", "+sve2-sm4",
1429 {"sve2-sha3", "nosve2-sha3", "+sve2-sha3",
1431 {"sve2-bitperm", "nosve2-bitperm",
1432 "+sve2-bitperm", "-sve2-bitperm"},
1433 {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
1434 {"rcpc", "norcpc", "+rcpc", "-rcpc" },
1435 {"rng", "norng", "+rand", "-rand"},
1436 {"memtag", "nomemtag", "+mte", "-mte"},
1437 {"tme", "notme", "+tme", "-tme"},
1438 {"pauth", "nopauth", "+pauth", "-pauth"},
1439 {"ssbs", "nossbs", "+ssbs", "-ssbs"},
1440 {"sb", "nosb", "+sb", "-sb"},
1441 {"predres", "nopredres", "+predres", "-predres"},
1442 {"i8mm", "noi8mm", "+i8mm", "-i8mm"},
1443 {"f32mm", "nof32mm", "+f32mm", "-f32mm"},
1444 {"f64mm", "nof64mm", "+f64mm", "-f64mm"},
1445 {"sme", "nosme", "+sme", "-sme"},
1446 {"sme-f64", "nosme-f64", "+sme-f64", "-sme-f64"},
1447 {"sme-i64", "nosme-i64", "+sme-i64", "-sme-i64"},
1450 for (unsigned i
= 0; i
< array_lengthof(ArchExt
); i
++) {
1451 EXPECT_EQ(StringRef(ArchExt
[i
][2]),
1452 AArch64::getArchExtFeature(ArchExt
[i
][0]));
1453 EXPECT_EQ(StringRef(ArchExt
[i
][3]),
1454 AArch64::getArchExtFeature(ArchExt
[i
][1]));