diff --git a/include/cpuinfo_mips.h b/include/cpuinfo_mips.h index 811067c..fd65a23 100644 --- a/include/cpuinfo_mips.h +++ b/include/cpuinfo_mips.h @@ -24,6 +24,7 @@ typedef struct { // https://www.mips.com/products/architectures/ase/simd/ int eva : 1; // Enhanced Virtual Addressing // https://www.mips.com/products/architectures/mips64/ + int r6 : 1; // True if is release 6 of the processor. // Make sure to update MipsFeaturesEnum below if you add a field here. } MipsFeatures; @@ -40,6 +41,7 @@ MipsInfo GetMipsInfo(void); typedef enum { MIPS_MSA, MIPS_EVA, + MIPS_R6, MIPS_LAST_, } MipsFeaturesEnum; diff --git a/ndk_compat/cpu-features.c b/ndk_compat/cpu-features.c index c26a62e..9a2c5eb 100644 --- a/ndk_compat/cpu-features.c +++ b/ndk_compat/cpu-features.c @@ -135,7 +135,7 @@ static void android_cpuInit(void) { // if (info.features.) g_cpuFeatures |= ANDROID_CPU_X86_FEATURE_SHA_NI; #elif defined(CPU_FEATURES_ARCH_MIPS) MipsInfo info = GetMipsInfo(); - // if (info.features.) g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_R6; + if (info.features.r6) g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_R6; if (info.features.msa) g_cpuFeatures |= ANDROID_CPU_MIPS_FEATURE_MSA; #elif defined(CPU_FEATURES_ARCH_AARCH64) Aarch64Info info = GetAarch64Info(); diff --git a/src/cpuinfo_mips.c b/src/cpuinfo_mips.c index b9389a3..706d555 100644 --- a/src/cpuinfo_mips.c +++ b/src/cpuinfo_mips.c @@ -21,10 +21,12 @@ DECLARE_SETTER(MipsFeatures, msa) DECLARE_SETTER(MipsFeatures, eva) +DECLARE_SETTER(MipsFeatures, r6) static const CapabilityConfig kConfigs[] = { {{MIPS_HWCAP_MSA, 0}, "msa", &set_msa}, // {{0, 0}, "eva", &set_eva}, // + {{MIPS_HWCAP_R6, 0}, "r6", &set_r6}, // }; static const size_t kConfigsSize = sizeof(kConfigs) / sizeof(CapabilityConfig); @@ -79,6 +81,8 @@ int GetMipsFeaturesEnumValue(const MipsFeatures* features, return features->msa; case MIPS_EVA: return features->eva; + case MIPS_R6: + return features->r6; case MIPS_LAST_: break; } @@ -91,6 +95,8 @@ const char* GetMipsFeaturesEnumName(MipsFeaturesEnum value) { return "msa"; case MIPS_EVA: return "eva"; + case MIPS_R6: + return "r6"; case MIPS_LAST_: break; } diff --git a/test/cpuinfo_mips_test.cc b/test/cpuinfo_mips_test.cc index 4e36a2b..fbec04d 100644 --- a/test/cpuinfo_mips_test.cc +++ b/test/cpuinfo_mips_test.cc @@ -26,6 +26,15 @@ namespace { void DisableHardwareCapabilities() { SetHardwareCapabilities(0, 0); } +TEST(CpuinfoMipsTest, FromHardwareCapBoth) { + SetHardwareCapabilities(MIPS_HWCAP_MSA | MIPS_HWCAP_R6, 0); + GetEmptyFilesystem(); // disabling /proc/cpuinfo + const auto info = GetMipsInfo(); + EXPECT_TRUE(info.features.msa); + EXPECT_FALSE(info.features.eva); + EXPECT_TRUE(info.features.r6); +} + TEST(CpuinfoMipsTest, FromHardwareCapOnlyOne) { SetHardwareCapabilities(MIPS_HWCAP_MSA, 0); GetEmptyFilesystem(); // disabling /proc/cpuinfo