1*9880d681SAndroid Build Coastguard Worker //===----------- TargetParser.cpp - Target Parser -------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ARMBuildAttributes.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetParser.h"
13*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
14*9880d681SAndroid Build Coastguard Worker #include <string>
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker using namespace llvm;
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker namespace {
19*9880d681SAndroid Build Coastguard Worker static const unsigned kHWDivKinds[] = {
20*9880d681SAndroid Build Coastguard Worker #define ARM_HW_DIV_NAME(NAME, ID) ID,
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ARMTargetParser.def"
22*9880d681SAndroid Build Coastguard Worker #undef ARM_HW_DIV_NAME
23*9880d681SAndroid Build Coastguard Worker };
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker static const unsigned kARMArchExtKinds[] = {
26*9880d681SAndroid Build Coastguard Worker #define ARM_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) ID,
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ARMTargetParser.def"
28*9880d681SAndroid Build Coastguard Worker #undef ARM_ARCH_EXT_NAME
29*9880d681SAndroid Build Coastguard Worker };
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker static const unsigned kAArch64ArchExtKinds[] = {
32*9880d681SAndroid Build Coastguard Worker #define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) ID,
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/AArch64TargetParser.def"
34*9880d681SAndroid Build Coastguard Worker #undef AARCH64_ARCH_EXT_NAME
35*9880d681SAndroid Build Coastguard Worker };
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker template <typename T> struct ArchNames {
38*9880d681SAndroid Build Coastguard Worker const char *Name;
39*9880d681SAndroid Build Coastguard Worker unsigned DefaultFPU;
40*9880d681SAndroid Build Coastguard Worker unsigned ArchBaseExtensions;
41*9880d681SAndroid Build Coastguard Worker T ID;
42*9880d681SAndroid Build Coastguard Worker ARMBuildAttrs::CPUArch ArchAttr;
43*9880d681SAndroid Build Coastguard Worker };
44*9880d681SAndroid Build Coastguard Worker ArchNames<AArch64::ArchKind> kAArch64ARCHNames[] = {
45*9880d681SAndroid Build Coastguard Worker #define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, \
46*9880d681SAndroid Build Coastguard Worker ARCH_BASE_EXT) \
47*9880d681SAndroid Build Coastguard Worker {NAME, ARM::ARCH_FPU, ARCH_BASE_EXT, AArch64::ArchKind::ID, ARCH_ATTR},
48*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/AArch64TargetParser.def"
49*9880d681SAndroid Build Coastguard Worker #undef AARCH64_ARCH
50*9880d681SAndroid Build Coastguard Worker };
51*9880d681SAndroid Build Coastguard Worker ArchNames<ARM::ArchKind> kARMARCHNames[] = {
52*9880d681SAndroid Build Coastguard Worker #define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, \
53*9880d681SAndroid Build Coastguard Worker ARCH_BASE_EXT) \
54*9880d681SAndroid Build Coastguard Worker {NAME, ARM::ARCH_FPU, ARCH_BASE_EXT, ARM::ID, ARCH_ATTR},
55*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ARMTargetParser.def"
56*9880d681SAndroid Build Coastguard Worker #undef ARM_ARCH
57*9880d681SAndroid Build Coastguard Worker };
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker template <typename T> struct CpuNames {
60*9880d681SAndroid Build Coastguard Worker const char *Name;
61*9880d681SAndroid Build Coastguard Worker T ID;
62*9880d681SAndroid Build Coastguard Worker unsigned DefaultFPU;
63*9880d681SAndroid Build Coastguard Worker unsigned DefaultExt;
64*9880d681SAndroid Build Coastguard Worker };
65*9880d681SAndroid Build Coastguard Worker CpuNames<AArch64::ArchKind> kAArch64CPUNames[] = {
66*9880d681SAndroid Build Coastguard Worker #define AARCH64_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
67*9880d681SAndroid Build Coastguard Worker {NAME, AArch64::ArchKind::ID, ARM::DEFAULT_FPU, DEFAULT_EXT},
68*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/AArch64TargetParser.def"
69*9880d681SAndroid Build Coastguard Worker #undef AARCH64_CPU_NAME
70*9880d681SAndroid Build Coastguard Worker };
71*9880d681SAndroid Build Coastguard Worker CpuNames<ARM::ArchKind> kARMCPUNames[] = {
72*9880d681SAndroid Build Coastguard Worker #define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \
73*9880d681SAndroid Build Coastguard Worker {NAME, ARM::ID, ARM::DEFAULT_FPU, DEFAULT_EXT},
74*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ARMTargetParser.def"
75*9880d681SAndroid Build Coastguard Worker #undef ARM_CPU_NAME
76*9880d681SAndroid Build Coastguard Worker };
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker const char *ARMArch[] = {
79*9880d681SAndroid Build Coastguard Worker "armv2", "armv2a", "armv3", "armv3m", "armv4",
80*9880d681SAndroid Build Coastguard Worker "armv4t", "armv5", "armv5t", "armv5e", "armv5te",
81*9880d681SAndroid Build Coastguard Worker "armv5tej", "armv6", "armv6j", "armv6k", "armv6hl",
82*9880d681SAndroid Build Coastguard Worker "armv6t2", "armv6kz", "armv6z", "armv6zk", "armv6-m",
83*9880d681SAndroid Build Coastguard Worker "armv6m", "armv6sm", "armv6s-m", "armv7-a", "armv7",
84*9880d681SAndroid Build Coastguard Worker "armv7a", "armv7hl", "armv7l", "armv7-r", "armv7r",
85*9880d681SAndroid Build Coastguard Worker "armv7-m", "armv7m", "armv7k", "armv7s", "armv7e-m",
86*9880d681SAndroid Build Coastguard Worker "armv7em", "armv8-a", "armv8", "armv8a", "armv8.1-a",
87*9880d681SAndroid Build Coastguard Worker "armv8.1a", "armv8.2-a", "armv8.2a", "armv8-m.base", "armv8m.base",
88*9880d681SAndroid Build Coastguard Worker "armv8-m.main", "armv8m.main", "iwmmxt", "iwmmxt2", "xscale"};
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker template <typename T, size_t N>
contains(const T (& array)[N],const T element)91*9880d681SAndroid Build Coastguard Worker bool contains(const T (&array)[N], const T element) {
92*9880d681SAndroid Build Coastguard Worker return std::find(std::begin(array), std::end(array), element) !=
93*9880d681SAndroid Build Coastguard Worker std::end(array);
94*9880d681SAndroid Build Coastguard Worker }
95*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMArchName)96*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMArchName) {
97*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
98*9880d681SAndroid Build Coastguard Worker AK <= ARM::ArchKind::AK_LAST;
99*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
100*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(AK == ARM::AK_LAST ? ARM::getArchName(AK).empty()
101*9880d681SAndroid Build Coastguard Worker : !ARM::getArchName(AK).empty());
102*9880d681SAndroid Build Coastguard Worker }
103*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMCPUAttr)104*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMCPUAttr) {
105*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
106*9880d681SAndroid Build Coastguard Worker AK <= ARM::ArchKind::AK_LAST;
107*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
108*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((AK == ARM::AK_INVALID || AK == ARM::AK_LAST)
109*9880d681SAndroid Build Coastguard Worker ? ARM::getCPUAttr(AK).empty()
110*9880d681SAndroid Build Coastguard Worker : !ARM::getCPUAttr(AK).empty());
111*9880d681SAndroid Build Coastguard Worker }
112*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMSubArch)113*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMSubArch) {
114*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
115*9880d681SAndroid Build Coastguard Worker AK <= ARM::ArchKind::AK_LAST;
116*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
117*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((AK == ARM::AK_INVALID || AK == ARM::AK_IWMMXT ||
118*9880d681SAndroid Build Coastguard Worker AK == ARM::AK_IWMMXT2 || AK == ARM::AK_LAST)
119*9880d681SAndroid Build Coastguard Worker ? ARM::getSubArch(AK).empty()
120*9880d681SAndroid Build Coastguard Worker : !ARM::getSubArch(AK).empty());
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMFPUName)123*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMFPUName) {
124*9880d681SAndroid Build Coastguard Worker for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
125*9880d681SAndroid Build Coastguard Worker FK <= ARM::FPUKind::FK_LAST;
126*9880d681SAndroid Build Coastguard Worker FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
127*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(FK == ARM::FK_LAST ? ARM::getFPUName(FK).empty()
128*9880d681SAndroid Build Coastguard Worker : !ARM::getFPUName(FK).empty());
129*9880d681SAndroid Build Coastguard Worker }
130*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMFPUVersion)131*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMFPUVersion) {
132*9880d681SAndroid Build Coastguard Worker for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
133*9880d681SAndroid Build Coastguard Worker FK <= ARM::FPUKind::FK_LAST;
134*9880d681SAndroid Build Coastguard Worker FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
135*9880d681SAndroid Build Coastguard Worker if (FK == ARM::FK_LAST)
136*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, ARM::getFPUVersion(FK));
137*9880d681SAndroid Build Coastguard Worker else
138*9880d681SAndroid Build Coastguard Worker EXPECT_LE(0, ARM::getFPUVersion(FK));
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMFPUNeonSupportLevel)141*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMFPUNeonSupportLevel) {
142*9880d681SAndroid Build Coastguard Worker for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
143*9880d681SAndroid Build Coastguard Worker FK <= ARM::FPUKind::FK_LAST;
144*9880d681SAndroid Build Coastguard Worker FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
145*9880d681SAndroid Build Coastguard Worker if (FK == ARM::FK_LAST)
146*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, ARM::getFPUNeonSupportLevel(FK));
147*9880d681SAndroid Build Coastguard Worker else
148*9880d681SAndroid Build Coastguard Worker EXPECT_LE(0, ARM::getFPUNeonSupportLevel(FK));
149*9880d681SAndroid Build Coastguard Worker }
150*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMFPURestriction)151*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMFPURestriction) {
152*9880d681SAndroid Build Coastguard Worker for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
153*9880d681SAndroid Build Coastguard Worker FK <= ARM::FPUKind::FK_LAST;
154*9880d681SAndroid Build Coastguard Worker FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
155*9880d681SAndroid Build Coastguard Worker if (FK == ARM::FK_LAST)
156*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(0, ARM::getFPURestriction(FK));
157*9880d681SAndroid Build Coastguard Worker else
158*9880d681SAndroid Build Coastguard Worker EXPECT_LE(0, ARM::getFPURestriction(FK));
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMDefaultFPU)161*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMDefaultFPU) {
162*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
163*9880d681SAndroid Build Coastguard Worker AK < ARM::ArchKind::AK_LAST;
164*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
165*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(kARMARCHNames[AK].DefaultFPU,
166*9880d681SAndroid Build Coastguard Worker ARM::getDefaultFPU(StringRef("generic"), AK));
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker for (const auto &ARMCPUName : kARMCPUNames)
169*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARMCPUName.DefaultFPU, ARM::getDefaultFPU(ARMCPUName.Name, 0));
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMDefaultExtensions)172*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMDefaultExtensions) {
173*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
174*9880d681SAndroid Build Coastguard Worker AK < ARM::ArchKind::AK_LAST;
175*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
176*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(kARMARCHNames[AK].ArchBaseExtensions,
177*9880d681SAndroid Build Coastguard Worker ARM::getDefaultExtensions(StringRef("generic"), AK));
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker for (const auto &ARMCPUName : kARMCPUNames) {
180*9880d681SAndroid Build Coastguard Worker unsigned DefaultExt =
181*9880d681SAndroid Build Coastguard Worker kARMARCHNames[ARMCPUName.ID].ArchBaseExtensions | ARMCPUName.DefaultExt;
182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(DefaultExt, ARM::getDefaultExtensions(ARMCPUName.Name, 0));
183*9880d681SAndroid Build Coastguard Worker }
184*9880d681SAndroid Build Coastguard Worker }
185*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMExtensionFeatures)186*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMExtensionFeatures) {
187*9880d681SAndroid Build Coastguard Worker std::vector<const char *> Features;
188*9880d681SAndroid Build Coastguard Worker unsigned Extensions = ARM::AEK_CRC | ARM::AEK_CRYPTO | ARM::AEK_DSP |
189*9880d681SAndroid Build Coastguard Worker ARM::AEK_HWDIVARM | ARM::AEK_HWDIV | ARM::AEK_MP |
190*9880d681SAndroid Build Coastguard Worker ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_RAS;
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i <= Extensions; i++)
193*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(i == 0 ? !ARM::getExtensionFeatures(i, Features)
194*9880d681SAndroid Build Coastguard Worker : ARM::getExtensionFeatures(i, Features));
195*9880d681SAndroid Build Coastguard Worker }
196*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMFPUFeatures)197*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMFPUFeatures) {
198*9880d681SAndroid Build Coastguard Worker std::vector<const char *> Features;
199*9880d681SAndroid Build Coastguard Worker for (ARM::FPUKind FK = static_cast<ARM::FPUKind>(0);
200*9880d681SAndroid Build Coastguard Worker FK <= ARM::FPUKind::FK_LAST;
201*9880d681SAndroid Build Coastguard Worker FK = static_cast<ARM::FPUKind>(static_cast<unsigned>(FK) + 1))
202*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((FK == ARM::FK_INVALID || FK >= ARM::FK_LAST)
203*9880d681SAndroid Build Coastguard Worker ? !ARM::getFPUFeatures(FK, Features)
204*9880d681SAndroid Build Coastguard Worker : ARM::getFPUFeatures(FK, Features));
205*9880d681SAndroid Build Coastguard Worker }
206*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMArchAttr)207*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMArchAttr) {
208*9880d681SAndroid Build Coastguard Worker for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
209*9880d681SAndroid Build Coastguard Worker AK <= ARM::ArchKind::AK_LAST;
210*9880d681SAndroid Build Coastguard Worker AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
211*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(AK == ARM::AK_LAST
212*9880d681SAndroid Build Coastguard Worker ? (ARMBuildAttrs::CPUArch::Pre_v4 == ARM::getArchAttr(AK))
213*9880d681SAndroid Build Coastguard Worker : (kARMARCHNames[AK].ArchAttr == ARM::getArchAttr(AK)));
214*9880d681SAndroid Build Coastguard Worker }
215*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMArchExtName)216*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMArchExtName) {
217*9880d681SAndroid Build Coastguard Worker for (ARM::ArchExtKind AEK = static_cast<ARM::ArchExtKind>(0);
218*9880d681SAndroid Build Coastguard Worker AEK <= ARM::ArchExtKind::AEK_XSCALE;
219*9880d681SAndroid Build Coastguard Worker AEK = static_cast<ARM::ArchExtKind>(static_cast<unsigned>(AEK) + 1))
220*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(contains(kARMArchExtKinds, static_cast<unsigned>(AEK))
221*9880d681SAndroid Build Coastguard Worker ? !ARM::getArchExtName(AEK).empty()
222*9880d681SAndroid Build Coastguard Worker : ARM::getArchExtName(AEK).empty());
223*9880d681SAndroid Build Coastguard Worker }
224*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMArchExtFeature)225*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMArchExtFeature) {
226*9880d681SAndroid Build Coastguard Worker const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
227*9880d681SAndroid Build Coastguard Worker {"crypto", "nocrypto", "+crypto", "-crypto"},
228*9880d681SAndroid Build Coastguard Worker {"dsp", "nodsp", "+dsp", "-dsp"},
229*9880d681SAndroid Build Coastguard Worker {"fp", "nofp", nullptr, nullptr},
230*9880d681SAndroid Build Coastguard Worker {"idiv", "noidiv", nullptr, nullptr},
231*9880d681SAndroid Build Coastguard Worker {"mp", "nomp", nullptr, nullptr},
232*9880d681SAndroid Build Coastguard Worker {"simd", "nosimd", nullptr, nullptr},
233*9880d681SAndroid Build Coastguard Worker {"sec", "nosec", nullptr, nullptr},
234*9880d681SAndroid Build Coastguard Worker {"virt", "novirt", nullptr, nullptr},
235*9880d681SAndroid Build Coastguard Worker {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
236*9880d681SAndroid Build Coastguard Worker {"ras", "noras", "+ras", "-ras"},
237*9880d681SAndroid Build Coastguard Worker {"os", "noos", nullptr, nullptr},
238*9880d681SAndroid Build Coastguard Worker {"iwmmxt", "noiwmmxt", nullptr, nullptr},
239*9880d681SAndroid Build Coastguard Worker {"iwmmxt2", "noiwmmxt2", nullptr, nullptr},
240*9880d681SAndroid Build Coastguard Worker {"maverick", "maverick", nullptr, nullptr},
241*9880d681SAndroid Build Coastguard Worker {"xscale", "noxscale", nullptr, nullptr}};
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ArchExt); i++) {
244*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ArchExt[i][2], ARM::getArchExtFeature(ArchExt[i][0]));
245*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ArchExt[i][3], ARM::getArchExtFeature(ArchExt[i][1]));
246*9880d681SAndroid Build Coastguard Worker }
247*9880d681SAndroid Build Coastguard Worker }
248*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMHWDivName)249*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMHWDivName) {
250*9880d681SAndroid Build Coastguard Worker for (ARM::ArchExtKind AEK = static_cast<ARM::ArchExtKind>(0);
251*9880d681SAndroid Build Coastguard Worker AEK <= ARM::ArchExtKind::AEK_XSCALE;
252*9880d681SAndroid Build Coastguard Worker AEK = static_cast<ARM::ArchExtKind>(static_cast<unsigned>(AEK) + 1))
253*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(contains(kHWDivKinds, static_cast<unsigned>(AEK))
254*9880d681SAndroid Build Coastguard Worker ? !ARM::getHWDivName(AEK).empty()
255*9880d681SAndroid Build Coastguard Worker : ARM::getHWDivName(AEK).empty());
256*9880d681SAndroid Build Coastguard Worker }
257*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMDefaultCPU)258*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMDefaultCPU) {
259*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ARMArch); i++)
260*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(ARM::getDefaultCPU(ARMArch[i]).empty());
261*9880d681SAndroid Build Coastguard Worker }
262*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseHWDiv)263*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseHWDiv) {
264*9880d681SAndroid Build Coastguard Worker const char *hwdiv[] = {"thumb", "arm", "arm,thumb", "thumb,arm"};
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(hwdiv); i++)
267*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ARM::AEK_INVALID, ARM::parseHWDiv((StringRef)hwdiv[i]));
268*9880d681SAndroid Build Coastguard Worker }
269*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseFPU)270*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseFPU) {
271*9880d681SAndroid Build Coastguard Worker const char *FPU[] = {"vfp",
272*9880d681SAndroid Build Coastguard Worker "vfpv2",
273*9880d681SAndroid Build Coastguard Worker "vfp2",
274*9880d681SAndroid Build Coastguard Worker "vfpv3",
275*9880d681SAndroid Build Coastguard Worker "vfp3",
276*9880d681SAndroid Build Coastguard Worker "vfpv3-fp16",
277*9880d681SAndroid Build Coastguard Worker "vfpv3-d16",
278*9880d681SAndroid Build Coastguard Worker "vfp3-d16",
279*9880d681SAndroid Build Coastguard Worker "vfpv3-d16-fp16",
280*9880d681SAndroid Build Coastguard Worker "vfpv3xd",
281*9880d681SAndroid Build Coastguard Worker "vfpv3xd-fp16",
282*9880d681SAndroid Build Coastguard Worker "vfpv4",
283*9880d681SAndroid Build Coastguard Worker "vfp4",
284*9880d681SAndroid Build Coastguard Worker "vfpv4-d16",
285*9880d681SAndroid Build Coastguard Worker "vfp4-d16",
286*9880d681SAndroid Build Coastguard Worker "fp4-dp-d16",
287*9880d681SAndroid Build Coastguard Worker "fpv4-dp-d16",
288*9880d681SAndroid Build Coastguard Worker "fpv4-sp-d16",
289*9880d681SAndroid Build Coastguard Worker "fp4-sp-d16",
290*9880d681SAndroid Build Coastguard Worker "vfpv4-sp-d16",
291*9880d681SAndroid Build Coastguard Worker "fpv5-d16",
292*9880d681SAndroid Build Coastguard Worker "fp5-dp-d16",
293*9880d681SAndroid Build Coastguard Worker "fpv5-dp-d16",
294*9880d681SAndroid Build Coastguard Worker "fpv5-sp-d16",
295*9880d681SAndroid Build Coastguard Worker "fp5-sp-d16",
296*9880d681SAndroid Build Coastguard Worker "fp-armv8",
297*9880d681SAndroid Build Coastguard Worker "neon",
298*9880d681SAndroid Build Coastguard Worker "neon-vfpv3",
299*9880d681SAndroid Build Coastguard Worker "neon-fp16",
300*9880d681SAndroid Build Coastguard Worker "neon-vfpv4",
301*9880d681SAndroid Build Coastguard Worker "neon-fp-armv8",
302*9880d681SAndroid Build Coastguard Worker "crypto-neon-fp-armv8",
303*9880d681SAndroid Build Coastguard Worker "softvfp"};
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(FPU); i++)
306*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ARM::FK_INVALID, ARM::parseFPU((StringRef)FPU[i]));
307*9880d681SAndroid Build Coastguard Worker }
308*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseArch)309*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseArch) {
310*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ARMArch); i++)
311*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ARM::AEK_INVALID, ARM::parseArch(ARMArch[i]));
312*9880d681SAndroid Build Coastguard Worker }
313*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseArchExt)314*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseArchExt) {
315*9880d681SAndroid Build Coastguard Worker const char *ArchExt[] = {"none", "crc", "crypto", "dsp", "fp",
316*9880d681SAndroid Build Coastguard Worker "idiv", "mp", "simd", "sec", "virt",
317*9880d681SAndroid Build Coastguard Worker "fp16", "ras", "os", "iwmmxt", "iwmmxt2",
318*9880d681SAndroid Build Coastguard Worker "maverick", "xscale"};
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ArchExt); i++)
321*9880d681SAndroid Build Coastguard Worker EXPECT_NE(ARM::AEK_INVALID, ARM::parseArchExt(ArchExt[i]));
322*9880d681SAndroid Build Coastguard Worker }
323*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseCPUArch)324*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseCPUArch) {
325*9880d681SAndroid Build Coastguard Worker const char *CPU[] = {
326*9880d681SAndroid Build Coastguard Worker "arm2", "arm3", "arm6", "arm7m",
327*9880d681SAndroid Build Coastguard Worker "arm8", "arm810", "strongarm", "strongarm110",
328*9880d681SAndroid Build Coastguard Worker "strongarm1100", "strongarm1110", "arm7tdmi", "arm7tdmi-s",
329*9880d681SAndroid Build Coastguard Worker "arm710t", "arm720t", "arm9", "arm9tdmi",
330*9880d681SAndroid Build Coastguard Worker "arm920", "arm920t", "arm922t", "arm9312",
331*9880d681SAndroid Build Coastguard Worker "arm940t", "ep9312", "arm10tdmi", "arm1020t",
332*9880d681SAndroid Build Coastguard Worker "arm9e", "arm946e-s", "arm966e-s", "arm968e-s",
333*9880d681SAndroid Build Coastguard Worker "arm10e", "arm1020e", "arm1022e", "arm926ej-s",
334*9880d681SAndroid Build Coastguard Worker "arm1136j-s", "arm1136jf-s", "arm1136jz-s", "arm1176j-s",
335*9880d681SAndroid Build Coastguard Worker "arm1176jz-s", "mpcore", "mpcorenovfp", "arm1176jzf-s",
336*9880d681SAndroid Build Coastguard Worker "arm1156t2-s", "arm1156t2f-s", "cortex-m0", "cortex-m0plus",
337*9880d681SAndroid Build Coastguard Worker "cortex-m1", "sc000", "cortex-a5", "cortex-a7",
338*9880d681SAndroid Build Coastguard Worker "cortex-a8", "cortex-a9", "cortex-a12", "cortex-a15",
339*9880d681SAndroid Build Coastguard Worker "cortex-a17", "krait", "cortex-r4", "cortex-r4f",
340*9880d681SAndroid Build Coastguard Worker "cortex-r5", "cortex-r7", "cortex-r8", "sc300",
341*9880d681SAndroid Build Coastguard Worker "cortex-m3", "cortex-m4", "cortex-m7", "cortex-a32",
342*9880d681SAndroid Build Coastguard Worker "cortex-a35", "cortex-a53", "cortex-a57", "cortex-a72",
343*9880d681SAndroid Build Coastguard Worker "cortex-a73", "cyclone", "exynos-m1", "iwmmxt",
344*9880d681SAndroid Build Coastguard Worker "xscale", "swift"};
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker for (const auto &ARMCPUName : kARMCPUNames)
347*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(contains(CPU, ARMCPUName.Name)
348*9880d681SAndroid Build Coastguard Worker ? (ARM::AK_INVALID != ARM::parseCPUArch(ARMCPUName.Name))
349*9880d681SAndroid Build Coastguard Worker : (ARM::AK_INVALID == ARM::parseCPUArch(ARMCPUName.Name)));
350*9880d681SAndroid Build Coastguard Worker }
351*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseArchEndianAndISA)352*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseArchEndianAndISA) {
353*9880d681SAndroid Build Coastguard Worker const char *Arch[] = {
354*9880d681SAndroid Build Coastguard Worker "v2", "v2a", "v3", "v3m", "v4", "v4t", "v5", "v5t",
355*9880d681SAndroid Build Coastguard Worker "v5e", "v5te", "v5tej", "v6", "v6j", "v6k", "v6hl", "v6t2",
356*9880d681SAndroid Build Coastguard Worker "v6kz", "v6z", "v6zk", "v6-m", "v6m", "v6sm", "v6s-m", "v7-a",
357*9880d681SAndroid Build Coastguard Worker "v7", "v7a", "v7hl", "v7l", "v7-r", "v7r", "v7-m", "v7m",
358*9880d681SAndroid Build Coastguard Worker "v7k", "v7s", "v7e-m", "v7em", "v8-a", "v8", "v8a", "v8.1-a",
359*9880d681SAndroid Build Coastguard Worker "v8.1a", "v8.2-a", "v8.2a"};
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(Arch); i++) {
362*9880d681SAndroid Build Coastguard Worker std::string arm_1 = "armeb" + (std::string)(Arch[i]);
363*9880d681SAndroid Build Coastguard Worker std::string arm_2 = "arm" + (std::string)(Arch[i]) + "eb";
364*9880d681SAndroid Build Coastguard Worker std::string arm_3 = "arm" + (std::string)(Arch[i]);
365*9880d681SAndroid Build Coastguard Worker std::string thumb_1 = "thumbeb" + (std::string)(Arch[i]);
366*9880d681SAndroid Build Coastguard Worker std::string thumb_2 = "thumb" + (std::string)(Arch[i]) + "eb";
367*9880d681SAndroid Build Coastguard Worker std::string thumb_3 = "thumb" + (std::string)(Arch[i]);
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_BIG, ARM::parseArchEndian(arm_1));
370*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_BIG, ARM::parseArchEndian(arm_2));
371*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_LITTLE, ARM::parseArchEndian(arm_3));
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_ARM, ARM::parseArchISA(arm_1));
374*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_ARM, ARM::parseArchISA(arm_2));
375*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_ARM, ARM::parseArchISA(arm_3));
376*9880d681SAndroid Build Coastguard Worker if (i >= 4) {
377*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_BIG, ARM::parseArchEndian(thumb_1));
378*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_BIG, ARM::parseArchEndian(thumb_2));
379*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_LITTLE, ARM::parseArchEndian(thumb_3));
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_THUMB, ARM::parseArchISA(thumb_1));
382*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_THUMB, ARM::parseArchISA(thumb_2));
383*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_THUMB, ARM::parseArchISA(thumb_3));
384*9880d681SAndroid Build Coastguard Worker }
385*9880d681SAndroid Build Coastguard Worker }
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_LITTLE, ARM::parseArchEndian("aarch64"));
388*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::EK_BIG, ARM::parseArchEndian("aarch64_be"));
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_AARCH64, ARM::parseArchISA("aarch64"));
391*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_AARCH64, ARM::parseArchISA("aarch64_be"));
392*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_AARCH64, ARM::parseArchISA("arm64"));
393*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::IK_AARCH64, ARM::parseArchISA("arm64_be"));
394*9880d681SAndroid Build Coastguard Worker }
395*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseArchProfile)396*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseArchProfile) {
397*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ARMArch); i++) {
398*9880d681SAndroid Build Coastguard Worker switch (ARM::parseArch(ARMArch[i])) {
399*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV6M:
400*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV7M:
401*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV7EM:
402*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV8MMainline:
403*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV8MBaseline:
404*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::PK_M, ARM::parseArchProfile(ARMArch[i]));
405*9880d681SAndroid Build Coastguard Worker continue;
406*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV7R:
407*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::PK_R, ARM::parseArchProfile(ARMArch[i]));
408*9880d681SAndroid Build Coastguard Worker continue;
409*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV7A:
410*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV7K:
411*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV8A:
412*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV8_1A:
413*9880d681SAndroid Build Coastguard Worker case ARM::AK_ARMV8_2A:
414*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::PK_A, ARM::parseArchProfile(ARMArch[i]));
415*9880d681SAndroid Build Coastguard Worker continue;
416*9880d681SAndroid Build Coastguard Worker }
417*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ARM::PK_INVALID, ARM::parseArchProfile(ARMArch[i]));
418*9880d681SAndroid Build Coastguard Worker }
419*9880d681SAndroid Build Coastguard Worker }
420*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,ARMparseArchVersion)421*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, ARMparseArchVersion) {
422*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ARMArch); i++)
423*9880d681SAndroid Build Coastguard Worker if (((std::string)ARMArch[i]).substr(0, 4) == "armv")
424*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((ARMArch[i][4] - 48), ARM::parseArchVersion(ARMArch[i]));
425*9880d681SAndroid Build Coastguard Worker else
426*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(5, ARM::parseArchVersion(ARMArch[i]));
427*9880d681SAndroid Build Coastguard Worker }
428*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64DefaultFPU)429*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64DefaultFPU) {
430*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
431*9880d681SAndroid Build Coastguard Worker AK++)
432*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(kAArch64ARCHNames[AK].DefaultFPU,
433*9880d681SAndroid Build Coastguard Worker AArch64::getDefaultFPU(StringRef("generic"), AK));
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker for (const auto &AArch64CPUName : kAArch64CPUNames)
436*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(AArch64CPUName.DefaultFPU,
437*9880d681SAndroid Build Coastguard Worker AArch64::getDefaultFPU(AArch64CPUName.Name,
438*9880d681SAndroid Build Coastguard Worker static_cast<unsigned>(AArch64CPUName.ID)));
439*9880d681SAndroid Build Coastguard Worker }
440*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64DefaultExt)441*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64DefaultExt) {
442*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
443*9880d681SAndroid Build Coastguard Worker AK++)
444*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(kAArch64ARCHNames[AK].ArchBaseExtensions,
445*9880d681SAndroid Build Coastguard Worker AArch64::getDefaultExtensions(StringRef("generic"), AK));
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker for (const auto &AArch64CPUName : kAArch64CPUNames)
448*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
449*9880d681SAndroid Build Coastguard Worker AArch64CPUName.DefaultExt,
450*9880d681SAndroid Build Coastguard Worker AArch64::getDefaultExtensions(
451*9880d681SAndroid Build Coastguard Worker AArch64CPUName.Name, static_cast<unsigned>(AArch64CPUName.ID)));
452*9880d681SAndroid Build Coastguard Worker }
453*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ExtensionFeatures)454*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ExtensionFeatures) {
455*9880d681SAndroid Build Coastguard Worker std::vector<const char *> Features;
456*9880d681SAndroid Build Coastguard Worker unsigned Extensions = AArch64::AEK_CRC | AArch64::AEK_CRYPTO |
457*9880d681SAndroid Build Coastguard Worker AArch64::AEK_FP | AArch64::AEK_SIMD |
458*9880d681SAndroid Build Coastguard Worker AArch64::AEK_FP16 | AArch64::AEK_PROFILE |
459*9880d681SAndroid Build Coastguard Worker AArch64::AEK_RAS;
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i <= Extensions; i++)
462*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(i == 0 ? !AArch64::getExtensionFeatures(i, Features)
463*9880d681SAndroid Build Coastguard Worker : AArch64::getExtensionFeatures(i, Features));
464*9880d681SAndroid Build Coastguard Worker }
465*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ArchFeatures)466*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ArchFeatures) {
467*9880d681SAndroid Build Coastguard Worker std::vector<const char *> Features;
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
470*9880d681SAndroid Build Coastguard Worker AK++)
471*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((AK == static_cast<unsigned>(AArch64::ArchKind::AK_INVALID) ||
472*9880d681SAndroid Build Coastguard Worker AK == static_cast<unsigned>(AArch64::ArchKind::AK_LAST))
473*9880d681SAndroid Build Coastguard Worker ? !AArch64::getArchFeatures(AK, Features)
474*9880d681SAndroid Build Coastguard Worker : AArch64::getArchFeatures(AK, Features));
475*9880d681SAndroid Build Coastguard Worker }
476*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ArchName)477*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ArchName) {
478*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
479*9880d681SAndroid Build Coastguard Worker AK++)
480*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(AK == static_cast<unsigned>(AArch64::ArchKind::AK_LAST)
481*9880d681SAndroid Build Coastguard Worker ? AArch64::getArchName(AK).empty()
482*9880d681SAndroid Build Coastguard Worker : !AArch64::getArchName(AK).empty());
483*9880d681SAndroid Build Coastguard Worker }
484*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64CPUAttr)485*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64CPUAttr) {
486*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
487*9880d681SAndroid Build Coastguard Worker AK++)
488*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((AK == static_cast<unsigned>(AArch64::ArchKind::AK_INVALID) ||
489*9880d681SAndroid Build Coastguard Worker AK == static_cast<unsigned>(AArch64::ArchKind::AK_LAST))
490*9880d681SAndroid Build Coastguard Worker ? AArch64::getCPUAttr(AK).empty()
491*9880d681SAndroid Build Coastguard Worker : !AArch64::getCPUAttr(AK).empty());
492*9880d681SAndroid Build Coastguard Worker }
493*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64SubArch)494*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64SubArch) {
495*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
496*9880d681SAndroid Build Coastguard Worker AK++)
497*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE((AK == static_cast<unsigned>(AArch64::ArchKind::AK_INVALID) ||
498*9880d681SAndroid Build Coastguard Worker AK == static_cast<unsigned>(AArch64::ArchKind::AK_LAST))
499*9880d681SAndroid Build Coastguard Worker ? AArch64::getSubArch(AK).empty()
500*9880d681SAndroid Build Coastguard Worker : !AArch64::getSubArch(AK).empty());
501*9880d681SAndroid Build Coastguard Worker }
502*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ArchAttr)503*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ArchAttr) {
504*9880d681SAndroid Build Coastguard Worker for (unsigned AK = 0; AK < static_cast<unsigned>(AArch64::ArchKind::AK_LAST);
505*9880d681SAndroid Build Coastguard Worker AK++)
506*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(
507*9880d681SAndroid Build Coastguard Worker AK == static_cast<unsigned>(AArch64::ArchKind::AK_LAST)
508*9880d681SAndroid Build Coastguard Worker ? (ARMBuildAttrs::CPUArch::v8_A == AArch64::getArchAttr(AK))
509*9880d681SAndroid Build Coastguard Worker : (kAArch64ARCHNames[AK].ArchAttr == AArch64::getArchAttr(AK)));
510*9880d681SAndroid Build Coastguard Worker }
511*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ArchExtName)512*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ArchExtName) {
513*9880d681SAndroid Build Coastguard Worker for (AArch64::ArchExtKind AEK = static_cast<AArch64::ArchExtKind>(0);
514*9880d681SAndroid Build Coastguard Worker AEK <= AArch64::ArchExtKind::AEK_RAS;
515*9880d681SAndroid Build Coastguard Worker AEK = static_cast<AArch64::ArchExtKind>(static_cast<unsigned>(AEK) + 1))
516*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(contains(kAArch64ArchExtKinds, static_cast<unsigned>(AEK))
517*9880d681SAndroid Build Coastguard Worker ? !AArch64::getArchExtName(AEK).empty()
518*9880d681SAndroid Build Coastguard Worker : AArch64::getArchExtName(AEK).empty());
519*9880d681SAndroid Build Coastguard Worker }
520*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64ArchExtFeature)521*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64ArchExtFeature) {
522*9880d681SAndroid Build Coastguard Worker const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"},
523*9880d681SAndroid Build Coastguard Worker {"crypto", "nocrypto", "+crypto", "-crypto"},
524*9880d681SAndroid Build Coastguard Worker {"fp", "nofp", "+fp-armv8", "-fp-armv8"},
525*9880d681SAndroid Build Coastguard Worker {"simd", "nosimd", "+neon", "-neon"},
526*9880d681SAndroid Build Coastguard Worker {"fp16", "nofp16", "+fullfp16", "-fullfp16"},
527*9880d681SAndroid Build Coastguard Worker {"profile", "noprofile", "+spe", "-spe"},
528*9880d681SAndroid Build Coastguard Worker {"ras", "noras", "+ras", "-ras"}};
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ArchExt); i++) {
531*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ArchExt[i][2], AArch64::getArchExtFeature(ArchExt[i][0]));
532*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(ArchExt[i][3], AArch64::getArchExtFeature(ArchExt[i][1]));
533*9880d681SAndroid Build Coastguard Worker }
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64DefaultCPU)536*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64DefaultCPU) {
537*9880d681SAndroid Build Coastguard Worker const char *Arch[] = {"armv8a", "armv8-a", "armv8", "armv8.1a",
538*9880d681SAndroid Build Coastguard Worker "armv8.1-a", "armv8.2a", "armv8.2-a"};
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(Arch); i++)
541*9880d681SAndroid Build Coastguard Worker EXPECT_FALSE(AArch64::getDefaultCPU(Arch[i]).empty());
542*9880d681SAndroid Build Coastguard Worker }
543*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64parseArch)544*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64parseArch) {
545*9880d681SAndroid Build Coastguard Worker const char *Arch[] = {"armv8", "armv8a", "armv8-a", "armv8.1a",
546*9880d681SAndroid Build Coastguard Worker "armv8.1-a", "armv8.2a", "armv8.2-a"};
547*9880d681SAndroid Build Coastguard Worker
548*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(Arch); i++)
549*9880d681SAndroid Build Coastguard Worker EXPECT_NE(static_cast<unsigned>(AArch64::ArchKind::AK_INVALID),
550*9880d681SAndroid Build Coastguard Worker AArch64::parseArch(Arch[i]));
551*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned>(AArch64::ArchKind::AK_INVALID),
552*9880d681SAndroid Build Coastguard Worker AArch64::parseArch("aarch64"));
553*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(static_cast<unsigned>(AArch64::ArchKind::AK_INVALID),
554*9880d681SAndroid Build Coastguard Worker AArch64::parseArch("arm64"));
555*9880d681SAndroid Build Coastguard Worker }
556*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64parseArchExt)557*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64parseArchExt) {
558*9880d681SAndroid Build Coastguard Worker const char *ArchExt[] = {"none", "crc", "crypto", "fp",
559*9880d681SAndroid Build Coastguard Worker "simd", "fp16", "profile", "ras"};
560*9880d681SAndroid Build Coastguard Worker
561*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0; i < array_lengthof(ArchExt); i++)
562*9880d681SAndroid Build Coastguard Worker EXPECT_NE(AArch64::AEK_INVALID, AArch64::parseArchExt(ArchExt[i]));
563*9880d681SAndroid Build Coastguard Worker }
564*9880d681SAndroid Build Coastguard Worker
TEST(TargetParserTest,AArch64parseCPUArch)565*9880d681SAndroid Build Coastguard Worker TEST(TargetParserTest, AArch64parseCPUArch) {
566*9880d681SAndroid Build Coastguard Worker const char *CPU[] = {"cortex-a35", "cortex-a53", "cortex-a57",
567*9880d681SAndroid Build Coastguard Worker "cortex-a72", "cortex-a73", "cyclone",
568*9880d681SAndroid Build Coastguard Worker "exynos-m1", "kryo", "vulcan"};
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Worker for (const auto &AArch64CPUName : kAArch64CPUNames)
571*9880d681SAndroid Build Coastguard Worker EXPECT_TRUE(contains(CPU, AArch64CPUName.Name)
572*9880d681SAndroid Build Coastguard Worker ? (static_cast<unsigned>(AArch64::ArchKind::AK_INVALID) !=
573*9880d681SAndroid Build Coastguard Worker AArch64::parseCPUArch(AArch64CPUName.Name))
574*9880d681SAndroid Build Coastguard Worker : (static_cast<unsigned>(AArch64::ArchKind::AK_INVALID) ==
575*9880d681SAndroid Build Coastguard Worker AArch64::parseCPUArch(AArch64CPUName.Name)));
576*9880d681SAndroid Build Coastguard Worker }
577*9880d681SAndroid Build Coastguard Worker }
578