Commit 8f02ad40 authored by Zhi An Ng's avatar Zhi An Ng Committed by Commit Bot

[ia32][x64] Detect AVX2

- Add the appropriate cpuid checks to detect AVX2 in base/cpu
- Add FLAG_enable_avx2

AVX2 depends on AVX support, + a cpuid check with eax=7. This is similar
to chromium/src/base/cpu.cc check for AVX2.

Bug: v8:11258
Change-Id: Ia547c22e51b03fec823f5e48ebb055139632c942
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2589050Reviewed-by: 's avatarClemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71821}
parent 46ce9b05
...@@ -383,6 +383,7 @@ bool CPU::StarboardDetectCPU() { ...@@ -383,6 +383,7 @@ bool CPU::StarboardDetectCPU() {
has_sse41_ = features.x86.has_sse41; has_sse41_ = features.x86.has_sse41;
has_sahf_ = features.x86.has_sahf; has_sahf_ = features.x86.has_sahf;
has_avx_ = features.x86.has_avx; has_avx_ = features.x86.has_avx;
has_avx2_ = features.x86.has_avx2;
has_fma3_ = features.x86.has_fma3; has_fma3_ = features.x86.has_fma3;
has_bmi1_ = features.x86.has_bmi1; has_bmi1_ = features.x86.has_bmi1;
has_bmi2_ = features.x86.has_bmi2; has_bmi2_ = features.x86.has_bmi2;
...@@ -427,6 +428,7 @@ CPU::CPU() ...@@ -427,6 +428,7 @@ CPU::CPU()
is_atom_(false), is_atom_(false),
has_osxsave_(false), has_osxsave_(false),
has_avx_(false), has_avx_(false),
has_avx2_(false),
has_fma3_(false), has_fma3_(false),
has_bmi1_(false), has_bmi1_(false),
has_bmi2_(false), has_bmi2_(false),
...@@ -469,6 +471,12 @@ CPU::CPU() ...@@ -469,6 +471,12 @@ CPU::CPU()
// Interpret CPU feature information. // Interpret CPU feature information.
if (num_ids > 0) { if (num_ids > 0) {
__cpuid(cpu_info, 1); __cpuid(cpu_info, 1);
int cpu_info7[4] = {0};
if (num_ids >= 7) {
__cpuid(cpu_info7, 7);
}
stepping_ = cpu_info[0] & 0xF; stepping_ = cpu_info[0] & 0xF;
model_ = ((cpu_info[0] >> 4) & 0xF) + ((cpu_info[0] >> 12) & 0xF0); model_ = ((cpu_info[0] >> 4) & 0xF) + ((cpu_info[0] >> 12) & 0xF0);
family_ = (cpu_info[0] >> 8) & 0xF; family_ = (cpu_info[0] >> 8) & 0xF;
...@@ -487,6 +495,7 @@ CPU::CPU() ...@@ -487,6 +495,7 @@ CPU::CPU()
has_popcnt_ = (cpu_info[2] & 0x00800000) != 0; has_popcnt_ = (cpu_info[2] & 0x00800000) != 0;
has_osxsave_ = (cpu_info[2] & 0x08000000) != 0; has_osxsave_ = (cpu_info[2] & 0x08000000) != 0;
has_avx_ = (cpu_info[2] & 0x10000000) != 0; has_avx_ = (cpu_info[2] & 0x10000000) != 0;
has_avx2_ = (cpu_info7[1] & 0x00000020) != 0;
has_fma3_ = (cpu_info[2] & 0x00001000) != 0; has_fma3_ = (cpu_info[2] & 0x00001000) != 0;
if (family_ == 0x6) { if (family_ == 0x6) {
......
...@@ -93,6 +93,7 @@ class V8_BASE_EXPORT CPU final { ...@@ -93,6 +93,7 @@ class V8_BASE_EXPORT CPU final {
bool has_sse42() const { return has_sse42_; } bool has_sse42() const { return has_sse42_; }
bool has_osxsave() const { return has_osxsave_; } bool has_osxsave() const { return has_osxsave_; }
bool has_avx() const { return has_avx_; } bool has_avx() const { return has_avx_; }
bool has_avx2() const { return has_avx2_; }
bool has_fma3() const { return has_fma3_; } bool has_fma3() const { return has_fma3_; }
bool has_bmi1() const { return has_bmi1_; } bool has_bmi1() const { return has_bmi1_; }
bool has_bmi2() const { return has_bmi2_; } bool has_bmi2() const { return has_bmi2_; }
...@@ -143,6 +144,7 @@ class V8_BASE_EXPORT CPU final { ...@@ -143,6 +144,7 @@ class V8_BASE_EXPORT CPU final {
bool is_atom_; bool is_atom_;
bool has_osxsave_; bool has_osxsave_;
bool has_avx_; bool has_avx_;
bool has_avx2_;
bool has_fma3_; bool has_fma3_;
bool has_bmi1_; bool has_bmi1_;
bool has_bmi2_; bool has_bmi2_;
......
...@@ -20,6 +20,7 @@ enum CpuFeature { ...@@ -20,6 +20,7 @@ enum CpuFeature {
SSE3, SSE3,
SAHF, SAHF,
AVX, AVX,
AVX2,
FMA3, FMA3,
BMI1, BMI1,
BMI2, BMI2,
......
...@@ -137,6 +137,9 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { ...@@ -137,6 +137,9 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
OSHasAVXSupport()) { OSHasAVXSupport()) {
supported_ |= 1u << AVX; supported_ |= 1u << AVX;
} }
if (cpu.has_avx2() && FLAG_enable_avx2 && IsSupported(AVX)) {
supported_ |= 1u << AVX2;
}
if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() && if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() &&
OSHasAVXSupport()) { OSHasAVXSupport()) {
supported_ |= 1u << FMA3; supported_ |= 1u << FMA3;
...@@ -155,13 +158,15 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { ...@@ -155,13 +158,15 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
void CpuFeatures::PrintTarget() {} void CpuFeatures::PrintTarget() {}
void CpuFeatures::PrintFeatures() { void CpuFeatures::PrintFeatures() {
printf( printf(
"SSE3=%d SSSE3=%d SSE4_1=%d AVX=%d FMA3=%d BMI1=%d BMI2=%d LZCNT=%d " "SSE3=%d SSSE3=%d SSE4_1=%d AVX=%d AVX2=%d FMA3=%d BMI1=%d BMI2=%d "
"LZCNT=%d "
"POPCNT=%d ATOM=%d\n", "POPCNT=%d ATOM=%d\n",
CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3), CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3),
CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(AVX), CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(AVX),
CpuFeatures::IsSupported(FMA3), CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(AVX2), CpuFeatures::IsSupported(FMA3),
CpuFeatures::IsSupported(BMI2), CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(BMI2),
CpuFeatures::IsSupported(POPCNT), CpuFeatures::IsSupported(ATOM)); CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(POPCNT),
CpuFeatures::IsSupported(ATOM));
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -92,6 +92,9 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { ...@@ -92,6 +92,9 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
OSHasAVXSupport()) { OSHasAVXSupport()) {
supported_ |= 1u << AVX; supported_ |= 1u << AVX;
} }
if (cpu.has_avx2() && FLAG_enable_avx2 && IsSupported(AVX)) {
supported_ |= 1u << AVX2;
}
if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() && if (cpu.has_fma3() && FLAG_enable_fma3 && cpu.has_osxsave() &&
OSHasAVXSupport()) { OSHasAVXSupport()) {
supported_ |= 1u << FMA3; supported_ |= 1u << FMA3;
...@@ -110,16 +113,18 @@ void CpuFeatures::ProbeImpl(bool cross_compile) { ...@@ -110,16 +113,18 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
void CpuFeatures::PrintTarget() {} void CpuFeatures::PrintTarget() {}
void CpuFeatures::PrintFeatures() { void CpuFeatures::PrintFeatures() {
printf( printf(
"SSE3=%d SSSE3=%d SSE4_1=%d SSE4_2=%d SAHF=%d AVX=%d FMA3=%d BMI1=%d " "SSE3=%d SSSE3=%d SSE4_1=%d SSE4_2=%d SAHF=%d AVX=%d AVX2=%d FMA3=%d "
"BMI1=%d "
"BMI2=%d " "BMI2=%d "
"LZCNT=%d " "LZCNT=%d "
"POPCNT=%d ATOM=%d\n", "POPCNT=%d ATOM=%d\n",
CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3), CpuFeatures::IsSupported(SSE3), CpuFeatures::IsSupported(SSSE3),
CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(SSE4_2), CpuFeatures::IsSupported(SSE4_1), CpuFeatures::IsSupported(SSE4_2),
CpuFeatures::IsSupported(SAHF), CpuFeatures::IsSupported(AVX), CpuFeatures::IsSupported(SAHF), CpuFeatures::IsSupported(AVX),
CpuFeatures::IsSupported(FMA3), CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(AVX2), CpuFeatures::IsSupported(FMA3),
CpuFeatures::IsSupported(BMI2), CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(BMI1), CpuFeatures::IsSupported(BMI2),
CpuFeatures::IsSupported(POPCNT), CpuFeatures::IsSupported(ATOM)); CpuFeatures::IsSupported(LZCNT), CpuFeatures::IsSupported(POPCNT),
CpuFeatures::IsSupported(ATOM));
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -1188,6 +1188,7 @@ DEFINE_BOOL(enable_sse4_2, true, ...@@ -1188,6 +1188,7 @@ DEFINE_BOOL(enable_sse4_2, true,
DEFINE_BOOL(enable_sahf, true, DEFINE_BOOL(enable_sahf, true,
"enable use of SAHF instruction if available (X64 only)") "enable use of SAHF instruction if available (X64 only)")
DEFINE_BOOL(enable_avx, true, "enable use of AVX instructions if available") DEFINE_BOOL(enable_avx, true, "enable use of AVX instructions if available")
DEFINE_BOOL(enable_avx2, true, "enable use of AVX2 instructions if available")
DEFINE_BOOL(enable_fma3, true, "enable use of FMA3 instructions if available") DEFINE_BOOL(enable_fma3, true, "enable use of FMA3 instructions if available")
DEFINE_BOOL(enable_bmi1, true, "enable use of BMI1 instructions if available") DEFINE_BOOL(enable_bmi1, true, "enable use of BMI1 instructions if available")
DEFINE_BOOL(enable_bmi2, true, "enable use of BMI2 instructions if available") DEFINE_BOOL(enable_bmi2, true, "enable use of BMI2 instructions if available")
......
...@@ -20,6 +20,7 @@ TEST(CPUTest, FeatureImplications) { ...@@ -20,6 +20,7 @@ TEST(CPUTest, FeatureImplications) {
EXPECT_TRUE(!cpu.has_sse42() || cpu.has_sse41()); EXPECT_TRUE(!cpu.has_sse42() || cpu.has_sse41());
EXPECT_TRUE(!cpu.has_avx() || cpu.has_sse2()); EXPECT_TRUE(!cpu.has_avx() || cpu.has_sse2());
EXPECT_TRUE(!cpu.has_fma3() || cpu.has_avx()); EXPECT_TRUE(!cpu.has_fma3() || cpu.has_avx());
EXPECT_TRUE(!cpu.has_avx2() || cpu.has_avx());
// arm features // arm features
EXPECT_TRUE(!cpu.has_vfp3_d32() || cpu.has_vfp3()); EXPECT_TRUE(!cpu.has_vfp3_d32() || cpu.has_vfp3());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment