Index: lib/Support/Host.cpp =================================================================== --- lib/Support/Host.cpp +++ lib/Support/Host.cpp @@ -196,6 +196,21 @@ .Default("generic"); } + if (Implementer == "0x42" || Implementer == "0x43") { // Broadcom | Cavium. + for (unsigned I = 0, E = Lines.size(); I != E; ++I) { + if (Lines[I].startswith("CPU part")) { + return StringSwitch(Lines[I].substr(8).ltrim("\t :")) + .Case("0x516", "thunderx2t99") + .Case("0x0516", "thunderx2t99") + .Case("0xaf", "thunderx2t99") + .Case("0x0af", "thunderx2t99") + .Case("0xa1", "thunderxt88") + .Case("0x0a1", "thunderxt88") + .Default("generic"); + } + } + } + if (Implementer == "0x51") // Qualcomm Technologies, Inc. // Look for the CPU part line. for (unsigned I = 0, E = Lines.size(); I != E; ++I) Index: unittests/Support/Host.cpp =================================================================== --- unittests/Support/Host.cpp +++ unittests/Support/Host.cpp @@ -170,6 +170,78 @@ "CPU variant : 0x4\n" "CPU part : 0x001"), "exynos-m2"); + + const std::string ThunderX2T99ProcCpuInfo = R"( +processor : 0 +BogoMIPS : 400.00 +Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics +CPU implementer : 0x43 +CPU architecture: 8 +CPU variant : 0x1 +CPU part : 0x0af +)"; + + // Verify different versions of ThunderX2T99. + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x42\n" + "CPU part : 0x516"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x42\n" + "CPU part : 0x0516"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0x516"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0x0516"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x42\n" + "CPU part : 0xaf"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x42\n" + "CPU part : 0x0af"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0xaf"), + "thunderx2t99"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderX2T99ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0x0af"), + "thunderx2t99"); + + // Verify ThunderXT88. + const std::string ThunderXT88ProcCpuInfo = R"( +processor : 0 +BogoMIPS : 200.00 +Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 +CPU implementer : 0x43 +CPU architecture: 8 +CPU variant : 0x1 +CPU part : 0x0a1 +)"; + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0x0a1"), + "thunderxt88"); + + EXPECT_EQ(sys::detail::getHostCPUNameForARM(ThunderXT88ProcCpuInfo + + "CPU implementer : 0x43\n" + "CPU part : 0xa1"), + "thunderxt88"); } #if defined(__APPLE__)