| Index: src/ia32/assembler-ia32.cc
|
| diff --git a/src/ia32/assembler-ia32.cc b/src/ia32/assembler-ia32.cc
|
| index 2805fa0f9a8a7f84dc0c137f798ded16510893be..168a19644981172fc3268d9e87c38aa2dc13a177 100644
|
| --- a/src/ia32/assembler-ia32.cc
|
| +++ b/src/ia32/assembler-ia32.cc
|
| @@ -34,7 +34,11 @@
|
| // significantly by Google Inc.
|
| // Copyright 2012 the V8 project authors. All rights reserved.
|
|
|
| -#include "src/v8.h"
|
| +#include "src/ia32/assembler-ia32.h"
|
| +
|
| +#if V8_OS_MACOSX
|
| +#include <sys/sysctl.h>
|
| +#endif
|
|
|
| #if V8_TARGET_ARCH_IA32
|
|
|
| @@ -42,7 +46,7 @@
|
| #include "src/base/cpu.h"
|
| #include "src/disassembler.h"
|
| #include "src/macro-assembler.h"
|
| -#include "src/serialize.h"
|
| +#include "src/v8.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
| @@ -50,6 +54,29 @@ namespace internal {
|
| // -----------------------------------------------------------------------------
|
| // Implementation of CpuFeatures
|
|
|
| +namespace {
|
| +
|
| +bool EnableAVX() {
|
| +#if V8_OS_MACOSX
|
| + // Mac OS X 10.9 has a bug where AVX transitions were indeed being caused by
|
| + // ISRs, so we detect Mac OS X 10.9 here and disable AVX in that case.
|
| + char buffer[128];
|
| + size_t buffer_size = arraysize(buffer);
|
| + int ctl_name[] = { CTL_KERN , KERN_OSRELEASE };
|
| + if (sysctl(ctl_name, 2, buffer, &buffer_size, nullptr, 0) != 0) {
|
| + V8_Fatal(__FILE__, __LINE__, "V8 failed to get kernel version");
|
| + }
|
| + // The buffer now contains a string of the form XX.YY.ZZ, where
|
| + // XX is the major kernel version component. 13.x.x (Mavericks) is
|
| + // affected by this bug, so disable AVX there.
|
| + if (memcmp(buffer, "13.", 3) == 0) return false;
|
| +#endif // V8_OS_MACOSX
|
| + return FLAG_enable_avx;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +
|
| void CpuFeatures::ProbeImpl(bool cross_compile) {
|
| base::CPU cpu;
|
| CHECK(cpu.has_sse2()); // SSE2 support is mandatory.
|
| @@ -60,7 +87,7 @@ void CpuFeatures::ProbeImpl(bool cross_compile) {
|
|
|
| if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1;
|
| if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3;
|
| - if (cpu.has_avx() && FLAG_enable_avx) supported_ |= 1u << AVX;
|
| + if (cpu.has_avx() && EnableAVX()) supported_ |= 1u << AVX;
|
| if (cpu.has_fma3() && FLAG_enable_fma3) supported_ |= 1u << FMA3;
|
| }
|
|
|
|
|