Index: src/x64/assembler-x64.cc |
diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc |
index 27d6cc3fd122438a3b254275a6d74bf1def163f6..3d226b59f105b8346ee07e1dbbe101284ba4f8a4 100644 |
--- a/src/x64/assembler-x64.cc |
+++ b/src/x64/assembler-x64.cc |
@@ -15,57 +15,27 @@ namespace internal { |
// ----------------------------------------------------------------------------- |
// Implementation of CpuFeatures |
- |
-#ifdef DEBUG |
-bool CpuFeatures::initialized_ = false; |
-#endif |
-uint64_t CpuFeatures::supported_ = 0; |
-uint64_t CpuFeatures::found_by_runtime_probing_only_ = 0; |
-uint64_t CpuFeatures::cross_compile_ = 0; |
- |
-ExternalReference ExternalReference::cpu_features() { |
- ASSERT(CpuFeatures::initialized_); |
- return ExternalReference(&CpuFeatures::supported_); |
-} |
- |
- |
-void CpuFeatures::Probe(bool serializer_enabled) { |
- ASSERT(supported_ == 0); |
-#ifdef DEBUG |
- initialized_ = true; |
-#endif |
- supported_ = 0; |
- if (serializer_enabled) { |
- supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
- return; // No features if we might serialize. |
- } |
- |
- uint64_t probed_features = 0; |
+void CpuFeatures::ProbeImpl(bool cross_compile) { |
CPU cpu; |
- if (cpu.has_sse41()) { |
- probed_features |= static_cast<uint64_t>(1) << SSE4_1; |
- } |
- if (cpu.has_sse3()) { |
- probed_features |= static_cast<uint64_t>(1) << SSE3; |
- } |
+ CHECK(cpu.has_sse2()); // SSE2 support is mandatory. |
+ CHECK(cpu.has_cmov()); // CMOV support is mandatory. |
- // SSE2 must be available on every x64 CPU. |
- ASSERT(cpu.has_sse2()); |
+ supported_ |= OS::CpuFeaturesImpliedByPlatform(); |
- // CMOV must be available on every x64 CPU. |
- ASSERT(cpu.has_cmov()); |
+ // Only use statically determined features for cross compile (snapshot). |
+ if (cross_compile) return; |
+ if (cpu.has_sse41() && FLAG_enable_sse4_1) supported_ |= 1u << SSE4_1; |
+ if (cpu.has_sse3() && FLAG_enable_sse3) supported_ |= 1u << SSE3; |
// SAHF is not generally available in long mode. |
- if (cpu.has_sahf()) { |
- probed_features |= static_cast<uint64_t>(1) << SAHF; |
- } |
- |
- uint64_t platform_features = OS::CpuFeaturesImpliedByPlatform(); |
- supported_ = probed_features | platform_features; |
- found_by_runtime_probing_only_ = probed_features & ~platform_features; |
+ if (cpu.has_sahf() && FLAG_enable_sahf) supported_|= 1u << SAHF; |
} |
+void CpuFeatures::PrintTarget() { } |
+void CpuFeatures::PrintFeatures() { } |
+ |
+ |
// ----------------------------------------------------------------------------- |
// Implementation of RelocInfo |
@@ -2220,6 +2190,7 @@ void Assembler::fnclex() { |
void Assembler::sahf() { |
// TODO(X64): Test for presence. Not all 64-bit intel CPU's have sahf |
// in 64-bit mode. Test CpuID. |
+ ASSERT(IsEnabled(SAHF)); |
EnsureSpace ensure_space(this); |
emit(0x9E); |
} |
@@ -2925,11 +2896,10 @@ void Assembler::dd(uint32_t data) { |
void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) { |
ASSERT(!RelocInfo::IsNone(rmode)); |
- if (rmode == RelocInfo::EXTERNAL_REFERENCE) { |
- // Don't record external references unless the heap will be serialized. |
- if (!Serializer::enabled(isolate()) && !emit_debug_code()) { |
- return; |
- } |
+ // Don't record external references unless the heap will be serialized. |
+ if (rmode == RelocInfo::EXTERNAL_REFERENCE && |
+ !serializer_enabled() && !emit_debug_code()) { |
+ return; |
} else if (rmode == RelocInfo::CODE_AGE_SEQUENCE) { |
// Don't record psuedo relocation info for code age sequence mode. |
return; |