Index: src/x87/codegen-x87.cc |
diff --git a/src/x87/codegen-x87.cc b/src/x87/codegen-x87.cc |
index 5df3f1f02616e21276d3a0aeafd1ac98e95faa81..7f99fe332b79a922b9374b012ed59a7c3a39c93b 100644 |
--- a/src/x87/codegen-x87.cc |
+++ b/src/x87/codegen-x87.cc |
@@ -41,8 +41,27 @@ UnaryMathFunction CreateExpFunction() { |
UnaryMathFunction CreateSqrtFunction() { |
- // No SSE2 support |
- return &std::sqrt; |
+ size_t actual_size; |
+ // Allocate buffer in executable space. |
+ byte* buffer = |
+ static_cast<byte*>(base::OS::Allocate(1 * KB, &actual_size, true)); |
+ if (buffer == NULL) return &std::sqrt; |
+ |
+ MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size)); |
+ // Load double input into registers. |
+ __ fld_d(MemOperand(esp, 4)); |
+ __ X87SetFPUCW(0x027F); |
+ __ fsqrt(); |
+ __ X87SetFPUCW(0x037F); |
+ __ Ret(); |
+ |
+ CodeDesc desc; |
+ masm.GetCode(&desc); |
+ DCHECK(!RelocInfo::RequiresRelocation(desc)); |
+ |
+ Assembler::FlushICacheWithoutIsolate(buffer, actual_size); |
+ base::OS::ProtectCode(buffer, actual_size); |
+ return FUNCTION_CAST<UnaryMathFunction>(buffer); |
} |