Index: src/ia32/assembler-ia32.h |
diff --git a/src/ia32/assembler-ia32.h b/src/ia32/assembler-ia32.h |
index 7c3999b85f112ab9a80c4967c9ecddcb9a4a4b3f..07851f865cc1da08504f9b9631045ae1480aac97 100644 |
--- a/src/ia32/assembler-ia32.h |
+++ b/src/ia32/assembler-ia32.h |
@@ -535,31 +535,52 @@ class CpuFeatures : public AllStatic { |
// Check whether a feature is supported by the target CPU. |
static bool IsSupported(CpuFeature f) { |
ASSERT(initialized_); |
+ if (Check(f, cross_compile_)) return true; |
if (f == SSE2 && !FLAG_enable_sse2) return false; |
if (f == SSE3 && !FLAG_enable_sse3) return false; |
if (f == SSE4_1 && !FLAG_enable_sse4_1) return false; |
if (f == CMOV && !FLAG_enable_cmov) return false; |
- return (supported_ & (static_cast<uint64_t>(1) << f)) != 0; |
+ return Check(f, supported_); |
} |
static bool IsFoundByRuntimeProbingOnly(CpuFeature f) { |
ASSERT(initialized_); |
- return (found_by_runtime_probing_only_ & |
- (static_cast<uint64_t>(1) << f)) != 0; |
+ return Check(f, found_by_runtime_probing_only_); |
} |
static bool IsSafeForSnapshot(CpuFeature f) { |
- return (IsSupported(f) && |
+ return Check(f, cross_compile_) || |
+ (IsSupported(f) && |
(!Serializer::enabled() || !IsFoundByRuntimeProbingOnly(f))); |
} |
+ static bool VerifyCrossCompiling() { |
+ return cross_compile_ == 0; |
+ } |
+ |
+ static bool VerifyCrossCompiling(CpuFeature f) { |
+ uint64_t mask = flag2set(f); |
+ return cross_compile_ == 0 || |
+ (cross_compile_ & mask) == mask; |
+ } |
+ |
private: |
+ static bool Check(CpuFeature f, uint64_t set) { |
+ return (set & flag2set(f)) != 0; |
+ } |
+ |
+ static uint64_t flag2set(CpuFeature f) { |
+ return static_cast<uint64_t>(1) << f; |
+ } |
+ |
#ifdef DEBUG |
static bool initialized_; |
#endif |
static uint64_t supported_; |
static uint64_t found_by_runtime_probing_only_; |
+ static uint64_t cross_compile_; |
+ |
friend class ExternalReference; |
friend class PlatformFeatureScope; |
DISALLOW_COPY_AND_ASSIGN(CpuFeatures); |