| Index: src/ia32/assembler-ia32.cc
|
| ===================================================================
|
| --- src/ia32/assembler-ia32.cc (revision 3297)
|
| +++ src/ia32/assembler-ia32.cc (working copy)
|
| @@ -49,6 +49,7 @@
|
| // Safe default is no features.
|
| uint64_t CpuFeatures::supported_ = 0;
|
| uint64_t CpuFeatures::enabled_ = 0;
|
| +uint64_t CpuFeatures::found_by_runtime_probing_ = 0;
|
|
|
|
|
| // The Probe method needs executable memory, so it uses Heap::CreateCode.
|
| @@ -56,7 +57,10 @@
|
| void CpuFeatures::Probe() {
|
| ASSERT(Heap::HasBeenSetup());
|
| ASSERT(supported_ == 0);
|
| - if (Serializer::enabled()) return; // No features if we might serialize.
|
| + if (Serializer::enabled()) {
|
| + supported_ |= OS::CpuFeaturesImpliedByPlatform();
|
| + return; // No features if we might serialize.
|
| + }
|
|
|
| Assembler assm(NULL, 0);
|
| Label cpuid, done;
|
| @@ -124,6 +128,10 @@
|
| typedef uint64_t (*F0)();
|
| F0 probe = FUNCTION_CAST<F0>(Code::cast(code)->entry());
|
| supported_ = probe();
|
| + found_by_runtime_probing_ = supported_;
|
| + uint64_t os_guarantees = OS::CpuFeaturesImpliedByPlatform();
|
| + supported_ |= os_guarantees;
|
| + found_by_runtime_probing_ &= ~os_guarantees;
|
| }
|
|
|
|
|
| @@ -360,7 +368,7 @@
|
|
|
|
|
| void Assembler::cpuid() {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CPUID));
|
| + ASSERT(CpuFeatures::IsEnabled(CPUID));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x0F);
|
| @@ -712,7 +720,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, int32_t imm32) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CMOV));
|
| + ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| UNIMPLEMENTED();
|
| @@ -723,7 +731,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, Handle<Object> handle) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CMOV));
|
| + ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| UNIMPLEMENTED();
|
| @@ -734,7 +742,7 @@
|
|
|
|
|
| void Assembler::cmov(Condition cc, Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CMOV));
|
| + ASSERT(CpuFeatures::IsEnabled(CMOV));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| // Opcode: 0f 40 + cc /r
|
| @@ -1316,7 +1324,7 @@
|
|
|
|
|
| void Assembler::rdtsc() {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::RDTSC));
|
| + ASSERT(CpuFeatures::IsEnabled(RDTSC));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x0F);
|
| @@ -1662,7 +1670,7 @@
|
|
|
|
|
| void Assembler::fisttp_s(const Operand& adr) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE3));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE3));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xDB);
|
| @@ -1923,7 +1931,7 @@
|
|
|
|
|
| void Assembler::cvttss2si(Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF3);
|
| @@ -1934,7 +1942,7 @@
|
|
|
|
|
| void Assembler::cvttsd2si(Register dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -1945,7 +1953,7 @@
|
|
|
|
|
| void Assembler::cvtsi2sd(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -1956,7 +1964,7 @@
|
|
|
|
|
| void Assembler::addsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -1967,7 +1975,7 @@
|
|
|
|
|
| void Assembler::mulsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -1978,7 +1986,7 @@
|
|
|
|
|
| void Assembler::subsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -1989,7 +1997,7 @@
|
|
|
|
|
| void Assembler::divsd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2);
|
| @@ -2000,7 +2008,7 @@
|
|
|
|
|
| void Assembler::comisd(XMMRegister dst, XMMRegister src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0x66);
|
| @@ -2025,7 +2033,7 @@
|
|
|
|
|
| void Assembler::movsd(const Operand& dst, XMMRegister src ) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2); // double
|
| @@ -2036,7 +2044,7 @@
|
|
|
|
|
| void Assembler::movsd(XMMRegister dst, const Operand& src) {
|
| - ASSERT(CpuFeatures::IsEnabled(CpuFeatures::SSE2));
|
| + ASSERT(CpuFeatures::IsEnabled(SSE2));
|
| EnsureSpace ensure_space(this);
|
| last_pc_ = pc_;
|
| EMIT(0xF2); // double
|
| @@ -2245,10 +2253,15 @@
|
| void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
|
| ASSERT(rmode != RelocInfo::NONE);
|
| // Don't record external references unless the heap will be serialized.
|
| - if (rmode == RelocInfo::EXTERNAL_REFERENCE &&
|
| - !Serializer::enabled() &&
|
| - !FLAG_debug_code) {
|
| - return;
|
| + if (rmode == RelocInfo::EXTERNAL_REFERENCE) {
|
| +#ifdef DEBUG
|
| + if (!Serializer::enabled()) {
|
| + Serializer::TooLateToEnableNow();
|
| + }
|
| +#endif
|
| + if (!Serializer::enabled() && !FLAG_debug_code) {
|
| + return;
|
| + }
|
| }
|
| RelocInfo rinfo(pc_, rmode, data);
|
| reloc_info_writer.Write(&rinfo);
|
|
|