xref: /llvm-project/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp (revision 0cb7636a462a8d4209e2b6344304eb43f02853eb)
1733a8778SCraig Topper //===-- unittests/RISCVISAInfoTest.cpp ------------------------------------===//
2733a8778SCraig Topper //
3733a8778SCraig Topper // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4733a8778SCraig Topper // See https://llvm.org/LICENSE.txt for license information.
5733a8778SCraig Topper // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6733a8778SCraig Topper //
7733a8778SCraig Topper //===----------------------------------------------------------------------===//
8733a8778SCraig Topper 
9733a8778SCraig Topper #include "llvm/TargetParser/RISCVISAInfo.h"
10733a8778SCraig Topper #include "llvm/ADT/StringMap.h"
11733a8778SCraig Topper #include "llvm/Testing/Support/Error.h"
12733a8778SCraig Topper #include "gtest/gtest.h"
13733a8778SCraig Topper 
14733a8778SCraig Topper using ::testing::ElementsAre;
15733a8778SCraig Topper 
16733a8778SCraig Topper using namespace llvm;
17733a8778SCraig Topper 
18733a8778SCraig Topper bool operator==(const RISCVISAUtils::ExtensionVersion &A,
19733a8778SCraig Topper                 const RISCVISAUtils::ExtensionVersion &B) {
20733a8778SCraig Topper   return A.Major == B.Major && A.Minor == B.Minor;
21733a8778SCraig Topper }
22733a8778SCraig Topper 
23941eab10SCraig Topper TEST(ParseNormalizedArchString, RejectsInvalidChars) {
2424c39261SAlex Bradbury   for (StringRef Input : {"RV32", "rV64", "rv32i2P0", "rv64i2p0_A2p0",
2524c39261SAlex Bradbury                           "rv32e2.0", "rva20u64+zbc"}) {
26733a8778SCraig Topper     EXPECT_EQ(
27733a8778SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
28941eab10SCraig Topper         "string may only contain [a-z0-9_]");
29733a8778SCraig Topper   }
30733a8778SCraig Topper }
31733a8778SCraig Topper 
32733a8778SCraig Topper TEST(ParseNormalizedArchString, RejectsInvalidBaseISA) {
33733a8778SCraig Topper   for (StringRef Input : {"rv32", "rv64", "rv32j", "rv65i"}) {
34733a8778SCraig Topper     EXPECT_EQ(
35733a8778SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
36733a8778SCraig Topper         "arch string must begin with valid base ISA");
37733a8778SCraig Topper   }
38733a8778SCraig Topper }
39733a8778SCraig Topper 
40733a8778SCraig Topper TEST(ParseNormalizedArchString, RejectsMalformedInputs) {
41d8f8ac8fSCraig Topper   for (StringRef Input : {"rv64e2p", "rv32i", "rv64ip1"}) {
42733a8778SCraig Topper     EXPECT_EQ(
43733a8778SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
44733a8778SCraig Topper         "extension lacks version in expected format");
45733a8778SCraig Topper   }
46d8f8ac8fSCraig Topper 
47d8f8ac8fSCraig Topper   for (StringRef Input : {"rv64i2p0_", "rv32i2p0__a2p0"}) {
48d8f8ac8fSCraig Topper     EXPECT_EQ(
49d8f8ac8fSCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
50d8f8ac8fSCraig Topper         "extension name missing after separator '_'");
51d8f8ac8fSCraig Topper   }
52733a8778SCraig Topper }
53733a8778SCraig Topper 
547a6847e0SCraig Topper TEST(ParseNormalizedArchString, RejectsOnlyVersion) {
555445a35dSCraig Topper   for (StringRef Input : {"rv64i2p0_1p0", "rv32i2p0_1p0"}) {
565445a35dSCraig Topper     EXPECT_EQ(
575445a35dSCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
585445a35dSCraig Topper         "missing extension name");
595445a35dSCraig Topper   }
605445a35dSCraig Topper }
615445a35dSCraig Topper 
627a6847e0SCraig Topper TEST(ParseNormalizedArchString, RejectsBadZ) {
637a6847e0SCraig Topper   for (StringRef Input : {"rv64i2p0_z1p0", "rv32i2p0_z2a1p0"}) {
647a6847e0SCraig Topper     EXPECT_EQ(
657a6847e0SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
667a6847e0SCraig Topper         "'z' must be followed by a letter");
677a6847e0SCraig Topper   }
687a6847e0SCraig Topper }
697a6847e0SCraig Topper 
706cba93f2SCraig Topper TEST(ParseNormalizedArchString, RejectsBadS) {
716cba93f2SCraig Topper   for (StringRef Input : {"rv64i2p0_s1p0", "rv32i2p0_s2a1p0"}) {
726cba93f2SCraig Topper     EXPECT_EQ(
736cba93f2SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
746cba93f2SCraig Topper         "'s' must be followed by a letter");
756cba93f2SCraig Topper   }
766cba93f2SCraig Topper }
776cba93f2SCraig Topper 
786cba93f2SCraig Topper TEST(ParseNormalizedArchString, RejectsBadX) {
796cba93f2SCraig Topper   for (StringRef Input : {"rv64i2p0_x1p0", "rv32i2p0_x2a1p0"}) {
806cba93f2SCraig Topper     EXPECT_EQ(
816cba93f2SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
826cba93f2SCraig Topper         "'x' must be followed by a letter");
836cba93f2SCraig Topper   }
846cba93f2SCraig Topper }
856cba93f2SCraig Topper 
862c209957SCraig Topper TEST(ParseNormalizedArchString, DuplicateExtension) {
872c209957SCraig Topper   for (StringRef Input : {"rv64i2p0_a2p0_a1p0"}) {
882c209957SCraig Topper     EXPECT_EQ(
892c209957SCraig Topper         toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
902c209957SCraig Topper         "duplicate extension 'a'");
912c209957SCraig Topper   }
922c209957SCraig Topper }
932c209957SCraig Topper 
94733a8778SCraig Topper TEST(ParseNormalizedArchString, AcceptsValidBaseISAsAndSetsXLen) {
95733a8778SCraig Topper   auto MaybeRV32I = RISCVISAInfo::parseNormalizedArchString("rv32i2p0");
96733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());
97733a8778SCraig Topper   RISCVISAInfo &InfoRV32I = **MaybeRV32I;
98733a8778SCraig Topper   EXPECT_EQ(InfoRV32I.getExtensions().size(), 1UL);
99733a8778SCraig Topper   EXPECT_TRUE(InfoRV32I.getExtensions().at("i") ==
100733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
101733a8778SCraig Topper   EXPECT_EQ(InfoRV32I.getXLen(), 32U);
102733a8778SCraig Topper 
103733a8778SCraig Topper   auto MaybeRV32E = RISCVISAInfo::parseNormalizedArchString("rv32e2p0");
104733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32E, Succeeded());
105733a8778SCraig Topper   RISCVISAInfo &InfoRV32E = **MaybeRV32E;
106733a8778SCraig Topper   EXPECT_EQ(InfoRV32E.getExtensions().size(), 1UL);
107733a8778SCraig Topper   EXPECT_TRUE(InfoRV32E.getExtensions().at("e") ==
108733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
109733a8778SCraig Topper   EXPECT_EQ(InfoRV32E.getXLen(), 32U);
110733a8778SCraig Topper 
111733a8778SCraig Topper   auto MaybeRV64I = RISCVISAInfo::parseNormalizedArchString("rv64i2p0");
112733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64I, Succeeded());
113733a8778SCraig Topper   RISCVISAInfo &InfoRV64I = **MaybeRV64I;
114733a8778SCraig Topper   EXPECT_EQ(InfoRV64I.getExtensions().size(), 1UL);
115733a8778SCraig Topper   EXPECT_TRUE(InfoRV64I.getExtensions().at("i") ==
116733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
117733a8778SCraig Topper   EXPECT_EQ(InfoRV64I.getXLen(), 64U);
118733a8778SCraig Topper 
119733a8778SCraig Topper   auto MaybeRV64E = RISCVISAInfo::parseNormalizedArchString("rv64e2p0");
120733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64E, Succeeded());
121733a8778SCraig Topper   RISCVISAInfo &InfoRV64E = **MaybeRV64E;
122733a8778SCraig Topper   EXPECT_EQ(InfoRV64E.getExtensions().size(), 1UL);
123733a8778SCraig Topper   EXPECT_TRUE(InfoRV64E.getExtensions().at("e") ==
124733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
125733a8778SCraig Topper   EXPECT_EQ(InfoRV64E.getXLen(), 64U);
126733a8778SCraig Topper }
127733a8778SCraig Topper 
128733a8778SCraig Topper TEST(ParseNormalizedArchString, AcceptsArbitraryExtensionsAndVersions) {
129733a8778SCraig Topper   auto MaybeISAInfo = RISCVISAInfo::parseNormalizedArchString(
130733a8778SCraig Topper       "rv64i5p1_m3p2_zmadeup11p12_sfoo2p0_xbar3p0");
131733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
132733a8778SCraig Topper   RISCVISAInfo &Info = **MaybeISAInfo;
133733a8778SCraig Topper   EXPECT_EQ(Info.getExtensions().size(), 5UL);
134733a8778SCraig Topper   EXPECT_TRUE(Info.getExtensions().at("i") ==
135733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{5, 1}));
136733a8778SCraig Topper   EXPECT_TRUE(Info.getExtensions().at("m") ==
137733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{3, 2}));
138733a8778SCraig Topper   EXPECT_TRUE(Info.getExtensions().at("zmadeup") ==
139733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{11, 12}));
140733a8778SCraig Topper   EXPECT_TRUE(Info.getExtensions().at("sfoo") ==
141733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
142733a8778SCraig Topper   EXPECT_TRUE(Info.getExtensions().at("xbar") ==
143733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{3, 0}));
144733a8778SCraig Topper }
145733a8778SCraig Topper 
146733a8778SCraig Topper TEST(ParseNormalizedArchString, UpdatesFLenMinVLenMaxELen) {
147733a8778SCraig Topper   auto MaybeISAInfo = RISCVISAInfo::parseNormalizedArchString(
148733a8778SCraig Topper       "rv64i2p0_d2p0_zvl64b1p0_zve64d1p0");
149733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
150733a8778SCraig Topper   RISCVISAInfo &Info = **MaybeISAInfo;
151733a8778SCraig Topper   EXPECT_EQ(Info.getXLen(), 64U);
152733a8778SCraig Topper   EXPECT_EQ(Info.getFLen(), 64U);
153733a8778SCraig Topper   EXPECT_EQ(Info.getMinVLen(), 64U);
154733a8778SCraig Topper   EXPECT_EQ(Info.getMaxELen(), 64U);
155117bda52SCraig Topper   EXPECT_EQ(Info.getMaxELenFp(), 64U);
156733a8778SCraig Topper }
157733a8778SCraig Topper 
1580d93b01cSCraig Topper TEST(ParseNormalizedArchString, AcceptsUnknownMultiletter) {
1590d93b01cSCraig Topper   auto MaybeISAInfo = RISCVISAInfo::parseNormalizedArchString(
1600d93b01cSCraig Topper       "rv64i2p0_f2p0_d2p0_zicsr2p0_ykk1p0");
1610d93b01cSCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
1620d93b01cSCraig Topper   RISCVISAInfo &Info = **MaybeISAInfo;
1630d93b01cSCraig Topper   EXPECT_EQ(Info.toString(), "rv64i2p0_f2p0_d2p0_zicsr2p0_ykk1p0");
1640d93b01cSCraig Topper }
1650d93b01cSCraig Topper 
1660faf4942SCraig Topper TEST(ParseArchString, RejectsInvalidChars) {
167733a8778SCraig Topper   for (StringRef Input : {"RV32", "rV64", "rv32i2P0", "rv64i2p0_A2p0"}) {
168733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
1690faf4942SCraig Topper               "string may only contain [a-z0-9_]");
170733a8778SCraig Topper   }
171733a8778SCraig Topper }
172733a8778SCraig Topper 
173733a8778SCraig Topper TEST(ParseArchString, RejectsInvalidBaseISA) {
174733a8778SCraig Topper   for (StringRef Input : {"rv32", "rv64", "rv65i"}) {
175733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
17609f4b06dSCraig Topper               "string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported "
17709f4b06dSCraig Topper               "profile name");
178733a8778SCraig Topper   }
1796f02120aSDavid Spickett 
1806f02120aSDavid Spickett   for (StringRef Input : {"rv32j", "rv32_i"}) {
181733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
1826f02120aSDavid Spickett               "first letter after 'rv32' should be 'e', 'i' or 'g'");
183733a8778SCraig Topper   }
1846f02120aSDavid Spickett 
1856f02120aSDavid Spickett   EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv64k", true).takeError()),
1866f02120aSDavid Spickett             "first letter after 'rv64' should be 'e', 'i' or 'g'");
187733a8778SCraig Topper }
188733a8778SCraig Topper 
189733a8778SCraig Topper TEST(ParseArchString, RejectsUnsupportedBaseISA) {
190733a8778SCraig Topper   for (StringRef Input : {"rv128i", "rv128g"}) {
191733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
19209f4b06dSCraig Topper               "string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported "
19309f4b06dSCraig Topper               "profile name");
194733a8778SCraig Topper   }
195733a8778SCraig Topper }
196733a8778SCraig Topper 
197733a8778SCraig Topper TEST(ParseArchString, AcceptsSupportedBaseISAsAndSetsXLenAndFLen) {
198733a8778SCraig Topper   auto MaybeRV32I = RISCVISAInfo::parseArchString("rv32i", true);
199733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());
200733a8778SCraig Topper   RISCVISAInfo &InfoRV32I = **MaybeRV32I;
201de375fbcSCraig Topper   const auto &ExtsRV32I = InfoRV32I.getExtensions();
202733a8778SCraig Topper   EXPECT_EQ(ExtsRV32I.size(), 1UL);
203733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32I.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
204733a8778SCraig Topper   EXPECT_EQ(InfoRV32I.getXLen(), 32U);
205733a8778SCraig Topper   EXPECT_EQ(InfoRV32I.getFLen(), 0U);
206117bda52SCraig Topper   EXPECT_EQ(InfoRV32I.getMinVLen(), 0U);
207117bda52SCraig Topper   EXPECT_EQ(InfoRV32I.getMaxELen(), 0U);
208117bda52SCraig Topper   EXPECT_EQ(InfoRV32I.getMaxELenFp(), 0U);
209733a8778SCraig Topper 
210733a8778SCraig Topper   auto MaybeRV32E = RISCVISAInfo::parseArchString("rv32e", true);
211733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32E, Succeeded());
212733a8778SCraig Topper   RISCVISAInfo &InfoRV32E = **MaybeRV32E;
213de375fbcSCraig Topper   const auto &ExtsRV32E = InfoRV32E.getExtensions();
214733a8778SCraig Topper   EXPECT_EQ(ExtsRV32E.size(), 1UL);
215733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32E.at("e") == (RISCVISAUtils::ExtensionVersion{2, 0}));
216733a8778SCraig Topper   EXPECT_EQ(InfoRV32E.getXLen(), 32U);
217733a8778SCraig Topper   EXPECT_EQ(InfoRV32E.getFLen(), 0U);
218117bda52SCraig Topper   EXPECT_EQ(InfoRV32E.getMinVLen(), 0U);
219117bda52SCraig Topper   EXPECT_EQ(InfoRV32E.getMaxELen(), 0U);
220117bda52SCraig Topper   EXPECT_EQ(InfoRV32E.getMaxELenFp(), 0U);
221733a8778SCraig Topper 
222733a8778SCraig Topper   auto MaybeRV32G = RISCVISAInfo::parseArchString("rv32g", true);
223733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32G, Succeeded());
224733a8778SCraig Topper   RISCVISAInfo &InfoRV32G = **MaybeRV32G;
225de375fbcSCraig Topper   const auto &ExtsRV32G = InfoRV32G.getExtensions();
226bd15c7c1SJim Lin   EXPECT_EQ(ExtsRV32G.size(), 10UL);
227733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
228733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("m") == (RISCVISAUtils::ExtensionVersion{2, 0}));
229733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("a") == (RISCVISAUtils::ExtensionVersion{2, 1}));
230733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("f") == (RISCVISAUtils::ExtensionVersion{2, 2}));
231733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("d") == (RISCVISAUtils::ExtensionVersion{2, 2}));
232733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("zicsr") == (RISCVISAUtils::ExtensionVersion{2, 0}));
233733a8778SCraig Topper   EXPECT_TRUE(ExtsRV32G.at("zifencei") ==
234733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
23576254656SJianjian Guan   EXPECT_TRUE(ExtsRV32G.at("zmmul") == (RISCVISAUtils::ExtensionVersion{1, 0}));
236bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV32G.at("zaamo") == (RISCVISAUtils::ExtensionVersion{1, 0}));
237bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV32G.at("zalrsc") ==
238bd15c7c1SJim Lin               (RISCVISAUtils::ExtensionVersion{1, 0}));
239733a8778SCraig Topper   EXPECT_EQ(InfoRV32G.getXLen(), 32U);
240733a8778SCraig Topper   EXPECT_EQ(InfoRV32G.getFLen(), 64U);
241117bda52SCraig Topper   EXPECT_EQ(InfoRV32G.getMinVLen(), 0U);
242117bda52SCraig Topper   EXPECT_EQ(InfoRV32G.getMaxELen(), 0U);
243117bda52SCraig Topper   EXPECT_EQ(InfoRV32G.getMaxELenFp(), 0U);
244733a8778SCraig Topper 
245733a8778SCraig Topper   auto MaybeRV64I = RISCVISAInfo::parseArchString("rv64i", true);
246733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64I, Succeeded());
247733a8778SCraig Topper   RISCVISAInfo &InfoRV64I = **MaybeRV64I;
248de375fbcSCraig Topper   const auto &ExtsRV64I = InfoRV64I.getExtensions();
249733a8778SCraig Topper   EXPECT_EQ(ExtsRV64I.size(), 1UL);
250733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64I.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
251733a8778SCraig Topper   EXPECT_EQ(InfoRV64I.getXLen(), 64U);
252733a8778SCraig Topper   EXPECT_EQ(InfoRV64I.getFLen(), 0U);
253117bda52SCraig Topper   EXPECT_EQ(InfoRV64I.getMinVLen(), 0U);
254117bda52SCraig Topper   EXPECT_EQ(InfoRV64I.getMaxELen(), 0U);
255117bda52SCraig Topper   EXPECT_EQ(InfoRV64I.getMaxELenFp(), 0U);
256733a8778SCraig Topper 
257733a8778SCraig Topper   auto MaybeRV64E = RISCVISAInfo::parseArchString("rv64e", true);
258733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64E, Succeeded());
259733a8778SCraig Topper   RISCVISAInfo &InfoRV64E = **MaybeRV64E;
260de375fbcSCraig Topper   const auto &ExtsRV64E = InfoRV64E.getExtensions();
261733a8778SCraig Topper   EXPECT_EQ(ExtsRV64E.size(), 1UL);
262733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64E.at("e") == (RISCVISAUtils::ExtensionVersion{2, 0}));
263733a8778SCraig Topper   EXPECT_EQ(InfoRV64E.getXLen(), 64U);
264733a8778SCraig Topper   EXPECT_EQ(InfoRV64E.getFLen(), 0U);
265117bda52SCraig Topper   EXPECT_EQ(InfoRV64E.getMinVLen(), 0U);
266117bda52SCraig Topper   EXPECT_EQ(InfoRV64E.getMaxELen(), 0U);
267117bda52SCraig Topper   EXPECT_EQ(InfoRV64E.getMaxELenFp(), 0U);
268733a8778SCraig Topper 
269733a8778SCraig Topper   auto MaybeRV64G = RISCVISAInfo::parseArchString("rv64g", true);
270733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64G, Succeeded());
271733a8778SCraig Topper   RISCVISAInfo &InfoRV64G = **MaybeRV64G;
272de375fbcSCraig Topper   const auto &ExtsRV64G = InfoRV64G.getExtensions();
273bd15c7c1SJim Lin   EXPECT_EQ(ExtsRV64G.size(), 10UL);
274733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
275733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("m") == (RISCVISAUtils::ExtensionVersion{2, 0}));
276733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("a") == (RISCVISAUtils::ExtensionVersion{2, 1}));
277733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("f") == (RISCVISAUtils::ExtensionVersion{2, 2}));
278733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("d") == (RISCVISAUtils::ExtensionVersion{2, 2}));
279733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("zicsr") == (RISCVISAUtils::ExtensionVersion{2, 0}));
280733a8778SCraig Topper   EXPECT_TRUE(ExtsRV64G.at("zifencei") ==
281733a8778SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
282036cd27dSJim Tsung-Chun Lin   EXPECT_TRUE(ExtsRV64G.at("zmmul") == (RISCVISAUtils::ExtensionVersion{1, 0}));
283bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV64G.at("zaamo") == (RISCVISAUtils::ExtensionVersion{1, 0}));
284bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV64G.at("zalrsc") ==
285bd15c7c1SJim Lin               (RISCVISAUtils::ExtensionVersion{1, 0}));
286733a8778SCraig Topper   EXPECT_EQ(InfoRV64G.getXLen(), 64U);
287733a8778SCraig Topper   EXPECT_EQ(InfoRV64G.getFLen(), 64U);
288117bda52SCraig Topper   EXPECT_EQ(InfoRV64G.getMinVLen(), 0U);
289117bda52SCraig Topper   EXPECT_EQ(InfoRV64G.getMaxELen(), 0U);
290117bda52SCraig Topper   EXPECT_EQ(InfoRV64G.getMaxELenFp(), 0U);
291117bda52SCraig Topper 
292117bda52SCraig Topper   auto MaybeRV64GCV = RISCVISAInfo::parseArchString("rv64gcv", true);
293117bda52SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64GCV, Succeeded());
294117bda52SCraig Topper   RISCVISAInfo &InfoRV64GCV = **MaybeRV64GCV;
295117bda52SCraig Topper   const auto &ExtsRV64GCV = InfoRV64GCV.getExtensions();
296bd15c7c1SJim Lin   EXPECT_EQ(ExtsRV64GCV.size(), 20UL);
297117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
298117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("m") == (RISCVISAUtils::ExtensionVersion{2, 0}));
299117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("a") == (RISCVISAUtils::ExtensionVersion{2, 1}));
300117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("f") == (RISCVISAUtils::ExtensionVersion{2, 2}));
301117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("d") == (RISCVISAUtils::ExtensionVersion{2, 2}));
302117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("c") == (RISCVISAUtils::ExtensionVersion{2, 0}));
303117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zicsr") == (RISCVISAUtils::ExtensionVersion{2, 0}));
304117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zifencei") ==
305117bda52SCraig Topper               (RISCVISAUtils::ExtensionVersion{2, 0}));
306036cd27dSJim Tsung-Chun Lin   EXPECT_TRUE(ExtsRV64G.at("zmmul") == (RISCVISAUtils::ExtensionVersion{1, 0}));
307bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV64G.at("zaamo") == (RISCVISAUtils::ExtensionVersion{1, 0}));
308bd15c7c1SJim Lin   EXPECT_TRUE(ExtsRV64G.at("zalrsc") ==
309bd15c7c1SJim Lin               (RISCVISAUtils::ExtensionVersion{1, 0}));
310117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("v") == (RISCVISAUtils::ExtensionVersion{1, 0}));
311117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zve32x") == (RISCVISAUtils::ExtensionVersion{1, 0}));
312117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zve32f") == (RISCVISAUtils::ExtensionVersion{1, 0}));
313117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zve64x") == (RISCVISAUtils::ExtensionVersion{1, 0}));
314117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zve64f") == (RISCVISAUtils::ExtensionVersion{1, 0}));
315117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zve64d") == (RISCVISAUtils::ExtensionVersion{1, 0}));
316117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zvl32b") == (RISCVISAUtils::ExtensionVersion{1, 0}));
317117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zvl64b") == (RISCVISAUtils::ExtensionVersion{1, 0}));
318117bda52SCraig Topper   EXPECT_TRUE(ExtsRV64GCV.at("zvl128b") == (RISCVISAUtils::ExtensionVersion{1, 0}));
319117bda52SCraig Topper   EXPECT_EQ(InfoRV64GCV.getXLen(), 64U);
320117bda52SCraig Topper   EXPECT_EQ(InfoRV64GCV.getFLen(), 64U);
321117bda52SCraig Topper   EXPECT_EQ(InfoRV64GCV.getMinVLen(), 128U);
322117bda52SCraig Topper   EXPECT_EQ(InfoRV64GCV.getMaxELen(), 64U);
323117bda52SCraig Topper   EXPECT_EQ(InfoRV64GCV.getMaxELenFp(), 64U);
324733a8778SCraig Topper }
325733a8778SCraig Topper 
326733a8778SCraig Topper TEST(ParseArchString, RejectsUnrecognizedExtensionNamesByDefault) {
327733a8778SCraig Topper   EXPECT_EQ(
328733a8778SCraig Topper       toString(
329733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv32i_zmadeup", true).takeError()),
330733a8778SCraig Topper       "unsupported standard user-level extension 'zmadeup'");
331733a8778SCraig Topper   EXPECT_EQ(
332733a8778SCraig Topper       toString(
333733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv64g_smadeup", true).takeError()),
334733a8778SCraig Topper       "unsupported standard supervisor-level extension 'smadeup'");
335733a8778SCraig Topper   EXPECT_EQ(
336733a8778SCraig Topper       toString(
337733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv64g_xmadeup", true).takeError()),
338733a8778SCraig Topper       "unsupported non-standard user-level extension 'xmadeup'");
339733a8778SCraig Topper   EXPECT_EQ(
340733a8778SCraig Topper       toString(
341733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv32i_zmadeup1p0", true).takeError()),
342733a8778SCraig Topper       "unsupported standard user-level extension 'zmadeup'");
343733a8778SCraig Topper   EXPECT_EQ(
344733a8778SCraig Topper       toString(
345733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv64g_smadeup1p0", true).takeError()),
346733a8778SCraig Topper       "unsupported standard supervisor-level extension 'smadeup'");
347733a8778SCraig Topper   EXPECT_EQ(
348733a8778SCraig Topper       toString(
349733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv64g_xmadeup1p0", true).takeError()),
350733a8778SCraig Topper       "unsupported non-standard user-level extension 'xmadeup'");
351733a8778SCraig Topper }
352733a8778SCraig Topper 
353733a8778SCraig Topper TEST(ParseArchString, AcceptsVersionInLongOrShortForm) {
354733a8778SCraig Topper   for (StringRef Input : {"rv64i2p1"}) {
355733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
356733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
357de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
358733a8778SCraig Topper     EXPECT_TRUE(Exts.at("i") == (RISCVISAUtils::ExtensionVersion{2, 1}));
359733a8778SCraig Topper   }
360733a8778SCraig Topper   for (StringRef Input : {"rv32i_zfinx1", "rv32i_zfinx1p0"}) {
361733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
362733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
363de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
364733a8778SCraig Topper     EXPECT_TRUE(Exts.at("zfinx") == (RISCVISAUtils::ExtensionVersion{1, 0}));
365733a8778SCraig Topper   }
366733a8778SCraig Topper }
367733a8778SCraig Topper 
368733a8778SCraig Topper TEST(ParseArchString, RejectsUnrecognizedExtensionVersionsByDefault) {
369733a8778SCraig Topper   EXPECT_EQ(
370733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv64i2p", true).takeError()),
371733a8778SCraig Topper       "minor version number missing after 'p' for extension 'i'");
372733a8778SCraig Topper   EXPECT_EQ(
373733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv64i1p0", true).takeError()),
374733a8778SCraig Topper       "unsupported version number 1.0 for extension 'i'");
375733a8778SCraig Topper   EXPECT_EQ(
376733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv64i9p9", true).takeError()),
377733a8778SCraig Topper       "unsupported version number 9.9 for extension 'i'");
378733a8778SCraig Topper   EXPECT_EQ(
379733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv32im0p1", true).takeError()),
380733a8778SCraig Topper       "unsupported version number 0.1 for extension 'm'");
381733a8778SCraig Topper   EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv32izifencei10p10", true)
382733a8778SCraig Topper                          .takeError()),
383733a8778SCraig Topper             "unsupported version number 10.10 for extension 'zifencei'");
384733a8778SCraig Topper }
385733a8778SCraig Topper 
386733a8778SCraig Topper TEST(ParseArchString, AcceptsUnderscoreSplittingExtensions) {
387733a8778SCraig Topper   for (StringRef Input : {"rv32imafdczifencei", "rv32i_m_a_f_d_c_zifencei"}) {
388733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
389733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
390de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
391bd15c7c1SJim Lin     EXPECT_EQ(Exts.size(), 11UL);
392733a8778SCraig Topper     EXPECT_EQ(Exts.count("i"), 1U);
393733a8778SCraig Topper     EXPECT_EQ(Exts.count("m"), 1U);
394733a8778SCraig Topper     EXPECT_EQ(Exts.count("a"), 1U);
395733a8778SCraig Topper     EXPECT_EQ(Exts.count("f"), 1U);
396733a8778SCraig Topper     EXPECT_EQ(Exts.count("d"), 1U);
397733a8778SCraig Topper     EXPECT_EQ(Exts.count("c"), 1U);
398733a8778SCraig Topper     EXPECT_EQ(Exts.count("zicsr"), 1U);
399733a8778SCraig Topper     EXPECT_EQ(Exts.count("zifencei"), 1U);
40076254656SJianjian Guan     EXPECT_EQ(Exts.count("zmmul"), 1U);
401bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zaamo"), 1U);
402bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zalrsc"), 1U);
403733a8778SCraig Topper   }
404733a8778SCraig Topper }
405733a8778SCraig Topper 
406733a8778SCraig Topper TEST(ParseArchString, AcceptsRelaxSingleLetterExtensions) {
407733a8778SCraig Topper   for (StringRef Input :
408733a8778SCraig Topper        {"rv32imfad", "rv32im_fa_d", "rv32im2p0fad", "rv32i2p1m2p0fad"}) {
409733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
410733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
411de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
412bd15c7c1SJim Lin     EXPECT_EQ(Exts.size(), 9UL);
413733a8778SCraig Topper     EXPECT_EQ(Exts.count("i"), 1U);
414733a8778SCraig Topper     EXPECT_EQ(Exts.count("m"), 1U);
415733a8778SCraig Topper     EXPECT_EQ(Exts.count("f"), 1U);
416733a8778SCraig Topper     EXPECT_EQ(Exts.count("a"), 1U);
417733a8778SCraig Topper     EXPECT_EQ(Exts.count("d"), 1U);
418733a8778SCraig Topper     EXPECT_EQ(Exts.count("zicsr"), 1U);
41976254656SJianjian Guan     EXPECT_EQ(Exts.count("zmmul"), 1U);
420bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zaamo"), 1U);
421bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zalrsc"), 1U);
422733a8778SCraig Topper   }
423733a8778SCraig Topper }
424733a8778SCraig Topper 
425733a8778SCraig Topper TEST(ParseArchString, AcceptsRelaxMixedLetterExtensions) {
426733a8778SCraig Topper   for (StringRef Input :
427733a8778SCraig Topper        {"rv32i_zihintntl_m_a_f_d_svinval", "rv32izihintntl_mafdsvinval",
428733a8778SCraig Topper         "rv32i_zihintntl_mafd_svinval"}) {
429733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
430733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
431de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
432bd15c7c1SJim Lin     EXPECT_EQ(Exts.size(), 11UL);
433733a8778SCraig Topper     EXPECT_EQ(Exts.count("i"), 1U);
434733a8778SCraig Topper     EXPECT_EQ(Exts.count("m"), 1U);
435733a8778SCraig Topper     EXPECT_EQ(Exts.count("a"), 1U);
436733a8778SCraig Topper     EXPECT_EQ(Exts.count("f"), 1U);
437733a8778SCraig Topper     EXPECT_EQ(Exts.count("d"), 1U);
438733a8778SCraig Topper     EXPECT_EQ(Exts.count("zihintntl"), 1U);
439733a8778SCraig Topper     EXPECT_EQ(Exts.count("svinval"), 1U);
440733a8778SCraig Topper     EXPECT_EQ(Exts.count("zicsr"), 1U);
44176254656SJianjian Guan     EXPECT_EQ(Exts.count("zmmul"), 1U);
442bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zaamo"), 1U);
443bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zalrsc"), 1U);
444733a8778SCraig Topper   }
445733a8778SCraig Topper }
446733a8778SCraig Topper 
447733a8778SCraig Topper TEST(ParseArchString, AcceptsAmbiguousFromRelaxExtensions) {
448733a8778SCraig Topper   for (StringRef Input : {"rv32i_zba_m", "rv32izba_m", "rv32izba1p0_m2p0"}) {
449733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
450733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
451de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
45276254656SJianjian Guan     EXPECT_EQ(Exts.size(), 4UL);
453733a8778SCraig Topper     EXPECT_EQ(Exts.count("i"), 1U);
454733a8778SCraig Topper     EXPECT_EQ(Exts.count("zba"), 1U);
455733a8778SCraig Topper     EXPECT_EQ(Exts.count("m"), 1U);
45676254656SJianjian Guan     EXPECT_EQ(Exts.count("zmmul"), 1U);
457733a8778SCraig Topper   }
458733a8778SCraig Topper   for (StringRef Input :
459733a8778SCraig Topper        {"rv32ia_zba_m", "rv32iazba_m", "rv32ia2p1zba1p0_m2p0"}) {
460733a8778SCraig Topper     auto MaybeISAInfo = RISCVISAInfo::parseArchString(Input, true);
461733a8778SCraig Topper     ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
462de375fbcSCraig Topper     const auto &Exts = (*MaybeISAInfo)->getExtensions();
463bd15c7c1SJim Lin     EXPECT_EQ(Exts.size(), 7UL);
464733a8778SCraig Topper     EXPECT_EQ(Exts.count("i"), 1U);
465733a8778SCraig Topper     EXPECT_EQ(Exts.count("zba"), 1U);
466733a8778SCraig Topper     EXPECT_EQ(Exts.count("m"), 1U);
467733a8778SCraig Topper     EXPECT_EQ(Exts.count("a"), 1U);
46876254656SJianjian Guan     EXPECT_EQ(Exts.count("zmmul"), 1U);
469bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zaamo"), 1U);
470bd15c7c1SJim Lin     EXPECT_EQ(Exts.count("zalrsc"), 1U);
471733a8778SCraig Topper   }
472733a8778SCraig Topper }
473733a8778SCraig Topper 
474733a8778SCraig Topper TEST(ParseArchString, RejectsRelaxExtensionsNotStartWithEorIorG) {
475733a8778SCraig Topper   EXPECT_EQ(
476733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv32zba_im", true).takeError()),
4776f02120aSDavid Spickett       "first letter after 'rv32' should be 'e', 'i' or 'g'");
478733a8778SCraig Topper }
479733a8778SCraig Topper 
480733a8778SCraig Topper TEST(ParseArchString,
481733a8778SCraig Topper      RejectsMultiLetterExtensionFollowBySingleLetterExtensions) {
482733a8778SCraig Topper   for (StringRef Input : {"rv32izbam", "rv32i_zbam"})
483733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
484733a8778SCraig Topper               "unsupported standard user-level extension 'zbam'");
485733a8778SCraig Topper   EXPECT_EQ(
486733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv32izbai_m", true).takeError()),
487733a8778SCraig Topper       "unsupported standard user-level extension 'zbai'");
488733a8778SCraig Topper   EXPECT_EQ(
489733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv32izbaim", true).takeError()),
490733a8778SCraig Topper       "unsupported standard user-level extension 'zbaim'");
491733a8778SCraig Topper   EXPECT_EQ(
492733a8778SCraig Topper       toString(
493733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv32i_zba1p0m", true).takeError()),
494733a8778SCraig Topper       "unsupported standard user-level extension 'zba1p0m'");
495733a8778SCraig Topper }
496733a8778SCraig Topper 
497733a8778SCraig Topper TEST(ParseArchString, RejectsDoubleOrTrailingUnderscore) {
498733a8778SCraig Topper   EXPECT_EQ(
499733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv64i__m", true).takeError()),
500733a8778SCraig Topper       "extension name missing after separator '_'");
501733a8778SCraig Topper 
502733a8778SCraig Topper   for (StringRef Input :
503733a8778SCraig Topper        {"rv32ezicsr__zifencei", "rv32i_", "rv32izicsr_", "rv64im_"}) {
504733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
505733a8778SCraig Topper               "extension name missing after separator '_'");
506733a8778SCraig Topper   }
507733a8778SCraig Topper }
508733a8778SCraig Topper 
509733a8778SCraig Topper TEST(ParseArchString, RejectsDuplicateExtensionNames) {
510733a8778SCraig Topper   EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv64ii", true).takeError()),
511733a8778SCraig Topper             "invalid standard user-level extension 'i'");
512733a8778SCraig Topper   EXPECT_EQ(toString(RISCVISAInfo::parseArchString("rv32ee", true).takeError()),
513733a8778SCraig Topper             "invalid standard user-level extension 'e'");
514733a8778SCraig Topper   EXPECT_EQ(
515733a8778SCraig Topper       toString(RISCVISAInfo::parseArchString("rv64imm", true).takeError()),
516733a8778SCraig Topper       "duplicated standard user-level extension 'm'");
517733a8778SCraig Topper   EXPECT_EQ(
518733a8778SCraig Topper       toString(
519733a8778SCraig Topper           RISCVISAInfo::parseArchString("rv32i_zicsr_zicsr", true).takeError()),
520733a8778SCraig Topper       "duplicated standard user-level extension 'zicsr'");
521733a8778SCraig Topper }
522733a8778SCraig Topper 
523733a8778SCraig Topper TEST(ParseArchString,
524733a8778SCraig Topper      RejectsExperimentalExtensionsIfNotEnableExperimentalExtension) {
525733a8778SCraig Topper   EXPECT_EQ(
52690d79e25SPhilip Reames       toString(RISCVISAInfo::parseArchString("rv64izalasr", false).takeError()),
527733a8778SCraig Topper       "requires '-menable-experimental-extensions' for experimental extension "
52890d79e25SPhilip Reames       "'zalasr'");
529733a8778SCraig Topper }
530733a8778SCraig Topper 
531733a8778SCraig Topper TEST(ParseArchString,
532733a8778SCraig Topper      AcceptsExperimentalExtensionsIfEnableExperimentalExtension) {
53390d79e25SPhilip Reames   // Note: If zalasr becomes none-experimental, this test will need
534733a8778SCraig Topper   // updating (and unfortunately, it will still pass). The failure of
535733a8778SCraig Topper   // RejectsExperimentalExtensionsIfNotEnableExperimentalExtension will
536733a8778SCraig Topper   // hopefully serve as a reminder to update.
53790d79e25SPhilip Reames   auto MaybeISAInfo = RISCVISAInfo::parseArchString("rv64izalasr", true, false);
538733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
539de375fbcSCraig Topper   const auto &Exts = (*MaybeISAInfo)->getExtensions();
540733a8778SCraig Topper   EXPECT_EQ(Exts.size(), 2UL);
54190d79e25SPhilip Reames   EXPECT_EQ(Exts.count("zalasr"), 1U);
54290d79e25SPhilip Reames   auto MaybeISAInfo2 = RISCVISAInfo::parseArchString("rv64izalasr0p1", true);
543733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo2, Succeeded());
544de375fbcSCraig Topper   const auto &Exts2 = (*MaybeISAInfo2)->getExtensions();
545733a8778SCraig Topper   EXPECT_EQ(Exts2.size(), 2UL);
54690d79e25SPhilip Reames   EXPECT_EQ(Exts2.count("zalasr"), 1U);
547733a8778SCraig Topper }
548733a8778SCraig Topper 
549733a8778SCraig Topper TEST(ParseArchString,
550733a8778SCraig Topper      RequiresExplicitVersionNumberForExperimentalExtensionByDefault) {
551733a8778SCraig Topper   EXPECT_EQ(
55290d79e25SPhilip Reames       toString(RISCVISAInfo::parseArchString("rv64izalasr", true).takeError()),
55390d79e25SPhilip Reames       "experimental extension requires explicit version number `zalasr`");
554733a8778SCraig Topper }
555733a8778SCraig Topper 
556733a8778SCraig Topper TEST(ParseArchString,
557733a8778SCraig Topper      AcceptsUnrecognizedVersionIfNotExperimentalExtensionVersionCheck) {
558733a8778SCraig Topper   auto MaybeISAInfo =
55990d79e25SPhilip Reames       RISCVISAInfo::parseArchString("rv64izalasr9p9", true, false);
560733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
561de375fbcSCraig Topper   const auto &Exts = (*MaybeISAInfo)->getExtensions();
562733a8778SCraig Topper   EXPECT_EQ(Exts.size(), 2UL);
56390d79e25SPhilip Reames   EXPECT_TRUE(Exts.at("zalasr") == (RISCVISAUtils::ExtensionVersion{9, 9}));
564733a8778SCraig Topper }
565733a8778SCraig Topper 
566733a8778SCraig Topper TEST(ParseArchString, RejectsUnrecognizedVersionForExperimentalExtension) {
567733a8778SCraig Topper   EXPECT_EQ(
56890d79e25SPhilip Reames       toString(
56990d79e25SPhilip Reames           RISCVISAInfo::parseArchString("rv64izalasr9p9", true).takeError()),
57090d79e25SPhilip Reames       "unsupported version number 9.9 for experimental extension 'zalasr' "
571733a8778SCraig Topper       "(this compiler supports 0.1)");
572733a8778SCraig Topper }
573733a8778SCraig Topper 
574733a8778SCraig Topper TEST(ParseArchString, RejectsExtensionVersionForG) {
575733a8778SCraig Topper   for (StringRef Input : {"rv32g1c", "rv64g2p0"}) {
576733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
577733a8778SCraig Topper               "version not supported for 'g'");
578733a8778SCraig Topper   }
579733a8778SCraig Topper }
580733a8778SCraig Topper 
581733a8778SCraig Topper TEST(ParseArchString, AddsImpliedExtensions) {
582733a8778SCraig Topper   // Does not attempt to exhaustively test all implications.
583733a8778SCraig Topper   auto MaybeRV64ID = RISCVISAInfo::parseArchString("rv64id", true);
584733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64ID, Succeeded());
585de375fbcSCraig Topper   const auto &ExtsRV64ID = (*MaybeRV64ID)->getExtensions();
586733a8778SCraig Topper   EXPECT_EQ(ExtsRV64ID.size(), 4UL);
587733a8778SCraig Topper   EXPECT_EQ(ExtsRV64ID.count("i"), 1U);
588733a8778SCraig Topper   EXPECT_EQ(ExtsRV64ID.count("f"), 1U);
589733a8778SCraig Topper   EXPECT_EQ(ExtsRV64ID.count("d"), 1U);
590733a8778SCraig Topper   EXPECT_EQ(ExtsRV64ID.count("zicsr"), 1U);
591733a8778SCraig Topper 
592733a8778SCraig Topper   auto MaybeRV32IZKN = RISCVISAInfo::parseArchString("rv64izkn", true);
593733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32IZKN, Succeeded());
594de375fbcSCraig Topper   const auto &ExtsRV32IZKN = (*MaybeRV32IZKN)->getExtensions();
595733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.size(), 8UL);
596733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("i"), 1U);
597733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zbkb"), 1U);
598733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zbkc"), 1U);
599733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zbkx"), 1U);
600733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zkne"), 1U);
601733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zknd"), 1U);
602733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zknh"), 1U);
603733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZKN.count("zkn"), 1U);
604733a8778SCraig Topper }
605733a8778SCraig Topper 
606733a8778SCraig Topper TEST(ParseArchString, RejectsConflictingExtensions) {
607733a8778SCraig Topper   for (StringRef Input : {"rv32ifzfinx", "rv64gzdinx"}) {
608733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
609733a8778SCraig Topper               "'f' and 'zfinx' extensions are incompatible");
610733a8778SCraig Topper   }
611733a8778SCraig Topper 
612733a8778SCraig Topper   for (StringRef Input : {"rv32idc_zcmp1p0", "rv64idc_zcmp1p0"}) {
613733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
614733a8778SCraig Topper               "'zcmp' extension is incompatible with 'c' extension when 'd' "
615733a8778SCraig Topper               "extension is enabled");
616733a8778SCraig Topper   }
617733a8778SCraig Topper 
618733a8778SCraig Topper   for (StringRef Input : {"rv32id_zcd1p0_zcmp1p0", "rv64id_zcd1p0_zcmp1p0"}) {
619733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
620733a8778SCraig Topper               "'zcmp' extension is incompatible with 'zcd' extension when 'd' "
621733a8778SCraig Topper               "extension is enabled");
622733a8778SCraig Topper   }
623733a8778SCraig Topper 
624733a8778SCraig Topper   for (StringRef Input : {"rv32idc_zcmt1p0", "rv64idc_zcmt1p0"}) {
625733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
626733a8778SCraig Topper               "'zcmt' extension is incompatible with 'c' extension when 'd' "
627733a8778SCraig Topper               "extension is enabled");
628733a8778SCraig Topper   }
629733a8778SCraig Topper 
630733a8778SCraig Topper   for (StringRef Input : {"rv32id_zcd1p0_zcmt1p0", "rv64id_zcd1p0_zcmt1p0"}) {
631733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
632733a8778SCraig Topper               "'zcmt' extension is incompatible with 'zcd' extension when 'd' "
633733a8778SCraig Topper               "extension is enabled");
634733a8778SCraig Topper   }
635733a8778SCraig Topper 
636733a8778SCraig Topper   for (StringRef Input : {"rv64if_zcf"}) {
637733a8778SCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
638733a8778SCraig Topper               "'zcf' is only supported for 'rv32'");
639733a8778SCraig Topper   }
640f802c39cSCraig Topper 
641f802c39cSCraig Topper   for (StringRef Input : {"rv64i_xwchc"}) {
642f802c39cSCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
643371f936cSCraig Topper               "'xwchc' is only supported for 'rv32'");
644f802c39cSCraig Topper   }
645f802c39cSCraig Topper 
646f802c39cSCraig Topper   for (StringRef Input : {"rv32id_xwchc"}) {
647f802c39cSCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
648371f936cSCraig Topper               "'d' and 'xwchc' extensions are incompatible");
649f802c39cSCraig Topper   }
650f802c39cSCraig Topper 
651f802c39cSCraig Topper   for (StringRef Input : {"rv32i_zcb_xwchc"}) {
652f802c39cSCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
653371f936cSCraig Topper               "'xwchc' and 'zcb' extensions are incompatible");
654f802c39cSCraig Topper   }
6558fcbba82SSudharsan Veeravalli 
6565c5f6693SSudharsan Veeravalli   for (StringRef Input :
6572d068879Squic_hchandel        {"rv64i_xqcisls0p2", "rv64i_xqcia0p2", "rv64i_xqciac0p3",
658737d6ca4Squic_hchandel         "rv64i_xqcicsr0p2", "rv64i_xqcilsm0p2", "rv64i_xqcicm0p2",
659163935a4Squic_hchandel         "rv64i_xqcics0p2", "rv64i_xqcicli0p2", "rv64i_xqciint0p2",
660163935a4Squic_hchandel         "rv64i_xqcilo0p2"}) {
6615c5f6693SSudharsan Veeravalli     EXPECT_THAT(
6625c5f6693SSudharsan Veeravalli         toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
6635c5f6693SSudharsan Veeravalli         ::testing::EndsWith(" is only supported for 'rv32'"));
6646881c6d2SSudharsan Veeravalli   }
665f802c39cSCraig Topper }
666f802c39cSCraig Topper 
667f802c39cSCraig Topper TEST(ParseArchString, MissingDepency) {
668f802c39cSCraig Topper   for (StringRef Input : {"rv32i_zvl32b", "rv64i_zvl128b"}) {
669f802c39cSCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
670f802c39cSCraig Topper               "'zvl*b' requires 'v' or 'zve*' extension to also be specified");
671f802c39cSCraig Topper   }
672f802c39cSCraig Topper 
673f53889ffSJubilee   // These all have an implication relationship, thus should pass
674f53889ffSJubilee   for (StringRef Input : {
675f53889ffSJubilee            "rv32i_zvbb",
676f53889ffSJubilee            "rv32i_zvbc32e0p7",
677f53889ffSJubilee            "rv32i_zvbc",
678f53889ffSJubilee            "rv32i_zvkb",
679f53889ffSJubilee            "rv32i_zvkg",
680f53889ffSJubilee            "rv32i_zvkgs0p7",
681f53889ffSJubilee            "rv32i_zvkned",
682f53889ffSJubilee            "rv32i_zvknha",
683f53889ffSJubilee            "rv32i_zvksed",
684f53889ffSJubilee            "rv32i_zvksh",
685f53889ffSJubilee            "rv32i_zvknhb",
686f53889ffSJubilee        }) {
687f802c39cSCraig Topper     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
688f53889ffSJubilee               "");
689f802c39cSCraig Topper   }
690733a8778SCraig Topper }
691733a8778SCraig Topper 
69224c39261SAlex Bradbury TEST(ParseArchString, RejectsUnrecognizedProfileNames) {
69324c39261SAlex Bradbury   for (StringRef Input : {"rvi23u99", "rvz23u64", "rva99u32"}) {
69424c39261SAlex Bradbury     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
69524c39261SAlex Bradbury               "string must begin with rv32{i,e,g}, rv64{i,e,g}, or a supported "
69624c39261SAlex Bradbury               "profile name");
69724c39261SAlex Bradbury   }
69824c39261SAlex Bradbury }
69924c39261SAlex Bradbury 
70024c39261SAlex Bradbury TEST(ParseArchString, RejectsProfilesWithUnseparatedExtraExtensions) {
70124c39261SAlex Bradbury   for (StringRef Input : {"rvi20u32m", "rvi20u64c"}) {
70224c39261SAlex Bradbury     EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),
70324c39261SAlex Bradbury               "additional extensions must be after separator '_'");
70424c39261SAlex Bradbury   }
70524c39261SAlex Bradbury }
70624c39261SAlex Bradbury 
70724c39261SAlex Bradbury TEST(ParseArchString, AcceptsBareProfileNames) {
70824c39261SAlex Bradbury   auto MaybeRVA20U64 = RISCVISAInfo::parseArchString("rva20u64", true);
70924c39261SAlex Bradbury   ASSERT_THAT_EXPECTED(MaybeRVA20U64, Succeeded());
71024c39261SAlex Bradbury   const auto &Exts = (*MaybeRVA20U64)->getExtensions();
711bd15c7c1SJim Lin   EXPECT_EQ(Exts.size(), 16UL);
71224c39261SAlex Bradbury   EXPECT_EQ(Exts.count("i"), 1U);
71324c39261SAlex Bradbury   EXPECT_EQ(Exts.count("m"), 1U);
71424c39261SAlex Bradbury   EXPECT_EQ(Exts.count("f"), 1U);
71524c39261SAlex Bradbury   EXPECT_EQ(Exts.count("a"), 1U);
71624c39261SAlex Bradbury   EXPECT_EQ(Exts.count("d"), 1U);
71724c39261SAlex Bradbury   EXPECT_EQ(Exts.count("c"), 1U);
71824c39261SAlex Bradbury   EXPECT_EQ(Exts.count("za128rs"), 1U);
71924c39261SAlex Bradbury   EXPECT_EQ(Exts.count("zicntr"), 1U);
72024c39261SAlex Bradbury   EXPECT_EQ(Exts.count("ziccif"), 1U);
72124c39261SAlex Bradbury   EXPECT_EQ(Exts.count("zicsr"), 1U);
72224c39261SAlex Bradbury   EXPECT_EQ(Exts.count("ziccrse"), 1U);
72324c39261SAlex Bradbury   EXPECT_EQ(Exts.count("ziccamoa"), 1U);
72424c39261SAlex Bradbury   EXPECT_EQ(Exts.count("zicclsm"), 1U);
72576254656SJianjian Guan   EXPECT_EQ(Exts.count("zmmul"), 1U);
726bd15c7c1SJim Lin   EXPECT_EQ(Exts.count("zaamo"), 1U);
727bd15c7c1SJim Lin   EXPECT_EQ(Exts.count("zalrsc"), 1U);
72824c39261SAlex Bradbury 
72924c39261SAlex Bradbury   auto MaybeRVA23U64 = RISCVISAInfo::parseArchString("rva23u64", true);
73024c39261SAlex Bradbury   ASSERT_THAT_EXPECTED(MaybeRVA23U64, Succeeded());
73124c39261SAlex Bradbury   EXPECT_GT((*MaybeRVA23U64)->getExtensions().size(), 13UL);
73224c39261SAlex Bradbury }
73324c39261SAlex Bradbury 
73424c39261SAlex Bradbury TEST(ParseArchSTring, AcceptsProfileNamesWithSeparatedAdditionalExtensions) {
73524c39261SAlex Bradbury   auto MaybeRVI20U64 = RISCVISAInfo::parseArchString("rvi20u64_m_zba", true);
73624c39261SAlex Bradbury   ASSERT_THAT_EXPECTED(MaybeRVI20U64, Succeeded());
73724c39261SAlex Bradbury   const auto &Exts = (*MaybeRVI20U64)->getExtensions();
73876254656SJianjian Guan   EXPECT_EQ(Exts.size(), 4UL);
73924c39261SAlex Bradbury   EXPECT_EQ(Exts.count("i"), 1U);
74024c39261SAlex Bradbury   EXPECT_EQ(Exts.count("m"), 1U);
74124c39261SAlex Bradbury   EXPECT_EQ(Exts.count("zba"), 1U);
74276254656SJianjian Guan   EXPECT_EQ(Exts.count("zmmul"), 1U);
74324c39261SAlex Bradbury }
74424c39261SAlex Bradbury 
74524c39261SAlex Bradbury TEST(ParseArchString,
74624c39261SAlex Bradbury      RejectsProfilesWithAdditionalExtensionsGivenAlreadyInProfile) {
74724c39261SAlex Bradbury   // This test was added to document the current behaviour. Discussion isn't
74824c39261SAlex Bradbury   // believed to have taken place about if this is desirable or not.
74924c39261SAlex Bradbury   EXPECT_EQ(
75024c39261SAlex Bradbury       toString(
75124c39261SAlex Bradbury           RISCVISAInfo::parseArchString("rva20u64_zicntr", true).takeError()),
75224c39261SAlex Bradbury       "duplicated standard user-level extension 'zicntr'");
75324c39261SAlex Bradbury }
75424c39261SAlex Bradbury 
755891d6871SAlex Bradbury TEST(ParseArchString,
756891d6871SAlex Bradbury      RejectsExperimentalProfilesIfEnableExperimentalExtensionsNotSet) {
757891d6871SAlex Bradbury   EXPECT_EQ(
758ba7555e6SAlex Bradbury       toString(RISCVISAInfo::parseArchString("rvm23u32", false).takeError()),
759ba7555e6SAlex Bradbury       "requires '-menable-experimental-extensions' for profile 'rvm23u32'");
760891d6871SAlex Bradbury }
761891d6871SAlex Bradbury 
762733a8778SCraig Topper TEST(ToFeatures, IIsDroppedAndExperimentalExtensionsArePrefixed) {
763733a8778SCraig Topper   auto MaybeISAInfo1 =
76490d79e25SPhilip Reames       RISCVISAInfo::parseArchString("rv64im_zalasr", true, false);
765733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo1, Succeeded());
766733a8778SCraig Topper   EXPECT_THAT((*MaybeISAInfo1)->toFeatures(),
76790d79e25SPhilip Reames               ElementsAre("+m", "+zmmul", "+experimental-zalasr"));
768733a8778SCraig Topper 
76990d79e25SPhilip Reames   auto MaybeISAInfo2 = RISCVISAInfo::parseArchString(
77090d79e25SPhilip Reames       "rv32e_zalasr_xventanacondops", true, false);
771733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo2, Succeeded());
772733a8778SCraig Topper   EXPECT_THAT((*MaybeISAInfo2)->toFeatures(),
77390d79e25SPhilip Reames               ElementsAre("+e", "+experimental-zalasr", "+xventanacondops"));
774733a8778SCraig Topper }
775733a8778SCraig Topper 
776733a8778SCraig Topper TEST(ToFeatures, UnsupportedExtensionsAreDropped) {
777733a8778SCraig Topper   auto MaybeISAInfo =
778733a8778SCraig Topper       RISCVISAInfo::parseNormalizedArchString("rv64i2p0_m2p0_xmadeup1p0");
779733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
780733a8778SCraig Topper   EXPECT_THAT((*MaybeISAInfo)->toFeatures(), ElementsAre("+m"));
781733a8778SCraig Topper }
782733a8778SCraig Topper 
783733a8778SCraig Topper TEST(ToFeatures, UnsupportedExtensionsAreKeptIfIgnoreUnknownIsFalse) {
784733a8778SCraig Topper   auto MaybeISAInfo =
785733a8778SCraig Topper       RISCVISAInfo::parseNormalizedArchString("rv64i2p0_m2p0_xmadeup1p0");
786733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
787733a8778SCraig Topper   EXPECT_THAT((*MaybeISAInfo)->toFeatures(false, false),
788733a8778SCraig Topper               ElementsAre("+m", "+xmadeup"));
789733a8778SCraig Topper }
790733a8778SCraig Topper 
791733a8778SCraig Topper TEST(ToFeatures, AddAllExtensionsAddsNegativeExtensions) {
792733a8778SCraig Topper   auto MaybeISAInfo = RISCVISAInfo::parseNormalizedArchString("rv64i2p0_m2p0");
793733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
794733a8778SCraig Topper 
795733a8778SCraig Topper   auto Features = (*MaybeISAInfo)->toFeatures(true);
796733a8778SCraig Topper   EXPECT_GT(Features.size(), 1UL);
797733a8778SCraig Topper   EXPECT_EQ(Features.front(), "+m");
798733a8778SCraig Topper   // Every feature after should be a negative feature
799733a8778SCraig Topper   for (auto &NegativeExt : llvm::drop_begin(Features))
800733a8778SCraig Topper     EXPECT_TRUE(NegativeExt.substr(0, 1) == "-");
801733a8778SCraig Topper }
802733a8778SCraig Topper 
803733a8778SCraig Topper TEST(OrderedExtensionMap, ExtensionsAreCorrectlyOrdered) {
804de375fbcSCraig Topper   RISCVISAUtils::OrderedExtensionMap Exts;
805733a8778SCraig Topper   for (auto ExtName : {"y", "l", "m", "c", "i", "xfoo", "xbar", "sfoo", "sbar",
806733a8778SCraig Topper                        "zmfoo", "zzfoo", "zfinx", "zicsr"})
807733a8778SCraig Topper     Exts[ExtName] = {1, 0};
808733a8778SCraig Topper 
809733a8778SCraig Topper   std::vector<std::string> ExtNames;
810733a8778SCraig Topper   for (const auto &Ext : Exts)
811733a8778SCraig Topper     ExtNames.push_back(Ext.first);
812733a8778SCraig Topper 
813733a8778SCraig Topper   // FIXME: 'l' and 'y' should be ordered after 'i', 'm', 'c'.
814733a8778SCraig Topper   EXPECT_THAT(ExtNames,
815733a8778SCraig Topper               ElementsAre("i", "m", "l", "c", "y", "zicsr", "zmfoo", "zfinx",
816733a8778SCraig Topper                            "zzfoo", "sbar", "sfoo", "xbar", "xfoo"));
817733a8778SCraig Topper }
818733a8778SCraig Topper 
819733a8778SCraig Topper TEST(ParseArchString, ZceImplication) {
820733a8778SCraig Topper   auto MaybeRV32IZce = RISCVISAInfo::parseArchString("rv32izce", true);
821733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32IZce, Succeeded());
822de375fbcSCraig Topper   const auto &ExtsRV32IZce = (*MaybeRV32IZce)->getExtensions();
823733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.size(), 7UL);
824733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("i"), 1U);
825733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zicsr"), 1U);
826733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zca"), 1U);
827733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zcb"), 1U);
828733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zce"), 1U);
829733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zcmp"), 1U);
830733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IZce.count("zcmt"), 1U);
831733a8778SCraig Topper 
832733a8778SCraig Topper   auto MaybeRV32IFZce = RISCVISAInfo::parseArchString("rv32ifzce", true);
833733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32IFZce, Succeeded());
834de375fbcSCraig Topper   const auto &ExtsRV32IFZce = (*MaybeRV32IFZce)->getExtensions();
835733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.size(), 9UL);
836733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("i"), 1U);
837733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zicsr"), 1U);
838733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("f"), 1U);
839733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zca"), 1U);
840733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zcb"), 1U);
841733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zce"), 1U);
842733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zcf"), 1U);
843733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zcmp"), 1U);
844733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IFZce.count("zcmt"), 1U);
845733a8778SCraig Topper 
846733a8778SCraig Topper   auto MaybeRV32IDZce = RISCVISAInfo::parseArchString("rv32idzce", true);
847733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV32IDZce, Succeeded());
848de375fbcSCraig Topper   const auto &ExtsRV32IDZce = (*MaybeRV32IDZce)->getExtensions();
849733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.size(), 10UL);
850733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("i"), 1U);
851733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zicsr"), 1U);
852733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("f"), 1U);
853733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("d"), 1U);
854733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zca"), 1U);
855733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zcb"), 1U);
856733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zce"), 1U);
857733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zcf"), 1U);
858733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zcmp"), 1U);
859733a8778SCraig Topper   EXPECT_EQ(ExtsRV32IDZce.count("zcmt"), 1U);
860733a8778SCraig Topper 
861733a8778SCraig Topper   auto MaybeRV64IZce = RISCVISAInfo::parseArchString("rv64izce", true);
862733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64IZce, Succeeded());
863de375fbcSCraig Topper   const auto &ExtsRV64IZce = (*MaybeRV64IZce)->getExtensions();
864733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.size(), 7UL);
865733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("i"), 1U);
866733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zicsr"), 1U);
867733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zca"), 1U);
868733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zcb"), 1U);
869733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zce"), 1U);
870733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zcmp"), 1U);
871733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IZce.count("zcmt"), 1U);
872733a8778SCraig Topper 
873733a8778SCraig Topper   auto MaybeRV64IFZce = RISCVISAInfo::parseArchString("rv64ifzce", true);
874733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64IFZce, Succeeded());
875de375fbcSCraig Topper   const auto &ExtsRV64IFZce = (*MaybeRV64IFZce)->getExtensions();
876733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.size(), 8UL);
877733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("i"), 1U);
878733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zicsr"), 1U);
879733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("f"), 1U);
880733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zca"), 1U);
881733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcb"), 1U);
882733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zce"), 1U);
883733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcmp"), 1U);
884733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcmt"), 1U);
885733a8778SCraig Topper 
886733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zca"), 1U);
887733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcb"), 1U);
888733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zce"), 1U);
889733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcmp"), 1U);
890733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IFZce.count("zcmt"), 1U);
891733a8778SCraig Topper 
892733a8778SCraig Topper   auto MaybeRV64IDZce = RISCVISAInfo::parseArchString("rv64idzce", true);
893733a8778SCraig Topper   ASSERT_THAT_EXPECTED(MaybeRV64IDZce, Succeeded());
894de375fbcSCraig Topper   const auto &ExtsRV64IDZce = (*MaybeRV64IDZce)->getExtensions();
895733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.size(), 9UL);
896733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("i"), 1U);
897733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zicsr"), 1U);
898733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("f"), 1U);
899733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("d"), 1U);
900733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zca"), 1U);
901733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zcb"), 1U);
902733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zce"), 1U);
903733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zcmp"), 1U);
904733a8778SCraig Topper   EXPECT_EQ(ExtsRV64IDZce.count("zcmt"), 1U);
905733a8778SCraig Topper }
906733a8778SCraig Topper 
907733a8778SCraig Topper TEST(isSupportedExtensionWithVersion, AcceptsSingleExtensionWithVersion) {
908733a8778SCraig Topper   EXPECT_TRUE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb1p0"));
909733a8778SCraig Topper   EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zbb"));
910733a8778SCraig Topper   EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo1p0"));
911733a8778SCraig Topper   EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("zfoo"));
912733a8778SCraig Topper   EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion(""));
913733a8778SCraig Topper   EXPECT_FALSE(RISCVISAInfo::isSupportedExtensionWithVersion("c2p0zbb1p0"));
914733a8778SCraig Topper }
915733a8778SCraig Topper 
916733a8778SCraig Topper TEST(getTargetFeatureForExtension, RetrieveTargetFeatureFromOneExt) {
917733a8778SCraig Topper   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbb"), "zbb");
91890d79e25SPhilip Reames   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("ztso1p0"), "ztso");
91990d79e25SPhilip Reames   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("ztso"), "ztso");
920733a8778SCraig Topper   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zihintntl1234p4321"),
921733a8778SCraig Topper             "");
922733a8778SCraig Topper   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zfoo"), "");
923733a8778SCraig Topper   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension(""), "");
924733a8778SCraig Topper   EXPECT_EQ(RISCVISAInfo::getTargetFeatureForExtension("zbbzihintntl"), "");
925733a8778SCraig Topper }
926733a8778SCraig Topper 
927733a8778SCraig Topper TEST(RiscvExtensionsHelp, CheckExtensions) {
928733a8778SCraig Topper   // clang-format off
929733a8778SCraig Topper   std::string ExpectedOutput =
930733a8778SCraig Topper R"(All available -march extensions for RISC-V
931733a8778SCraig Topper 
932733a8778SCraig Topper     Name                 Version   Description
933733a8778SCraig Topper     i                    2.1       This is a long dummy description
934733a8778SCraig Topper     e                    2.0
935733a8778SCraig Topper     m                    2.0
936733a8778SCraig Topper     a                    2.1
937733a8778SCraig Topper     f                    2.2
938733a8778SCraig Topper     d                    2.2
939733a8778SCraig Topper     c                    2.0
9401bebb993SPengcheng Wang     b                    1.0
941733a8778SCraig Topper     v                    1.0
942733a8778SCraig Topper     h                    1.0
943733a8778SCraig Topper     zic64b               1.0
944733a8778SCraig Topper     zicbom               1.0
945733a8778SCraig Topper     zicbop               1.0
946733a8778SCraig Topper     zicboz               1.0
947733a8778SCraig Topper     ziccamoa             1.0
948733a8778SCraig Topper     ziccif               1.0
949733a8778SCraig Topper     zicclsm              1.0
950733a8778SCraig Topper     ziccrse              1.0
951733a8778SCraig Topper     zicntr               2.0
952733a8778SCraig Topper     zicond               1.0
953733a8778SCraig Topper     zicsr                2.0
954733a8778SCraig Topper     zifencei             2.0
955733a8778SCraig Topper     zihintntl            1.0
956733a8778SCraig Topper     zihintpause          2.0
957733a8778SCraig Topper     zihpm                2.0
958733a8778SCraig Topper     zimop                1.0
959733a8778SCraig Topper     zmmul                1.0
960733a8778SCraig Topper     za128rs              1.0
961733a8778SCraig Topper     za64rs               1.0
9628be079cdSBrandon Wu     zaamo                1.0
9636b744496SAlexGhiti     zabha                1.0
964614aeda9SAlex Bradbury     zacas                1.0
9658be079cdSBrandon Wu     zalrsc               1.0
966733a8778SCraig Topper     zama16b              1.0
967733a8778SCraig Topper     zawrs                1.0
968733a8778SCraig Topper     zfa                  1.0
96932597685SJianjian Guan     zfbfmin              1.0
970733a8778SCraig Topper     zfh                  1.0
971733a8778SCraig Topper     zfhmin               1.0
972733a8778SCraig Topper     zfinx                1.0
973733a8778SCraig Topper     zdinx                1.0
974733a8778SCraig Topper     zca                  1.0
975733a8778SCraig Topper     zcb                  1.0
976733a8778SCraig Topper     zcd                  1.0
977733a8778SCraig Topper     zce                  1.0
978733a8778SCraig Topper     zcf                  1.0
979733a8778SCraig Topper     zcmop                1.0
980733a8778SCraig Topper     zcmp                 1.0
981733a8778SCraig Topper     zcmt                 1.0
982733a8778SCraig Topper     zba                  1.0
983733a8778SCraig Topper     zbb                  1.0
984733a8778SCraig Topper     zbc                  1.0
985733a8778SCraig Topper     zbkb                 1.0
986733a8778SCraig Topper     zbkc                 1.0
987733a8778SCraig Topper     zbkx                 1.0
988733a8778SCraig Topper     zbs                  1.0
989733a8778SCraig Topper     zk                   1.0
990733a8778SCraig Topper     zkn                  1.0
991733a8778SCraig Topper     zknd                 1.0
992733a8778SCraig Topper     zkne                 1.0
993733a8778SCraig Topper     zknh                 1.0
994733a8778SCraig Topper     zkr                  1.0
995733a8778SCraig Topper     zks                  1.0
996733a8778SCraig Topper     zksed                1.0
997733a8778SCraig Topper     zksh                 1.0
998733a8778SCraig Topper     zkt                  1.0
99990d79e25SPhilip Reames     ztso                 1.0
1000733a8778SCraig Topper     zvbb                 1.0
1001733a8778SCraig Topper     zvbc                 1.0
1002733a8778SCraig Topper     zve32f               1.0
1003733a8778SCraig Topper     zve32x               1.0
1004733a8778SCraig Topper     zve64d               1.0
1005733a8778SCraig Topper     zve64f               1.0
1006733a8778SCraig Topper     zve64x               1.0
100732597685SJianjian Guan     zvfbfmin             1.0
100832597685SJianjian Guan     zvfbfwma             1.0
1009733a8778SCraig Topper     zvfh                 1.0
1010733a8778SCraig Topper     zvfhmin              1.0
1011733a8778SCraig Topper     zvkb                 1.0
1012733a8778SCraig Topper     zvkg                 1.0
1013733a8778SCraig Topper     zvkn                 1.0
1014733a8778SCraig Topper     zvknc                1.0
1015733a8778SCraig Topper     zvkned               1.0
1016733a8778SCraig Topper     zvkng                1.0
1017733a8778SCraig Topper     zvknha               1.0
1018733a8778SCraig Topper     zvknhb               1.0
1019733a8778SCraig Topper     zvks                 1.0
1020733a8778SCraig Topper     zvksc                1.0
1021733a8778SCraig Topper     zvksed               1.0
1022733a8778SCraig Topper     zvksg                1.0
1023733a8778SCraig Topper     zvksh                1.0
1024733a8778SCraig Topper     zvkt                 1.0
1025733a8778SCraig Topper     zvl1024b             1.0
1026733a8778SCraig Topper     zvl128b              1.0
1027733a8778SCraig Topper     zvl16384b            1.0
1028733a8778SCraig Topper     zvl2048b             1.0
1029733a8778SCraig Topper     zvl256b              1.0
1030733a8778SCraig Topper     zvl32768b            1.0
1031733a8778SCraig Topper     zvl32b               1.0
1032733a8778SCraig Topper     zvl4096b             1.0
1033733a8778SCraig Topper     zvl512b              1.0
1034733a8778SCraig Topper     zvl64b               1.0
1035733a8778SCraig Topper     zvl65536b            1.0
1036733a8778SCraig Topper     zvl8192b             1.0
1037733a8778SCraig Topper     zhinx                1.0
1038733a8778SCraig Topper     zhinxmin             1.0
103935f6cc6aSAlex Bradbury     sha                  1.0
1040733a8778SCraig Topper     shcounterenw         1.0
1041733a8778SCraig Topper     shgatpa              1.0
1042733a8778SCraig Topper     shtvala              1.0
1043733a8778SCraig Topper     shvsatpa             1.0
1044733a8778SCraig Topper     shvstvala            1.0
1045733a8778SCraig Topper     shvstvecd            1.0
1046733a8778SCraig Topper     smaia                1.0
1047307d91eeSMonad     smcdeleg             1.0
10482fe72385SMonad     smcsrind             1.0
1049c17a9146ST-Tie     smdbltrp             1.0
1050733a8778SCraig Topper     smepmp               1.0
10512c0b3485SAlex Bradbury     smmpm                1.0
10522c0b3485SAlex Bradbury     smnpm                1.0
1053ed6ddffbSdong-miao     smrnmi               1.0
105444645996SCraig Topper     smstateen            1.0
1055733a8778SCraig Topper     ssaia                1.0
1056307d91eeSMonad     ssccfg               1.0
1057733a8778SCraig Topper     ssccptr              1.0
1058733a8778SCraig Topper     sscofpmf             1.0
1059733a8778SCraig Topper     sscounterenw         1.0
10602fe72385SMonad     sscsrind             1.0
1061c17a9146ST-Tie     ssdbltrp             1.0
10622c0b3485SAlex Bradbury     ssnpm                1.0
10632c0b3485SAlex Bradbury     sspm                 1.0
1064bacedb56SShao-Ce SUN     ssqosid              1.0
1065733a8778SCraig Topper     ssstateen            1.0
1066733a8778SCraig Topper     ssstrict             1.0
1067733a8778SCraig Topper     sstc                 1.0
1068733a8778SCraig Topper     sstvala              1.0
1069733a8778SCraig Topper     sstvecd              1.0
1070733a8778SCraig Topper     ssu64xl              1.0
10712c0b3485SAlex Bradbury     supm                 1.0
1072733a8778SCraig Topper     svade                1.0
1073733a8778SCraig Topper     svadu                1.0
1074733a8778SCraig Topper     svbare               1.0
1075733a8778SCraig Topper     svinval              1.0
1076733a8778SCraig Topper     svnapot              1.0
1077733a8778SCraig Topper     svpbmt               1.0
107875c75fc1Sdong-miao     svvptc               1.0
1079733a8778SCraig Topper     xcvalu               1.0
1080733a8778SCraig Topper     xcvbi                1.0
1081733a8778SCraig Topper     xcvbitmanip          1.0
1082733a8778SCraig Topper     xcvelw               1.0
1083733a8778SCraig Topper     xcvmac               1.0
1084733a8778SCraig Topper     xcvmem               1.0
1085733a8778SCraig Topper     xcvsimd              1.0
1086*0cb7636aSDjordje Todorovic     xmipscmove           1.0
1087*0cb7636aSDjordje Todorovic     xmipslsp             1.0
1088733a8778SCraig Topper     xsfcease             1.0
1089733a8778SCraig Topper     xsfvcp               1.0
1090733a8778SCraig Topper     xsfvfnrclipxfqf      1.0
1091733a8778SCraig Topper     xsfvfwmaccqqq        1.0
1092733a8778SCraig Topper     xsfvqmaccdod         1.0
1093733a8778SCraig Topper     xsfvqmaccqoq         1.0
1094733a8778SCraig Topper     xsifivecdiscarddlone 1.0
1095733a8778SCraig Topper     xsifivecflushdlone   1.0
1096733a8778SCraig Topper     xtheadba             1.0
1097733a8778SCraig Topper     xtheadbb             1.0
1098733a8778SCraig Topper     xtheadbs             1.0
1099733a8778SCraig Topper     xtheadcmo            1.0
1100733a8778SCraig Topper     xtheadcondmov        1.0
1101733a8778SCraig Topper     xtheadfmemidx        1.0
1102733a8778SCraig Topper     xtheadmac            1.0
1103733a8778SCraig Topper     xtheadmemidx         1.0
1104733a8778SCraig Topper     xtheadmempair        1.0
1105733a8778SCraig Topper     xtheadsync           1.0
1106733a8778SCraig Topper     xtheadvdot           1.0
1107733a8778SCraig Topper     xventanacondops      1.0
11083c5f929aSR     xwchc                2.2
1109733a8778SCraig Topper 
1110733a8778SCraig Topper Experimental extensions
111158c7df90SYeting Kuo     zicfilp              1.0       This is a long dummy description
111258c7df90SYeting Kuo     zicfiss              1.0
1113733a8778SCraig Topper     zalasr               0.1
1114a80a90e3SPengcheng Wang     zvbc32e              0.7
1115a80a90e3SPengcheng Wang     zvkgs                0.7
11162fae5bdeSShao-Ce SUN     sdext                1.0
11172fae5bdeSShao-Ce SUN     sdtrig               1.0
11180ca77f66SCraig Topper     smctr                1.0
11190ca77f66SCraig Topper     ssctr                1.0
11204a7dbedeSBrandon Wu     svukte               0.3
11216881c6d2SSudharsan Veeravalli     xqcia                0.2
11222d068879Squic_hchandel     xqciac               0.3
1123532a2691SSudharsan Veeravalli     xqcicli              0.2
1124737d6ca4Squic_hchandel     xqcicm               0.2
11250614c601Squic_hchandel     xqcics               0.2
1126c4645ffeSSudharsan Veeravalli     xqcicsr              0.2
1127171d3eddSquic_hchandel     xqciint              0.2
1128163935a4Squic_hchandel     xqcilo               0.2
1129668d9688SSudharsan Veeravalli     xqcilsm              0.2
11308fcbba82SSudharsan Veeravalli     xqcisls              0.2
1131733a8778SCraig Topper 
1132ab8ac36fSCraig Topper Supported Profiles
1133ab8ac36fSCraig Topper     rva20s64
1134ab8ac36fSCraig Topper     rva20u64
1135ab8ac36fSCraig Topper     rva22s64
1136ab8ac36fSCraig Topper     rva22u64
1137ba7555e6SAlex Bradbury     rva23s64
1138ba7555e6SAlex Bradbury     rva23u64
11397544d3afSAlex Bradbury     rvb23s64
11407544d3afSAlex Bradbury     rvb23u64
1141891d6871SAlex Bradbury     rvi20u32
1142891d6871SAlex Bradbury     rvi20u64
1143891d6871SAlex Bradbury 
1144891d6871SAlex Bradbury Experimental Profiles
1145ab8ac36fSCraig Topper     rvm23u32
1146ab8ac36fSCraig Topper 
1147733a8778SCraig Topper Use -march to specify the target's extension.
1148733a8778SCraig Topper For example, clang -march=rv32i_v1p0)";
1149733a8778SCraig Topper   // clang-format on
1150733a8778SCraig Topper 
1151733a8778SCraig Topper   StringMap<StringRef> DummyMap;
1152733a8778SCraig Topper   DummyMap["i"] = "This is a long dummy description";
1153733a8778SCraig Topper   DummyMap["experimental-zicfilp"] = "This is a long dummy description";
1154733a8778SCraig Topper 
1155733a8778SCraig Topper   outs().flush();
1156733a8778SCraig Topper   testing::internal::CaptureStdout();
1157eee5d2d3SMichael Maitland   RISCVISAInfo::printSupportedExtensions(DummyMap);
1158733a8778SCraig Topper   outs().flush();
1159733a8778SCraig Topper 
1160733a8778SCraig Topper   std::string CapturedOutput = testing::internal::GetCapturedStdout();
1161733a8778SCraig Topper   EXPECT_TRUE([](std::string &Captured, std::string &Expected) {
1162733a8778SCraig Topper                 return Captured.find(Expected) != std::string::npos;
1163733a8778SCraig Topper               }(CapturedOutput, ExpectedOutput));
1164733a8778SCraig Topper }
1165eee5d2d3SMichael Maitland 
1166eee5d2d3SMichael Maitland TEST(TargetParserTest, RISCVPrintEnabledExtensions) {
1167eee5d2d3SMichael Maitland   // clang-format off
1168eee5d2d3SMichael Maitland   std::string ExpectedOutput =
1169eee5d2d3SMichael Maitland R"(Extensions enabled for the given RISC-V target
1170eee5d2d3SMichael Maitland 
1171eee5d2d3SMichael Maitland     Name                 Version   Description
1172eee5d2d3SMichael Maitland     i                    2.1       'I' (Base Integer Instruction Set)
1173eee5d2d3SMichael Maitland 
1174eee5d2d3SMichael Maitland Experimental extensions
117558c7df90SYeting Kuo     zicfilp              1.0       'Zicfilp' (Landing pad)
1176eee5d2d3SMichael Maitland 
117758c7df90SYeting Kuo ISA String: rv64i2p1_zicfilp1p0_zicsr2p0
1178cd6750faSShao-Ce SUN )";
1179eee5d2d3SMichael Maitland   // clang-format on
1180eee5d2d3SMichael Maitland 
1181eee5d2d3SMichael Maitland   StringMap<StringRef> DescMap;
1182eee5d2d3SMichael Maitland   DescMap["i"] = "'I' (Base Integer Instruction Set)";
1183eee5d2d3SMichael Maitland   DescMap["experimental-zicfilp"] = "'Zicfilp' (Landing pad)";
1184eee5d2d3SMichael Maitland   std::set<StringRef> EnabledExtensions = {"i", "experimental-zicfilp"};
1185eee5d2d3SMichael Maitland 
1186eee5d2d3SMichael Maitland   outs().flush();
1187eee5d2d3SMichael Maitland   testing::internal::CaptureStdout();
1188eee5d2d3SMichael Maitland   RISCVISAInfo::printEnabledExtensions(/*IsRV64=*/true, EnabledExtensions,
1189eee5d2d3SMichael Maitland                                        DescMap);
1190eee5d2d3SMichael Maitland   outs().flush();
1191eee5d2d3SMichael Maitland   std::string CapturedOutput = testing::internal::GetCapturedStdout();
1192eee5d2d3SMichael Maitland 
1193eee5d2d3SMichael Maitland   EXPECT_EQ(CapturedOutput, ExpectedOutput);
1194eee5d2d3SMichael Maitland }
1195