blob: 3d9750122b246e22dac3e291cdbf543ce666b90c [file] [log] [blame]
// Copyright 2019 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <cstring>
#include "starboard/cpu_features.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace starboard {
namespace nplb {
namespace {
#if SB_API_VERSION >= 11
constexpr int kFeatureValueInvalid = -1;
void ExpectArmInvalid(const SbCPUFeatures& features) {
EXPECT_EQ(kFeatureValueInvalid, features.arm.implementer);
EXPECT_EQ(kFeatureValueInvalid, features.arm.variant);
EXPECT_EQ(kFeatureValueInvalid, features.arm.revision);
EXPECT_EQ(kFeatureValueInvalid, features.arm.architecture_generation);
EXPECT_EQ(kFeatureValueInvalid, features.arm.part);
EXPECT_EQ(false, features.arm.has_neon);
EXPECT_EQ(false, features.arm.has_thumb2);
EXPECT_EQ(false, features.arm.has_vfp);
EXPECT_EQ(false, features.arm.has_vfp3);
EXPECT_EQ(false, features.arm.has_vfp3_d32);
EXPECT_EQ(false, features.arm.has_idiva);
EXPECT_EQ(false, features.arm.has_aes);
EXPECT_EQ(false, features.arm.has_crc32);
EXPECT_EQ(false, features.arm.has_sha1);
EXPECT_EQ(false, features.arm.has_sha2);
EXPECT_EQ(false, features.arm.has_pmull);
}
void ExpectMipsInvalid(const SbCPUFeatures& features) {
EXPECT_EQ(false, features.mips_arch.has_msa);
}
void ExpectX86Invalid(const SbCPUFeatures& features) {
EXPECT_NE(nullptr, features.x86.vendor);
EXPECT_EQ(0, strlen(features.x86.vendor));
EXPECT_EQ(kFeatureValueInvalid, features.x86.family);
EXPECT_EQ(kFeatureValueInvalid, features.x86.ext_family);
EXPECT_EQ(kFeatureValueInvalid, features.x86.model);
EXPECT_EQ(kFeatureValueInvalid, features.x86.ext_model);
EXPECT_EQ(kFeatureValueInvalid, features.x86.stepping);
EXPECT_EQ(kFeatureValueInvalid, features.x86.type);
EXPECT_EQ(kFeatureValueInvalid, features.x86.signature);
EXPECT_EQ(false, features.x86.has_cmov);
EXPECT_EQ(false, features.x86.has_mmx);
EXPECT_EQ(false, features.x86.has_sse);
EXPECT_EQ(false, features.x86.has_sse2);
EXPECT_EQ(false, features.x86.has_tsc);
EXPECT_EQ(false, features.x86.has_sse3);
#if SB_API_VERSION >= 12
EXPECT_EQ(false, features.x86.has_pclmulqdq);
#endif // SB_API_VERSION >= 12
EXPECT_EQ(false, features.x86.has_ssse3);
EXPECT_EQ(false, features.x86.has_sse41);
EXPECT_EQ(false, features.x86.has_sse42);
EXPECT_EQ(false, features.x86.has_movbe);
EXPECT_EQ(false, features.x86.has_popcnt);
EXPECT_EQ(false, features.x86.has_osxsave);
EXPECT_EQ(false, features.x86.has_avx);
EXPECT_EQ(false, features.x86.has_f16c);
EXPECT_EQ(false, features.x86.has_fma3);
EXPECT_EQ(false, features.x86.has_aesni);
EXPECT_EQ(false, features.x86.has_avx2);
EXPECT_EQ(false, features.x86.has_avx512f);
EXPECT_EQ(false, features.x86.has_avx512dq);
EXPECT_EQ(false, features.x86.has_avx512ifma);
EXPECT_EQ(false, features.x86.has_avx512pf);
EXPECT_EQ(false, features.x86.has_avx512er);
EXPECT_EQ(false, features.x86.has_avx512cd);
EXPECT_EQ(false, features.x86.has_avx512bw);
EXPECT_EQ(false, features.x86.has_avx512vl);
EXPECT_EQ(false, features.x86.has_bmi1);
EXPECT_EQ(false, features.x86.has_bmi2);
EXPECT_EQ(false, features.x86.has_lzcnt);
EXPECT_EQ(false, features.x86.has_sahf);
}
TEST(SbCPUFeaturesGetTest, SunnyDay) {
SbCPUFeatures features;
bool result = SbCPUFeaturesGet(&features);
if (!result) {
EXPECT_EQ(kSbCPUFeaturesArchitectureUnknown, features.architecture);
EXPECT_NE(nullptr, features.brand);
EXPECT_EQ(0, strlen(features.brand));
EXPECT_EQ(kFeatureValueInvalid, features.icache_line_size);
EXPECT_EQ(kFeatureValueInvalid, features.dcache_line_size);
EXPECT_FALSE(features.has_fpu);
EXPECT_EQ(0, features.hwcap);
EXPECT_EQ(0, features.hwcap2);
ExpectArmInvalid(features);
ExpectMipsInvalid(features);
ExpectX86Invalid(features);
return;
} else {
// If the architecture is unknown, SbCPUFeaturesGet() must return
// false.
EXPECT_NE(kSbCPUFeaturesArchitectureUnknown, features.architecture);
#if SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)
EXPECT_TRUE(features.architecture == kSbCPUFeaturesArchitectureArm ||
features.architecture == kSbCPUFeaturesArchitectureArm64);
#else // !SB_IS(ARCH_ARM) && !SB_IS(ARCH_ARM64)
ExpectArmInvalid(features);
#endif // SB_IS(ARCH_ARM) || SB_IS(ARCH_ARM64)
#if SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
EXPECT_TRUE(features.architecture == kSbCPUFeaturesArchitectureX86 ||
features.architecture == kSbCPUFeaturesArchitectureX86_64);
#else // !SB_IS(ARCH_X86) && !SB_IS(ARCH_X64)
ExpectX86Invalid(features);
#endif // SB_IS(ARCH_X86) || SB_IS(ARCH_X64)
ExpectMipsInvalid(features);
}
}
#endif // SB_API_VERSION >= 11
} // namespace
} // namespace nplb
} // namespace starboard