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