blob: d4996fa8e22c2f324703bf92054b0c376dcfa411 [file] [log] [blame]
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +00001//===----------- TargetParser.cpp - Target Parser -------------------------===//
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
Chandler Carruth9a67b072017-06-06 11:06:56 +000010#include "llvm/Support/TargetParser.h"
Zijiao Mae56a53a2016-07-28 06:11:18 +000011#include "llvm/ADT/STLExtras.h"
12#include "llvm/Support/ARMBuildAttributes.h"
Zijiao Mae56a53a2016-07-28 06:11:18 +000013#include "gtest/gtest.h"
14#include <string>
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +000015
16using namespace llvm;
17
18namespace {
Zijiao Mae56a53a2016-07-28 06:11:18 +000019const char *ARMArch[] = {
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +000020 "armv2", "armv2a", "armv3", "armv3m", "armv4",
21 "armv4t", "armv5", "armv5t", "armv5e", "armv5te",
22 "armv5tej", "armv6", "armv6j", "armv6k", "armv6hl",
23 "armv6t2", "armv6kz", "armv6z", "armv6zk", "armv6-m",
24 "armv6m", "armv6sm", "armv6s-m", "armv7-a", "armv7",
25 "armv7a", "armv7ve", "armv7hl", "armv7l", "armv7-r",
26 "armv7r", "armv7-m", "armv7m", "armv7k", "armv7s",
27 "armv7e-m", "armv7em", "armv8-a", "armv8", "armv8a",
28 "armv8l", "armv8.1-a", "armv8.1a", "armv8.2-a", "armv8.2a",
Oliver Stannard29e70cd2018-09-26 13:09:15 +000029 "armv8.3-a", "armv8.3a", "armv8.4-a", "armv8.4a", "armv8.5-a",
30 "armv8.5a", "armv8-r", "armv8r", "armv8-m.base", "armv8m.base",
31 "armv8-m.main", "armv8m.main", "iwmmxt", "iwmmxt2", "xscale"
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +000032};
Saleem Abdulrasool1ef925f2016-06-08 14:30:00 +000033
Zijiao Ma639f84b2016-12-06 02:22:08 +000034bool testARMCPU(StringRef CPUName, StringRef ExpectedArch,
35 StringRef ExpectedFPU, unsigned ExpectedFlags,
36 StringRef CPUAttr) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +000037 ARM::ArchKind AK = ARM::parseCPUArch(CPUName);
38 bool pass = ARM::getArchName(AK).equals(ExpectedArch);
39 unsigned FPUKind = ARM::getDefaultFPU(CPUName, AK);
Zijiao Ma639f84b2016-12-06 02:22:08 +000040 pass &= ARM::getFPUName(FPUKind).equals(ExpectedFPU);
41
Florian Hahn67ddd1d2017-07-27 16:27:56 +000042 unsigned ExtKind = ARM::getDefaultExtensions(CPUName, AK);
Zijiao Ma639f84b2016-12-06 02:22:08 +000043 if (ExtKind > 1 && (ExtKind & ARM::AEK_NONE))
44 pass &= ((ExtKind ^ ARM::AEK_NONE) == ExpectedFlags);
45 else
46 pass &= (ExtKind == ExpectedFlags);
47
Florian Hahn67ddd1d2017-07-27 16:27:56 +000048 pass &= ARM::getCPUAttr(AK).equals(CPUAttr);
Zijiao Ma639f84b2016-12-06 02:22:08 +000049
50 return pass;
Saleem Abdulrasool1ef925f2016-06-08 14:30:00 +000051}
52
Zijiao Ma639f84b2016-12-06 02:22:08 +000053TEST(TargetParserTest, testARMCPU) {
54 EXPECT_TRUE(testARMCPU("invalid", "invalid", "invalid",
55 ARM::AEK_NONE, ""));
56 EXPECT_TRUE(testARMCPU("generic", "invalid", "none",
57 ARM::AEK_NONE, ""));
58
59 EXPECT_TRUE(testARMCPU("arm2", "armv2", "none",
60 ARM::AEK_NONE, "2"));
61 EXPECT_TRUE(testARMCPU("arm3", "armv2a", "none",
62 ARM::AEK_NONE, "2A"));
63 EXPECT_TRUE(testARMCPU("arm6", "armv3", "none",
64 ARM::AEK_NONE, "3"));
65 EXPECT_TRUE(testARMCPU("arm7m", "armv3m", "none",
66 ARM::AEK_NONE, "3M"));
67 EXPECT_TRUE(testARMCPU("arm8", "armv4", "none",
68 ARM::AEK_NONE, "4"));
69 EXPECT_TRUE(testARMCPU("arm810", "armv4", "none",
70 ARM::AEK_NONE, "4"));
71 EXPECT_TRUE(testARMCPU("strongarm", "armv4", "none",
72 ARM::AEK_NONE, "4"));
73 EXPECT_TRUE(testARMCPU("strongarm110", "armv4", "none",
74 ARM::AEK_NONE, "4"));
75 EXPECT_TRUE(testARMCPU("strongarm1100", "armv4", "none",
76 ARM::AEK_NONE, "4"));
77 EXPECT_TRUE(testARMCPU("strongarm1110", "armv4", "none",
78 ARM::AEK_NONE, "4"));
79 EXPECT_TRUE(testARMCPU("arm7tdmi", "armv4t", "none",
80 ARM::AEK_NONE, "4T"));
81 EXPECT_TRUE(testARMCPU("arm7tdmi-s", "armv4t", "none",
82 ARM::AEK_NONE, "4T"));
83 EXPECT_TRUE(testARMCPU("arm710t", "armv4t", "none",
84 ARM::AEK_NONE, "4T"));
85 EXPECT_TRUE(testARMCPU("arm720t", "armv4t", "none",
86 ARM::AEK_NONE, "4T"));
87 EXPECT_TRUE(testARMCPU("arm9", "armv4t", "none",
88 ARM::AEK_NONE, "4T"));
89 EXPECT_TRUE(testARMCPU("arm9tdmi", "armv4t", "none",
90 ARM::AEK_NONE, "4T"));
91 EXPECT_TRUE(testARMCPU("arm920", "armv4t", "none",
92 ARM::AEK_NONE, "4T"));
93 EXPECT_TRUE(testARMCPU("arm920t", "armv4t", "none",
94 ARM::AEK_NONE, "4T"));
95 EXPECT_TRUE(testARMCPU("arm922t", "armv4t", "none",
96 ARM::AEK_NONE, "4T"));
97 EXPECT_TRUE(testARMCPU("arm9312", "armv4t", "none",
98 ARM::AEK_NONE, "4T"));
99 EXPECT_TRUE(testARMCPU("arm940t", "armv4t", "none",
100 ARM::AEK_NONE, "4T"));
101 EXPECT_TRUE(testARMCPU("ep9312", "armv4t", "none",
102 ARM::AEK_NONE, "4T"));
103 EXPECT_TRUE(testARMCPU("arm10tdmi", "armv5t", "none",
104 ARM::AEK_NONE, "5T"));
105 EXPECT_TRUE(testARMCPU("arm1020t", "armv5t", "none",
106 ARM::AEK_NONE, "5T"));
107 EXPECT_TRUE(testARMCPU("arm9e", "armv5te", "none",
108 ARM::AEK_DSP, "5TE"));
109 EXPECT_TRUE(testARMCPU("arm946e-s", "armv5te", "none",
110 ARM::AEK_DSP, "5TE"));
111 EXPECT_TRUE(testARMCPU("arm966e-s", "armv5te", "none",
112 ARM::AEK_DSP, "5TE"));
113 EXPECT_TRUE(testARMCPU("arm968e-s", "armv5te", "none",
114 ARM::AEK_DSP, "5TE"));
115 EXPECT_TRUE(testARMCPU("arm10e", "armv5te", "none",
116 ARM::AEK_DSP, "5TE"));
117 EXPECT_TRUE(testARMCPU("arm1020e", "armv5te", "none",
118 ARM::AEK_DSP, "5TE"));
119 EXPECT_TRUE(testARMCPU("arm1022e", "armv5te", "none",
120 ARM::AEK_DSP, "5TE"));
121 EXPECT_TRUE(testARMCPU("arm926ej-s", "armv5tej", "none",
122 ARM::AEK_DSP, "5TEJ"));
123 EXPECT_TRUE(testARMCPU("arm1136j-s", "armv6", "none",
124 ARM::AEK_DSP, "6"));
125 EXPECT_TRUE(testARMCPU("arm1136jf-s", "armv6", "vfpv2",
126 ARM::AEK_DSP, "6"));
127 EXPECT_TRUE(testARMCPU("arm1136jz-s", "armv6", "none",
128 ARM::AEK_DSP, "6"));
129 EXPECT_TRUE(testARMCPU("arm1176j-s", "armv6k", "none",
130 ARM::AEK_DSP, "6K"));
131 EXPECT_TRUE(testARMCPU("arm1176jz-s", "armv6kz", "none",
132 ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"));
133 EXPECT_TRUE(testARMCPU("mpcore", "armv6k", "vfpv2",
134 ARM::AEK_DSP, "6K"));
135 EXPECT_TRUE(testARMCPU("mpcorenovfp", "armv6k", "none",
136 ARM::AEK_DSP, "6K"));
137 EXPECT_TRUE(testARMCPU("arm1176jzf-s", "armv6kz", "vfpv2",
138 ARM::AEK_SEC | ARM::AEK_DSP, "6KZ"));
139 EXPECT_TRUE(testARMCPU("arm1156t2-s", "armv6t2", "none",
140 ARM::AEK_DSP, "6T2"));
141 EXPECT_TRUE(testARMCPU("arm1156t2f-s", "armv6t2", "vfpv2",
142 ARM::AEK_DSP, "6T2"));
143 EXPECT_TRUE(testARMCPU("cortex-m0", "armv6-m", "none",
144 ARM::AEK_NONE, "6-M"));
145 EXPECT_TRUE(testARMCPU("cortex-m0plus", "armv6-m", "none",
146 ARM::AEK_NONE, "6-M"));
147 EXPECT_TRUE(testARMCPU("cortex-m1", "armv6-m", "none",
148 ARM::AEK_NONE, "6-M"));
149 EXPECT_TRUE(testARMCPU("sc000", "armv6-m", "none",
150 ARM::AEK_NONE, "6-M"));
151 EXPECT_TRUE(testARMCPU("cortex-a5", "armv7-a", "neon-vfpv4",
152 ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
153 EXPECT_TRUE(testARMCPU("cortex-a7", "armv7-a", "neon-vfpv4",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000154 ARM::AEK_HWDIVTHUMB | ARM::AEK_HWDIVARM | ARM::AEK_MP |
155 ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000156 "7-A"));
157 EXPECT_TRUE(testARMCPU("cortex-a8", "armv7-a", "neon",
158 ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
159 EXPECT_TRUE(testARMCPU("cortex-a9", "armv7-a", "neon-fp16",
160 ARM::AEK_MP | ARM::AEK_SEC | ARM::AEK_DSP, "7-A"));
161 EXPECT_TRUE(testARMCPU("cortex-a12", "armv7-a", "neon-vfpv4",
162 ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000163 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
164 ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000165 "7-A"));
166 EXPECT_TRUE(testARMCPU("cortex-a15", "armv7-a", "neon-vfpv4",
167 ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000168 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
169 ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000170 "7-A"));
171 EXPECT_TRUE(testARMCPU("cortex-a17", "armv7-a", "neon-vfpv4",
172 ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000173 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
174 ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000175 "7-A"));
176 EXPECT_TRUE(testARMCPU("krait", "armv7-a", "neon-vfpv4",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000177 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000178 "7-A"));
179 EXPECT_TRUE(testARMCPU("cortex-r4", "armv7-r", "none",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000180 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000181 EXPECT_TRUE(testARMCPU("cortex-r4f", "armv7-r", "vfpv3-d16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000182 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7-R"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000183 EXPECT_TRUE(testARMCPU("cortex-r5", "armv7-r", "vfpv3-d16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000184 ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
185 ARM::AEK_DSP,
186 "7-R"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000187 EXPECT_TRUE(testARMCPU("cortex-r7", "armv7-r", "vfpv3-d16-fp16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000188 ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
189 ARM::AEK_DSP,
190 "7-R"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000191 EXPECT_TRUE(testARMCPU("cortex-r8", "armv7-r", "vfpv3-d16-fp16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000192 ARM::AEK_MP | ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
193 ARM::AEK_DSP,
194 "7-R"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000195 EXPECT_TRUE(testARMCPU("cortex-r52", "armv8-r", "neon-fp-armv8",
196 ARM::AEK_CRC | ARM::AEK_MP | ARM::AEK_VIRT |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000197 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |
198 ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000199 "8-R"));
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000200 EXPECT_TRUE(
201 testARMCPU("sc300", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
202 EXPECT_TRUE(
203 testARMCPU("cortex-m3", "armv7-m", "none", ARM::AEK_HWDIVTHUMB, "7-M"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000204 EXPECT_TRUE(testARMCPU("cortex-m4", "armv7e-m", "fpv4-sp-d16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000205 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000206 EXPECT_TRUE(testARMCPU("cortex-m7", "armv7e-m", "fpv5-d16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000207 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "7E-M"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000208 EXPECT_TRUE(testARMCPU("cortex-a32", "armv8-a", "crypto-neon-fp-armv8",
209 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000210 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
211 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000212 "8-A"));
213 EXPECT_TRUE(testARMCPU("cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
214 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000215 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
216 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000217 "8-A"));
218 EXPECT_TRUE(testARMCPU("cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
219 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000220 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
221 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000222 "8-A"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000223 EXPECT_TRUE(testARMCPU("cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
224 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
225 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
226 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
227 ARM::AEK_RAS | ARM::AEK_DOTPROD,
228 "8.2-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000229 EXPECT_TRUE(testARMCPU("cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
230 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000231 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
232 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000233 "8-A"));
234 EXPECT_TRUE(testARMCPU("cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
235 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000236 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
237 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000238 "8-A"));
239 EXPECT_TRUE(testARMCPU("cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
240 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000241 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
242 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000243 "8-A"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000244 EXPECT_TRUE(testARMCPU("cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
245 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
246 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
247 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP | ARM::AEK_FP16 |
248 ARM::AEK_RAS | ARM::AEK_DOTPROD,
249 "8.2-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000250 EXPECT_TRUE(testARMCPU("cyclone", "armv8-a", "crypto-neon-fp-armv8",
251 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000252 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
253 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000254 "8-A"));
255 EXPECT_TRUE(testARMCPU("exynos-m1", "armv8-a", "crypto-neon-fp-armv8",
256 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Evandro Menezesb2c824472018-06-06 18:56:00 +0000257 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
258 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000259 "8-A"));
260 EXPECT_TRUE(testARMCPU("exynos-m2", "armv8-a", "crypto-neon-fp-armv8",
261 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Evandro Menezesb2c824472018-06-06 18:56:00 +0000262 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
263 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000264 "8-A"));
Evandro Menezesaeec7802016-12-13 23:31:41 +0000265 EXPECT_TRUE(testARMCPU("exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
266 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
Evandro Menezesb2c824472018-06-06 18:56:00 +0000267 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
268 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
269 "8-A"));
270 EXPECT_TRUE(testARMCPU("exynos-m4", "armv8-a", "crypto-neon-fp-armv8",
271 ARM::AEK_CRC | ARM::AEK_SEC | ARM::AEK_MP |
272 ARM::AEK_VIRT | ARM::AEK_HWDIVARM |
273 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Evandro Menezesaeec7802016-12-13 23:31:41 +0000274 "8-A"));
Javed Absare5ad87e2017-02-01 11:55:03 +0000275 EXPECT_TRUE(testARMCPU("cortex-m23", "armv8-m.base", "none",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000276 ARM::AEK_HWDIVTHUMB, "8-M.Baseline"));
Javed Absare5ad87e2017-02-01 11:55:03 +0000277 EXPECT_TRUE(testARMCPU("cortex-m33", "armv8-m.main", "fpv5-sp-d16",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000278 ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP, "8-M.Mainline"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000279 EXPECT_TRUE(testARMCPU("iwmmxt", "iwmmxt", "none",
280 ARM::AEK_NONE, "iwmmxt"));
281 EXPECT_TRUE(testARMCPU("xscale", "xscale", "none",
282 ARM::AEK_NONE, "xscale"));
283 EXPECT_TRUE(testARMCPU("swift", "armv7s", "neon-vfpv4",
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000284 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000285 "7-S"));
Zachary Turner67cb90b2016-08-05 16:45:07 +0000286}
287
Evandro Menezesb2c824472018-06-06 18:56:00 +0000288static constexpr unsigned NumARMCPUArchs = 83;
Erich Keane0299cc92018-02-08 16:48:54 +0000289
290TEST(TargetParserTest, testARMCPUArchList) {
291 SmallVector<StringRef, NumARMCPUArchs> List;
292 ARM::fillValidCPUArchList(List);
293
294 // No list exists for these in this test suite, so ensure all are
295 // valid, and match the expected 'magic' count.
296 EXPECT_EQ(List.size(), NumARMCPUArchs);
297 for(StringRef CPU : List) {
298 EXPECT_NE(ARM::parseCPUArch(CPU), ARM::ArchKind::INVALID);
299 }
300}
301
Florian Hahn3cfdaa32017-12-20 11:32:43 +0000302TEST(TargetParserTest, testInvalidARMArch) {
303 auto InvalidArchStrings = {"armv", "armv99", "noarm"};
304 for (const char* InvalidArch : InvalidArchStrings)
305 EXPECT_EQ(ARM::parseArch(InvalidArch), ARM::ArchKind::INVALID);
306}
307
Zijiao Ma639f84b2016-12-06 02:22:08 +0000308bool testARMArch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch,
309 unsigned ArchAttr) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000310 ARM::ArchKind AK = ARM::parseArch(Arch);
311 return (AK!= ARM::ArchKind::INVALID) &
Zijiao Ma639f84b2016-12-06 02:22:08 +0000312 ARM::getDefaultCPU(Arch).equals(DefaultCPU) &
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000313 ARM::getSubArch(AK).equals(SubArch) &
314 (ARM::getArchAttr(AK) == ArchAttr);
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +0000315}
316
Zijiao Ma639f84b2016-12-06 02:22:08 +0000317TEST(TargetParserTest, testARMArch) {
318 EXPECT_TRUE(
319 testARMArch("armv2", "arm2", "v2",
320 ARMBuildAttrs::CPUArch::Pre_v4));
321 EXPECT_TRUE(
322 testARMArch("armv2a", "arm3", "v2a",
323 ARMBuildAttrs::CPUArch::Pre_v4));
324 EXPECT_TRUE(
325 testARMArch("armv3", "arm6", "v3",
326 ARMBuildAttrs::CPUArch::Pre_v4));
327 EXPECT_TRUE(
328 testARMArch("armv3m", "arm7m", "v3m",
329 ARMBuildAttrs::CPUArch::Pre_v4));
330 EXPECT_TRUE(
331 testARMArch("armv4", "strongarm", "v4",
332 ARMBuildAttrs::CPUArch::v4));
333 EXPECT_TRUE(
334 testARMArch("armv4t", "arm7tdmi", "v4t",
335 ARMBuildAttrs::CPUArch::v4T));
336 EXPECT_TRUE(
337 testARMArch("armv5t", "arm10tdmi", "v5",
338 ARMBuildAttrs::CPUArch::v5T));
339 EXPECT_TRUE(
340 testARMArch("armv5te", "arm1022e", "v5e",
341 ARMBuildAttrs::CPUArch::v5TE));
342 EXPECT_TRUE(
343 testARMArch("armv5tej", "arm926ej-s", "v5e",
344 ARMBuildAttrs::CPUArch::v5TEJ));
345 EXPECT_TRUE(
346 testARMArch("armv6", "arm1136jf-s", "v6",
347 ARMBuildAttrs::CPUArch::v6));
348 EXPECT_TRUE(
349 testARMArch("armv6k", "arm1176j-s", "v6k",
350 ARMBuildAttrs::CPUArch::v6K));
351 EXPECT_TRUE(
352 testARMArch("armv6t2", "arm1156t2-s", "v6t2",
353 ARMBuildAttrs::CPUArch::v6T2));
354 EXPECT_TRUE(
355 testARMArch("armv6kz", "arm1176jzf-s", "v6kz",
356 ARMBuildAttrs::CPUArch::v6KZ));
357 EXPECT_TRUE(
358 testARMArch("armv6-m", "cortex-m0", "v6m",
359 ARMBuildAttrs::CPUArch::v6_M));
360 EXPECT_TRUE(
Kristof Beyls955cc132017-06-01 07:31:43 +0000361 testARMArch("armv7-a", "generic", "v7",
Zijiao Ma639f84b2016-12-06 02:22:08 +0000362 ARMBuildAttrs::CPUArch::v7));
363 EXPECT_TRUE(
George Burgess IVccf11c22017-02-09 23:29:14 +0000364 testARMArch("armv7ve", "generic", "v7ve",
365 ARMBuildAttrs::CPUArch::v7));
366 EXPECT_TRUE(
Zijiao Ma639f84b2016-12-06 02:22:08 +0000367 testARMArch("armv7-r", "cortex-r4", "v7r",
368 ARMBuildAttrs::CPUArch::v7));
369 EXPECT_TRUE(
370 testARMArch("armv7-m", "cortex-m3", "v7m",
371 ARMBuildAttrs::CPUArch::v7));
372 EXPECT_TRUE(
373 testARMArch("armv7e-m", "cortex-m4", "v7em",
374 ARMBuildAttrs::CPUArch::v7E_M));
375 EXPECT_TRUE(
Kristof Beyls955cc132017-06-01 07:31:43 +0000376 testARMArch("armv8-a", "generic", "v8",
Zijiao Ma639f84b2016-12-06 02:22:08 +0000377 ARMBuildAttrs::CPUArch::v8_A));
378 EXPECT_TRUE(
379 testARMArch("armv8.1-a", "generic", "v8.1a",
380 ARMBuildAttrs::CPUArch::v8_A));
381 EXPECT_TRUE(
382 testARMArch("armv8.2-a", "generic", "v8.2a",
383 ARMBuildAttrs::CPUArch::v8_A));
384 EXPECT_TRUE(
Sam Parkerd65e19f2017-08-22 12:46:33 +0000385 testARMArch("armv8.3-a", "generic", "v8.3a",
386 ARMBuildAttrs::CPUArch::v8_A));
387 EXPECT_TRUE(
Oliver Stannard29e70cd2018-09-26 13:09:15 +0000388 testARMArch("armv8.4-a", "generic", "v8.4a",
389 ARMBuildAttrs::CPUArch::v8_A));
390 EXPECT_TRUE(
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000391 testARMArch("armv8.5-a", "generic", "v8.5a",
392 ARMBuildAttrs::CPUArch::v8_A));
393 EXPECT_TRUE(
Zijiao Ma639f84b2016-12-06 02:22:08 +0000394 testARMArch("armv8-r", "cortex-r52", "v8r",
395 ARMBuildAttrs::CPUArch::v8_R));
396 EXPECT_TRUE(
397 testARMArch("armv8-m.base", "generic", "v8m.base",
398 ARMBuildAttrs::CPUArch::v8_M_Base));
399 EXPECT_TRUE(
400 testARMArch("armv8-m.main", "generic", "v8m.main",
401 ARMBuildAttrs::CPUArch::v8_M_Main));
402 EXPECT_TRUE(
403 testARMArch("iwmmxt", "iwmmxt", "",
404 ARMBuildAttrs::CPUArch::v5TE));
405 EXPECT_TRUE(
406 testARMArch("iwmmxt2", "generic", "",
407 ARMBuildAttrs::CPUArch::v5TE));
408 EXPECT_TRUE(
409 testARMArch("xscale", "xscale", "v5e",
410 ARMBuildAttrs::CPUArch::v5TE));
411 EXPECT_TRUE(
412 testARMArch("armv7s", "swift", "v7s",
413 ARMBuildAttrs::CPUArch::v7));
414 EXPECT_TRUE(
415 testARMArch("armv7k", "generic", "v7k",
416 ARMBuildAttrs::CPUArch::v7));
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +0000417}
418
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000419bool testARMExtension(StringRef CPUName,ARM::ArchKind ArchKind, StringRef ArchExt) {
Zijiao Ma639f84b2016-12-06 02:22:08 +0000420 return ARM::getDefaultExtensions(CPUName, ArchKind) &
421 ARM::parseArchExt(ArchExt);
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +0000422}
423
Zijiao Ma639f84b2016-12-06 02:22:08 +0000424TEST(TargetParserTest, testARMExtension) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000425 EXPECT_FALSE(testARMExtension("arm2", ARM::ArchKind::INVALID, "thumb"));
426 EXPECT_FALSE(testARMExtension("arm3", ARM::ArchKind::INVALID, "thumb"));
427 EXPECT_FALSE(testARMExtension("arm6", ARM::ArchKind::INVALID, "thumb"));
428 EXPECT_FALSE(testARMExtension("arm7m", ARM::ArchKind::INVALID, "thumb"));
429 EXPECT_FALSE(testARMExtension("strongarm", ARM::ArchKind::INVALID, "dsp"));
430 EXPECT_FALSE(testARMExtension("arm7tdmi", ARM::ArchKind::INVALID, "dsp"));
431 EXPECT_FALSE(testARMExtension("arm10tdmi",
432 ARM::ArchKind::INVALID, "simd"));
433 EXPECT_FALSE(testARMExtension("arm1022e", ARM::ArchKind::INVALID, "simd"));
434 EXPECT_FALSE(testARMExtension("arm926ej-s",
435 ARM::ArchKind::INVALID, "simd"));
436 EXPECT_FALSE(testARMExtension("arm1136jf-s",
437 ARM::ArchKind::INVALID, "crypto"));
438 EXPECT_FALSE(testARMExtension("arm1176j-s",
439 ARM::ArchKind::INVALID, "crypto"));
440 EXPECT_FALSE(testARMExtension("arm1156t2-s",
441 ARM::ArchKind::INVALID, "crypto"));
442 EXPECT_FALSE(testARMExtension("arm1176jzf-s",
443 ARM::ArchKind::INVALID, "crypto"));
444 EXPECT_FALSE(testARMExtension("cortex-m0",
445 ARM::ArchKind::INVALID, "crypto"));
446 EXPECT_FALSE(testARMExtension("cortex-a8",
447 ARM::ArchKind::INVALID, "crypto"));
448 EXPECT_FALSE(testARMExtension("cortex-r4",
449 ARM::ArchKind::INVALID, "crypto"));
450 EXPECT_FALSE(testARMExtension("cortex-m3",
451 ARM::ArchKind::INVALID, "crypto"));
452 EXPECT_FALSE(testARMExtension("cortex-a53",
453 ARM::ArchKind::INVALID, "ras"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000454 EXPECT_FALSE(testARMExtension("cortex-a53",
455 ARM::ArchKind::INVALID, "fp16"));
456 EXPECT_TRUE(testARMExtension("cortex-a55",
457 ARM::ArchKind::INVALID, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000458 EXPECT_FALSE(testARMExtension("cortex-a55",
459 ARM::ArchKind::INVALID, "fp16fml"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000460 EXPECT_TRUE(testARMExtension("cortex-a75",
461 ARM::ArchKind::INVALID, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000462 EXPECT_FALSE(testARMExtension("cortex-a75",
463 ARM::ArchKind::INVALID, "fp16fml"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000464 EXPECT_FALSE(testARMExtension("cortex-r52",
465 ARM::ArchKind::INVALID, "ras"));
466 EXPECT_FALSE(testARMExtension("iwmmxt", ARM::ArchKind::INVALID, "crc"));
467 EXPECT_FALSE(testARMExtension("xscale", ARM::ArchKind::INVALID, "crc"));
468 EXPECT_FALSE(testARMExtension("swift", ARM::ArchKind::INVALID, "crc"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000469
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000470 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV2, "thumb"));
471 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV2A, "thumb"));
472 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV3, "thumb"));
473 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV3M, "thumb"));
474 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4, "dsp"));
475 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV4T, "dsp"));
476 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5T, "simd"));
477 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TE, "simd"));
478 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV5TEJ, "simd"));
479 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6, "crypto"));
480 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6K, "crypto"));
481 EXPECT_FALSE(testARMExtension("generic",
482 ARM::ArchKind::ARMV6T2, "crypto"));
483 EXPECT_FALSE(testARMExtension("generic",
484 ARM::ArchKind::ARMV6KZ, "crypto"));
485 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV6M, "crypto"));
486 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7A, "crypto"));
487 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7R, "crypto"));
488 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7M, "crypto"));
489 EXPECT_FALSE(testARMExtension("generic",
490 ARM::ArchKind::ARMV7EM, "crypto"));
491 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8A, "ras"));
492 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_1A, "ras"));
493 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "spe"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000494 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000495 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_2A, "fp16fml"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000496 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000497 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_3A, "fp16fml"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000498 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000499 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8_4A, "fp16fml"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000500 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV8R, "ras"));
501 EXPECT_FALSE(testARMExtension("generic",
502 ARM::ArchKind::ARMV8MBaseline, "crc"));
503 EXPECT_FALSE(testARMExtension("generic",
504 ARM::ArchKind::ARMV8MMainline, "crc"));
505 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT, "crc"));
506 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::IWMMXT2, "crc"));
507 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::XSCALE, "crc"));
508 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7S, "crypto"));
509 EXPECT_FALSE(testARMExtension("generic", ARM::ArchKind::ARMV7K, "crypto"));
Saleem Abdulrasool11bf1ac2016-03-06 04:50:55 +0000510}
Saleem Abdulrasool1ef925f2016-06-08 14:30:00 +0000511
Zijiao Mae56a53a2016-07-28 06:11:18 +0000512TEST(TargetParserTest, ARMFPUVersion) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000513 for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
Zijiao Mae56a53a2016-07-28 06:11:18 +0000514 FK <= ARM::FPUKind::FK_LAST;
515 FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000516 if (FK == ARM::FK_LAST || ARM::getFPUName(FK) == "invalid" ||
517 ARM::getFPUName(FK) == "none" || ARM::getFPUName(FK) == "softvfp")
518 EXPECT_EQ(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000519 else
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000520 EXPECT_NE(ARM::FPUVersion::NONE, ARM::getFPUVersion(FK));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000521}
522
523TEST(TargetParserTest, ARMFPUNeonSupportLevel) {
524 for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
525 FK <= ARM::FPUKind::FK_LAST;
526 FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000527 if (FK == ARM::FK_LAST ||
528 ARM::getFPUName(FK).find("neon") == std::string::npos)
529 EXPECT_EQ(ARM::NeonSupportLevel::None,
530 ARM::getFPUNeonSupportLevel(FK));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000531 else
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000532 EXPECT_NE(ARM::NeonSupportLevel::None,
533 ARM::getFPUNeonSupportLevel(FK));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000534}
535
536TEST(TargetParserTest, ARMFPURestriction) {
537 for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
538 FK <= ARM::FPUKind::FK_LAST;
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000539 FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1)) {
540 if (FK == ARM::FK_LAST ||
541 (ARM::getFPUName(FK).find("d16") == std::string::npos &&
542 ARM::getFPUName(FK).find("vfpv3xd") == std::string::npos))
543 EXPECT_EQ(ARM::FPURestriction::None, ARM::getFPURestriction(FK));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000544 else
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000545 EXPECT_NE(ARM::FPURestriction::None, ARM::getFPURestriction(FK));
546 }
Zijiao Mae56a53a2016-07-28 06:11:18 +0000547}
548
Zijiao Mae56a53a2016-07-28 06:11:18 +0000549TEST(TargetParserTest, ARMExtensionFeatures) {
Mehdi Aminia0016ec2016-10-07 08:37:29 +0000550 std::vector<StringRef> Features;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000551 unsigned Extensions = ARM::AEK_CRC | ARM::AEK_CRYPTO | ARM::AEK_DSP |
Diana Picus7c6dee9f2017-04-20 09:38:25 +0000552 ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_MP |
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000553 ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_RAS | ARM::AEK_FP16 |
554 ARM::AEK_FP16FML;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000555
556 for (unsigned i = 0; i <= Extensions; i++)
557 EXPECT_TRUE(i == 0 ? !ARM::getExtensionFeatures(i, Features)
558 : ARM::getExtensionFeatures(i, Features));
559}
560
561TEST(TargetParserTest, ARMFPUFeatures) {
Mehdi Aminia0016ec2016-10-07 08:37:29 +0000562 std::vector<StringRef> Features;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000563 for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
564 FK <= ARM::FPUKind::FK_LAST;
565 FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
566 EXPECT_TRUE((FK == ARM::FK_INVALID || FK >= ARM::FK_LAST)
567 ? !ARM::getFPUFeatures(FK, Features)
568 : ARM::getFPUFeatures(FK, Features));
569}
570
Zijiao Mae56a53a2016-07-28 06:11:18 +0000571TEST(TargetParserTest, ARMArchExtFeature) {
572 const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
573 {"crypto", "nocrypto", "+crypto", "-crypto"},
574 {"dsp", "nodsp", "+dsp", "-dsp"},
575 {"fp", "nofp", nullptr, nullptr},
576 {"idiv", "noidiv", nullptr, nullptr},
577 {"mp", "nomp", nullptr, nullptr},
578 {"simd", "nosimd", nullptr, nullptr},
579 {"sec", "nosec", nullptr, nullptr},
580 {"virt", "novirt", nullptr, nullptr},
581 {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000582 {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
Zijiao Mae56a53a2016-07-28 06:11:18 +0000583 {"ras", "noras", "+ras", "-ras"},
Sam Parkerb252ffd2017-08-21 08:43:06 +0000584 {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
Zijiao Mae56a53a2016-07-28 06:11:18 +0000585 {"os", "noos", nullptr, nullptr},
586 {"iwmmxt", "noiwmmxt", nullptr, nullptr},
587 {"iwmmxt2", "noiwmmxt2", nullptr, nullptr},
588 {"maverick", "maverick", nullptr, nullptr},
589 {"xscale", "noxscale", nullptr, nullptr}};
590
591 for (unsigned i = 0; i < array_lengthof(ArchExt); i++) {
Mehdi Aminia0016ec2016-10-07 08:37:29 +0000592 EXPECT_EQ(StringRef(ArchExt[i][2]), ARM::getArchExtFeature(ArchExt[i][0]));
593 EXPECT_EQ(StringRef(ArchExt[i][3]), ARM::getArchExtFeature(ArchExt[i][1]));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000594 }
595}
596
Zijiao Mae56a53a2016-07-28 06:11:18 +0000597TEST(TargetParserTest, ARMparseHWDiv) {
598 const char *hwdiv[] = {"thumb", "arm", "arm,thumb", "thumb,arm"};
599
600 for (unsigned i = 0; i < array_lengthof(hwdiv); i++)
601 EXPECT_NE(ARM::AEK_INVALID, ARM::parseHWDiv((StringRef)hwdiv[i]));
602}
603
Zijiao Mae56a53a2016-07-28 06:11:18 +0000604TEST(TargetParserTest, ARMparseArchEndianAndISA) {
605 const char *Arch[] = {
Florian Hahn4ed75a72018-01-09 17:49:25 +0000606 "v2", "v2a", "v3", "v3m", "v4", "v4t", "v5", "v5t",
607 "v5e", "v5te", "v5tej", "v6", "v6j", "v6k", "v6hl", "v6t2",
608 "v6kz", "v6z", "v6zk", "v6-m", "v6m", "v6sm", "v6s-m", "v7-a",
609 "v7", "v7a", "v7ve", "v7hl", "v7l", "v7-r", "v7r", "v7-m",
610 "v7m", "v7k", "v7s", "v7e-m", "v7em", "v8-a", "v8", "v8a",
Oliver Stannard29e70cd2018-09-26 13:09:15 +0000611 "v8l", "v8.1-a", "v8.1a", "v8.2-a", "v8.2a", "v8.3-a", "v8.3a", "v8.4-a",
612 "v8.4a", "v8.5-a","v8.5a", "v8-r"
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000613 };
Zijiao Mae56a53a2016-07-28 06:11:18 +0000614
615 for (unsigned i = 0; i < array_lengthof(Arch); i++) {
616 std::string arm_1 = "armeb" + (std::string)(Arch[i]);
617 std::string arm_2 = "arm" + (std::string)(Arch[i]) + "eb";
618 std::string arm_3 = "arm" + (std::string)(Arch[i]);
619 std::string thumb_1 = "thumbeb" + (std::string)(Arch[i]);
620 std::string thumb_2 = "thumb" + (std::string)(Arch[i]) + "eb";
621 std::string thumb_3 = "thumb" + (std::string)(Arch[i]);
622
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000623 EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_1));
624 EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(arm_2));
625 EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(arm_3));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000626
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000627 EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_1));
628 EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_2));
629 EXPECT_EQ(ARM::ISAKind::ARM, ARM::parseArchISA(arm_3));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000630 if (i >= 4) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000631 EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_1));
632 EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian(thumb_2));
633 EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian(thumb_3));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000634
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000635 EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_1));
636 EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_2));
637 EXPECT_EQ(ARM::ISAKind::THUMB, ARM::parseArchISA(thumb_3));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000638 }
639 }
640
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000641 EXPECT_EQ(ARM::EndianKind::LITTLE, ARM::parseArchEndian("aarch64"));
642 EXPECT_EQ(ARM::EndianKind::BIG, ARM::parseArchEndian("aarch64_be"));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000643
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000644 EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64"));
645 EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("aarch64_be"));
646 EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64"));
647 EXPECT_EQ(ARM::ISAKind::AARCH64, ARM::parseArchISA("arm64_be"));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000648}
649
650TEST(TargetParserTest, ARMparseArchProfile) {
651 for (unsigned i = 0; i < array_lengthof(ARMArch); i++) {
652 switch (ARM::parseArch(ARMArch[i])) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000653 case ARM::ArchKind::ARMV6M:
654 case ARM::ArchKind::ARMV7M:
655 case ARM::ArchKind::ARMV7EM:
656 case ARM::ArchKind::ARMV8MMainline:
657 case ARM::ArchKind::ARMV8MBaseline:
658 EXPECT_EQ(ARM::ProfileKind::M, ARM::parseArchProfile(ARMArch[i]));
659 break;
660 case ARM::ArchKind::ARMV7R:
661 case ARM::ArchKind::ARMV8R:
662 EXPECT_EQ(ARM::ProfileKind::R, ARM::parseArchProfile(ARMArch[i]));
663 break;
664 case ARM::ArchKind::ARMV7A:
665 case ARM::ArchKind::ARMV7VE:
666 case ARM::ArchKind::ARMV7K:
667 case ARM::ArchKind::ARMV8A:
668 case ARM::ArchKind::ARMV8_1A:
669 case ARM::ArchKind::ARMV8_2A:
Sam Parkerd65e19f2017-08-22 12:46:33 +0000670 case ARM::ArchKind::ARMV8_3A:
Oliver Stannard29e70cd2018-09-26 13:09:15 +0000671 case ARM::ArchKind::ARMV8_4A:
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000672 case ARM::ArchKind::ARMV8_5A:
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000673 EXPECT_EQ(ARM::ProfileKind::A, ARM::parseArchProfile(ARMArch[i]));
674 break;
675 default:
676 EXPECT_EQ(ARM::ProfileKind::INVALID, ARM::parseArchProfile(ARMArch[i]));
677 break;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000678 }
Zijiao Mae56a53a2016-07-28 06:11:18 +0000679 }
680}
681
682TEST(TargetParserTest, ARMparseArchVersion) {
683 for (unsigned i = 0; i < array_lengthof(ARMArch); i++)
684 if (((std::string)ARMArch[i]).substr(0, 4) == "armv")
David Blaikiefd5a7f12016-07-28 21:42:12 +0000685 EXPECT_EQ((ARMArch[i][4] - 48u), ARM::parseArchVersion(ARMArch[i]));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000686 else
David Blaikiefd5a7f12016-07-28 21:42:12 +0000687 EXPECT_EQ(5u, ARM::parseArchVersion(ARMArch[i]));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000688}
689
Zijiao Ma639f84b2016-12-06 02:22:08 +0000690bool testAArch64CPU(StringRef CPUName, StringRef ExpectedArch,
691 StringRef ExpectedFPU, unsigned ExpectedFlags,
692 StringRef CPUAttr) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000693 AArch64::ArchKind AK = AArch64::parseCPUArch(CPUName);
694 bool pass = AArch64::getArchName(AK).equals(ExpectedArch);
695 unsigned FPUKind = AArch64::getDefaultFPU(CPUName, AK);
Zijiao Ma639f84b2016-12-06 02:22:08 +0000696 pass &= AArch64::getFPUName(FPUKind).equals(ExpectedFPU);
Zijiao Mae56a53a2016-07-28 06:11:18 +0000697
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000698 unsigned ExtKind = AArch64::getDefaultExtensions(CPUName, AK);
Zijiao Ma639f84b2016-12-06 02:22:08 +0000699 if (ExtKind > 1 && (ExtKind & AArch64::AEK_NONE))
700 pass &= ((ExtKind ^ AArch64::AEK_NONE) == ExpectedFlags);
701 else
702 pass &= (ExtKind == ExpectedFlags);
703
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000704 pass &= AArch64::getCPUAttr(AK).equals(CPUAttr);
Zijiao Ma639f84b2016-12-06 02:22:08 +0000705
706 return pass;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000707}
708
Zijiao Ma639f84b2016-12-06 02:22:08 +0000709TEST(TargetParserTest, testAArch64CPU) {
710 EXPECT_TRUE(testAArch64CPU(
711 "invalid", "invalid", "invalid",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000712 AArch64::AEK_NONE, ""));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000713 EXPECT_TRUE(testAArch64CPU(
714 "generic", "invalid", "none",
715 AArch64::AEK_NONE, ""));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000716
Zijiao Ma639f84b2016-12-06 02:22:08 +0000717 EXPECT_TRUE(testAArch64CPU(
718 "cortex-a35", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000719 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
720 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000721 EXPECT_TRUE(testAArch64CPU(
722 "cortex-a53", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000723 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
724 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000725 EXPECT_TRUE(testAArch64CPU(
Sam Parkerb252ffd2017-08-21 08:43:06 +0000726 "cortex-a55", "armv8.2-a", "crypto-neon-fp-armv8",
727 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
728 AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
Chad Rosierbfd40142017-08-24 14:30:44 +0000729 AArch64::AEK_RDM | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
730 AArch64::AEK_RCPC, "8.2-A"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000731 EXPECT_TRUE(testAArch64CPU(
Zijiao Ma639f84b2016-12-06 02:22:08 +0000732 "cortex-a57", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000733 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
734 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000735 EXPECT_TRUE(testAArch64CPU(
736 "cortex-a72", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000737 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
738 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000739 EXPECT_TRUE(testAArch64CPU(
740 "cortex-a73", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000741 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
742 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000743 EXPECT_TRUE(testAArch64CPU(
Sam Parkerb252ffd2017-08-21 08:43:06 +0000744 "cortex-a75", "armv8.2-a", "crypto-neon-fp-armv8",
745 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
746 AArch64::AEK_SIMD | AArch64::AEK_RAS | AArch64::AEK_LSE |
Chad Rosierbfd40142017-08-24 14:30:44 +0000747 AArch64::AEK_RDM | AArch64::AEK_FP16 | AArch64::AEK_DOTPROD |
748 AArch64::AEK_RCPC, "8.2-A"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000749 EXPECT_TRUE(testAArch64CPU(
Zijiao Ma639f84b2016-12-06 02:22:08 +0000750 "cyclone", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000751 AArch64::AEK_CRYPTO | AArch64::AEK_FP | AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000752 EXPECT_TRUE(testAArch64CPU(
753 "exynos-m1", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000754 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
755 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000756 EXPECT_TRUE(testAArch64CPU(
757 "exynos-m2", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000758 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
759 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000760 EXPECT_TRUE(testAArch64CPU(
Evandro Menezesaeec7802016-12-13 23:31:41 +0000761 "exynos-m3", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000762 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
763 AArch64::AEK_SIMD, "8-A"));
Evandro Menezesaeec7802016-12-13 23:31:41 +0000764 EXPECT_TRUE(testAArch64CPU(
Evandro Menezesb2c824472018-06-06 18:56:00 +0000765 "exynos-m4", "armv8-a", "crypto-neon-fp-armv8",
766 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
767 AArch64::AEK_SIMD, "8-A"));
768 EXPECT_TRUE(testAArch64CPU(
Zijiao Ma639f84b2016-12-06 02:22:08 +0000769 "falkor", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000770 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
Chad Rosierbfd40142017-08-24 14:30:44 +0000771 AArch64::AEK_SIMD | AArch64::AEK_RDM, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000772 EXPECT_TRUE(testAArch64CPU(
773 "kryo", "armv8-a", "crypto-neon-fp-armv8",
Ahmed Bougacha90979672017-05-03 20:33:58 +0000774 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_FP |
775 AArch64::AEK_SIMD, "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000776 EXPECT_TRUE(testAArch64CPU(
Joel Jones28520882017-03-07 19:42:40 +0000777 "thunderx2t99", "armv8.1-a", "crypto-neon-fp-armv8",
778 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_LSE |
Chad Rosierbfd40142017-08-24 14:30:44 +0000779 AArch64::AEK_RDM | AArch64::AEK_FP | AArch64::AEK_SIMD, "8.1-A"));
Joel Jonesab0f3b42017-02-17 18:34:24 +0000780 EXPECT_TRUE(testAArch64CPU(
781 "thunderx", "armv8-a", "crypto-neon-fp-armv8",
782 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
783 AArch64::AEK_FP | AArch64::AEK_PROFILE,
784 "8-A"));
785 EXPECT_TRUE(testAArch64CPU(
786 "thunderxt81", "armv8-a", "crypto-neon-fp-armv8",
787 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
788 AArch64::AEK_FP | AArch64::AEK_PROFILE,
789 "8-A"));
790 EXPECT_TRUE(testAArch64CPU(
791 "thunderxt83", "armv8-a", "crypto-neon-fp-armv8",
792 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
793 AArch64::AEK_FP | AArch64::AEK_PROFILE,
794 "8-A"));
795 EXPECT_TRUE(testAArch64CPU(
796 "thunderxt88", "armv8-a", "crypto-neon-fp-armv8",
797 AArch64::AEK_CRC | AArch64::AEK_CRYPTO | AArch64::AEK_SIMD |
798 AArch64::AEK_FP | AArch64::AEK_PROFILE,
799 "8-A"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000800}
801
Evandro Menezesb2c824472018-06-06 18:56:00 +0000802static constexpr unsigned NumAArch64CPUArchs = 20;
Erich Keane0299cc92018-02-08 16:48:54 +0000803
804TEST(TargetParserTest, testAArch64CPUArchList) {
805 SmallVector<StringRef, NumAArch64CPUArchs> List;
806 AArch64::fillValidCPUArchList(List);
807
808 // No list exists for these in this test suite, so ensure all are
809 // valid, and match the expected 'magic' count.
810 EXPECT_EQ(List.size(), NumAArch64CPUArchs);
811 for(StringRef CPU : List) {
812 EXPECT_NE(AArch64::parseCPUArch(CPU), AArch64::ArchKind::INVALID);
813 }
814}
815
Zijiao Ma639f84b2016-12-06 02:22:08 +0000816bool testAArch64Arch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch,
817 unsigned ArchAttr) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000818 AArch64::ArchKind AK = AArch64::parseArch(Arch);
819 return (AK != AArch64::ArchKind::INVALID) &
Zijiao Ma639f84b2016-12-06 02:22:08 +0000820 AArch64::getDefaultCPU(Arch).equals(DefaultCPU) &
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000821 AArch64::getSubArch(AK).equals(SubArch) &
822 (AArch64::getArchAttr(AK) == ArchAttr);
Zijiao Ma639f84b2016-12-06 02:22:08 +0000823}
824
825TEST(TargetParserTest, testAArch64Arch) {
826 EXPECT_TRUE(testAArch64Arch("armv8-a", "cortex-a53", "v8",
827 ARMBuildAttrs::CPUArch::v8_A));
828 EXPECT_TRUE(testAArch64Arch("armv8.1-a", "generic", "v8.1a",
829 ARMBuildAttrs::CPUArch::v8_A));
830 EXPECT_TRUE(testAArch64Arch("armv8.2-a", "generic", "v8.2a",
831 ARMBuildAttrs::CPUArch::v8_A));
Sam Parkerd65e19f2017-08-22 12:46:33 +0000832 EXPECT_TRUE(testAArch64Arch("armv8.3-a", "generic", "v8.3a",
833 ARMBuildAttrs::CPUArch::v8_A));
Oliver Stannard29e70cd2018-09-26 13:09:15 +0000834 EXPECT_TRUE(testAArch64Arch("armv8.4-a", "generic", "v8.4a",
835 ARMBuildAttrs::CPUArch::v8_A));
Oliver Stannard7c3c4ba2018-09-26 12:48:21 +0000836 EXPECT_TRUE(testAArch64Arch("armv8.5-a", "generic", "v8.5a",
837 ARMBuildAttrs::CPUArch::v8_A));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000838}
839
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000840bool testAArch64Extension(StringRef CPUName, AArch64::ArchKind AK,
Zijiao Ma639f84b2016-12-06 02:22:08 +0000841 StringRef ArchExt) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000842 return AArch64::getDefaultExtensions(CPUName, AK) &
Zijiao Ma639f84b2016-12-06 02:22:08 +0000843 AArch64::parseArchExt(ArchExt);
844}
845
846TEST(TargetParserTest, testAArch64Extension) {
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000847 EXPECT_FALSE(testAArch64Extension("cortex-a35",
848 AArch64::ArchKind::INVALID, "ras"));
849 EXPECT_FALSE(testAArch64Extension("cortex-a53",
850 AArch64::ArchKind::INVALID, "ras"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000851 EXPECT_TRUE(testAArch64Extension("cortex-a55",
852 AArch64::ArchKind::INVALID, "ras"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000853 EXPECT_FALSE(testAArch64Extension("cortex-a57",
854 AArch64::ArchKind::INVALID, "ras"));
855 EXPECT_FALSE(testAArch64Extension("cortex-a72",
856 AArch64::ArchKind::INVALID, "ras"));
857 EXPECT_FALSE(testAArch64Extension("cortex-a73",
858 AArch64::ArchKind::INVALID, "ras"));
Sam Parkerb252ffd2017-08-21 08:43:06 +0000859 EXPECT_TRUE(testAArch64Extension("cortex-a75",
860 AArch64::ArchKind::INVALID, "ras"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000861 EXPECT_FALSE(testAArch64Extension("cyclone",
862 AArch64::ArchKind::INVALID, "ras"));
863 EXPECT_FALSE(testAArch64Extension("exynos-m1",
864 AArch64::ArchKind::INVALID, "ras"));
Evandro Menezes27e7f9c2017-12-14 23:13:04 +0000865 EXPECT_FALSE(testAArch64Extension("exynos-m2",
866 AArch64::ArchKind::INVALID, "ras"));
867 EXPECT_FALSE(testAArch64Extension("exynos-m3",
868 AArch64::ArchKind::INVALID, "ras"));
Evandro Menezesb2c824472018-06-06 18:56:00 +0000869 EXPECT_FALSE(testAArch64Extension("exynos-m4",
870 AArch64::ArchKind::INVALID, "ras"));
Chad Rosierbfd40142017-08-24 14:30:44 +0000871 EXPECT_TRUE(testAArch64Extension("falkor",
872 AArch64::ArchKind::INVALID, "rdm"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000873 EXPECT_FALSE(testAArch64Extension("kryo",
874 AArch64::ArchKind::INVALID, "ras"));
Chad Rosier71070852017-09-25 14:05:00 +0000875 EXPECT_TRUE(testAArch64Extension("saphira",
876 AArch64::ArchKind::INVALID, "crc"));
877 EXPECT_TRUE(testAArch64Extension("saphira",
878 AArch64::ArchKind::INVALID, "lse"));
879 EXPECT_TRUE(testAArch64Extension("saphira",
880 AArch64::ArchKind::INVALID, "rdm"));
881 EXPECT_TRUE(testAArch64Extension("saphira",
882 AArch64::ArchKind::INVALID, "ras"));
883 EXPECT_TRUE(testAArch64Extension("saphira",
884 AArch64::ArchKind::INVALID, "rcpc"));
885 EXPECT_TRUE(testAArch64Extension("saphira",
886 AArch64::ArchKind::INVALID, "profile"));
887 EXPECT_FALSE(testAArch64Extension("saphira",
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000888 AArch64::ArchKind::INVALID, "fp16"));
889 EXPECT_TRUE(testAArch64Extension("cortex-a55",
890 AArch64::ArchKind::INVALID, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000891 EXPECT_FALSE(testAArch64Extension("cortex-a55",
892 AArch64::ArchKind::INVALID, "fp16fml"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000893 EXPECT_TRUE(testAArch64Extension("cortex-a75",
894 AArch64::ArchKind::INVALID, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000895 EXPECT_FALSE(testAArch64Extension("cortex-a75",
896 AArch64::ArchKind::INVALID, "fp16fml"));
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000897 EXPECT_FALSE(testAArch64Extension("thunderx2t99",
898 AArch64::ArchKind::INVALID, "ras"));
899 EXPECT_FALSE(testAArch64Extension("thunderx",
900 AArch64::ArchKind::INVALID, "lse"));
901 EXPECT_FALSE(testAArch64Extension("thunderxt81",
902 AArch64::ArchKind::INVALID, "lse"));
903 EXPECT_FALSE(testAArch64Extension("thunderxt83",
904 AArch64::ArchKind::INVALID, "lse"));
905 EXPECT_FALSE(testAArch64Extension("thunderxt88",
906 AArch64::ArchKind::INVALID, "lse"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000907
908 EXPECT_FALSE(testAArch64Extension(
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000909 "generic", AArch64::ArchKind::ARMV8A, "ras"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000910 EXPECT_FALSE(testAArch64Extension(
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000911 "generic", AArch64::ArchKind::ARMV8_1A, "ras"));
Zijiao Ma639f84b2016-12-06 02:22:08 +0000912 EXPECT_FALSE(testAArch64Extension(
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000913 "generic", AArch64::ArchKind::ARMV8_2A, "spe"));
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000914 EXPECT_FALSE(testAArch64Extension(
915 "generic", AArch64::ArchKind::ARMV8_2A, "fp16"));
916 EXPECT_FALSE(testAArch64Extension(
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000917 "generic", AArch64::ArchKind::ARMV8_2A, "fp16fml"));
918 EXPECT_FALSE(testAArch64Extension(
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000919 "generic", AArch64::ArchKind::ARMV8_3A, "fp16"));
920 EXPECT_FALSE(testAArch64Extension(
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000921 "generic", AArch64::ArchKind::ARMV8_3A, "fp16fml"));
922 EXPECT_FALSE(testAArch64Extension(
Bernard Ogden6cb07d2b2018-08-17 11:26:57 +0000923 "generic", AArch64::ArchKind::ARMV8_4A, "fp16"));
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000924 EXPECT_FALSE(testAArch64Extension(
925 "generic", AArch64::ArchKind::ARMV8_4A, "fp16fml"));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000926}
927
928TEST(TargetParserTest, AArch64ExtensionFeatures) {
Mehdi Aminia0016ec2016-10-07 08:37:29 +0000929 std::vector<StringRef> Features;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000930 unsigned Extensions = AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
931 AArch64::AEK_FP | AArch64::AEK_SIMD |
932 AArch64::AEK_FP16 | AArch64::AEK_PROFILE |
Chad Rosierbfd40142017-08-24 14:30:44 +0000933 AArch64::AEK_RAS | AArch64::AEK_LSE |
934 AArch64::AEK_RDM | AArch64::AEK_SVE |
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000935 AArch64::AEK_DOTPROD | AArch64::AEK_RCPC |
936 AArch64::AEK_FP16FML;
Zijiao Mae56a53a2016-07-28 06:11:18 +0000937
938 for (unsigned i = 0; i <= Extensions; i++)
939 EXPECT_TRUE(i == 0 ? !AArch64::getExtensionFeatures(i, Features)
940 : AArch64::getExtensionFeatures(i, Features));
941}
942
943TEST(TargetParserTest, AArch64ArchFeatures) {
Mehdi Aminia0016ec2016-10-07 08:37:29 +0000944 std::vector<StringRef> Features;
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000945 AArch64::ArchKind ArchKinds[] = {
946#define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) \
947 AArch64::ArchKind::ID,
948#include "llvm/Support/AArch64TargetParser.def"
949 };
Zijiao Mae56a53a2016-07-28 06:11:18 +0000950
Florian Hahn67ddd1d2017-07-27 16:27:56 +0000951 for (auto AK : ArchKinds)
952 EXPECT_TRUE((AK == AArch64::ArchKind::INVALID)
Zijiao Mae56a53a2016-07-28 06:11:18 +0000953 ? !AArch64::getArchFeatures(AK, Features)
954 : AArch64::getArchFeatures(AK, Features));
955}
956
Zijiao Mae56a53a2016-07-28 06:11:18 +0000957TEST(TargetParserTest, AArch64ArchExtFeature) {
958 const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
959 {"crypto", "nocrypto", "+crypto", "-crypto"},
960 {"fp", "nofp", "+fp-armv8", "-fp-armv8"},
961 {"simd", "nosimd", "+neon", "-neon"},
962 {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
Bernard Ogdenb828bb22018-08-17 11:29:49 +0000963 {"fp16fml", "nofp16fml", "+fp16fml", "-fp16fml"},
Zijiao Mae56a53a2016-07-28 06:11:18 +0000964 {"profile", "noprofile", "+spe", "-spe"},
Amara Emerson9f3a2452017-07-13 15:19:56 +0000965 {"ras", "noras", "+ras", "-ras"},
Chad Rosierbfd40142017-08-24 14:30:44 +0000966 {"lse", "nolse", "+lse", "-lse"},
967 {"rdm", "nordm", "+rdm", "-rdm"},
Sam Parkerb252ffd2017-08-21 08:43:06 +0000968 {"sve", "nosve", "+sve", "-sve"},
969 {"dotprod", "nodotprod", "+dotprod", "-dotprod"},
970 {"rcpc", "norcpc", "+rcpc", "-rcpc" }};
Zijiao Mae56a53a2016-07-28 06:11:18 +0000971
972 for (unsigned i = 0; i < array_lengthof(ArchExt); i++) {
Zijiao Ma639f84b2016-12-06 02:22:08 +0000973 EXPECT_EQ(StringRef(ArchExt[i][2]),
974 AArch64::getArchExtFeature(ArchExt[i][0]));
975 EXPECT_EQ(StringRef(ArchExt[i][3]),
976 AArch64::getArchExtFeature(ArchExt[i][1]));
Zijiao Mae56a53a2016-07-28 06:11:18 +0000977 }
978}
Zijiao Mae56a53a2016-07-28 06:11:18 +0000979}