Index: runtime/vm/assembler_ia32.cc |
=================================================================== |
--- runtime/vm/assembler_ia32.cc (revision 32974) |
+++ runtime/vm/assembler_ia32.cc (working copy) |
@@ -7,6 +7,7 @@ |
#include "vm/assembler.h" |
#include "vm/code_generator.h" |
+#include "vm/cpu.h" |
#include "vm/heap.h" |
#include "vm/memory_region.h" |
#include "vm/runtime_entry.h" |
@@ -16,62 +17,9 @@ |
namespace dart { |
DEFINE_FLAG(bool, print_stop_message, true, "Print stop message."); |
-DEFINE_FLAG(bool, use_sse41, true, "Use SSE 4.1 if available"); |
DECLARE_FLAG(bool, inline_alloc); |
-bool CPUFeatures::sse2_supported_ = false; |
-bool CPUFeatures::sse4_1_supported_ = false; |
-#ifdef DEBUG |
-bool CPUFeatures::initialized_ = false; |
-#endif |
- |
- |
-bool CPUFeatures::sse2_supported() { |
- DEBUG_ASSERT(initialized_); |
- return sse2_supported_; |
-} |
- |
- |
-bool CPUFeatures::sse4_1_supported() { |
- DEBUG_ASSERT(initialized_); |
- return sse4_1_supported_ && FLAG_use_sse41; |
-} |
- |
- |
-#define __ assembler. |
- |
-void CPUFeatures::InitOnce() { |
- Assembler assembler; |
- __ pushl(EBP); |
- __ pushl(EBX); |
- __ movl(EBP, ESP); |
- // Get feature information in ECX:EDX and return it in EDX:EAX. |
- __ movl(EAX, Immediate(1)); |
- __ cpuid(); |
- __ movl(EAX, EDX); |
- __ movl(EDX, ECX); |
- __ movl(ESP, EBP); |
- __ popl(EBX); |
- __ popl(EBP); |
- __ ret(); |
- |
- const Code& code = |
- Code::Handle(Code::FinalizeCode("DetectCPUFeatures", &assembler)); |
- Instructions& instructions = Instructions::Handle(code.instructions()); |
- typedef uint64_t (*DetectCPUFeatures)(); |
- uint64_t features = |
- reinterpret_cast<DetectCPUFeatures>(instructions.EntryPoint())(); |
- sse2_supported_ = (features & kSSE2BitMask) != 0; |
- sse4_1_supported_ = (features & kSSE4_1BitMask) != 0; |
-#ifdef DEBUG |
- initialized_ = true; |
-#endif |
-} |
- |
-#undef __ |
- |
- |
class DirectCallRelocation : public AssemblerFixup { |
public: |
void Process(const MemoryRegion& region, intptr_t position) { |
@@ -1222,7 +1170,7 @@ |
void Assembler::pextrd(Register dst, XmmRegister src, const Immediate& imm) { |
- ASSERT(CPUFeatures::sse4_1_supported()); |
+ ASSERT(TargetCPUFeatures::sse4_1_supported()); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
EmitUint8(0x0F); |
@@ -1235,7 +1183,7 @@ |
void Assembler::pmovsxdq(XmmRegister dst, XmmRegister src) { |
- ASSERT(CPUFeatures::sse4_1_supported()); |
+ ASSERT(TargetCPUFeatures::sse4_1_supported()); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
EmitUint8(0x0F); |
@@ -1246,7 +1194,7 @@ |
void Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) { |
- ASSERT(CPUFeatures::sse4_1_supported()); |
+ ASSERT(TargetCPUFeatures::sse4_1_supported()); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
EmitUint8(0x0F); |
@@ -1266,7 +1214,7 @@ |
void Assembler::roundsd(XmmRegister dst, XmmRegister src, RoundingMode mode) { |
- ASSERT(CPUFeatures::sse4_1_supported()); |
+ ASSERT(TargetCPUFeatures::sse4_1_supported()); |
AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
EmitUint8(0x66); |
EmitUint8(0x0F); |