Index: src/x64/codegen-x64.cc |
diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc |
index 4f9c87b30105361d1a1906977d1dd6d116f64391..f5a8ec35619f4da0862ea52b1af7368676036f1c 100644 |
--- a/src/x64/codegen-x64.cc |
+++ b/src/x64/codegen-x64.cc |
@@ -87,97 +87,6 @@ UnaryMathFunctionWithIsolate CreateSqrtFunction(Isolate* isolate) { |
return FUNCTION_CAST<UnaryMathFunctionWithIsolate>(buffer); |
} |
- |
-#ifdef _WIN64 |
-typedef double (*ModuloFunction)(double, double); |
-// Define custom fmod implementation. |
-ModuloFunction CreateModuloFunction() { |
- size_t actual_size; |
- byte* buffer = static_cast<byte*>( |
- base::OS::Allocate(Assembler::kMinimalBufferSize, &actual_size, true)); |
- CHECK(buffer); |
- MacroAssembler masm(NULL, buffer, static_cast<int>(actual_size), |
- CodeObjectRequired::kNo); |
- // Generated code is put into a fixed, unmovable, buffer, and not into |
- // the V8 heap. We can't, and don't, refer to any relocatable addresses |
- // (e.g. the JavaScript nan-object). |
- |
- // Windows 64 ABI passes double arguments in xmm0, xmm1 and |
- // returns result in xmm0. |
- // Argument backing space is allocated on the stack above |
- // the return address. |
- |
- // Compute x mod y. |
- // Load y and x (use argument backing store as temporary storage). |
- __ Movsd(Operand(rsp, kRegisterSize * 2), xmm1); |
- __ Movsd(Operand(rsp, kRegisterSize), xmm0); |
- __ fld_d(Operand(rsp, kRegisterSize * 2)); |
- __ fld_d(Operand(rsp, kRegisterSize)); |
- |
- // Clear exception flags before operation. |
- { |
- Label no_exceptions; |
- __ fwait(); |
- __ fnstsw_ax(); |
- // Clear if Illegal Operand or Zero Division exceptions are set. |
- __ testb(rax, Immediate(5)); |
- __ j(zero, &no_exceptions); |
- __ fnclex(); |
- __ bind(&no_exceptions); |
- } |
- |
- // Compute st(0) % st(1) |
- { |
- Label partial_remainder_loop; |
- __ bind(&partial_remainder_loop); |
- __ fprem(); |
- __ fwait(); |
- __ fnstsw_ax(); |
- __ testl(rax, Immediate(0x400 /* C2 */)); |
- // If C2 is set, computation only has partial result. Loop to |
- // continue computation. |
- __ j(not_zero, &partial_remainder_loop); |
- } |
- |
- Label valid_result; |
- Label return_result; |
- // If Invalid Operand or Zero Division exceptions are set, |
- // return NaN. |
- __ testb(rax, Immediate(5)); |
- __ j(zero, &valid_result); |
- __ fstp(0); // Drop result in st(0). |
- int64_t kNaNValue = V8_INT64_C(0x7ff8000000000000); |
- __ movq(rcx, kNaNValue); |
- __ movq(Operand(rsp, kRegisterSize), rcx); |
- __ Movsd(xmm0, Operand(rsp, kRegisterSize)); |
- __ jmp(&return_result); |
- |
- // If result is valid, return that. |
- __ bind(&valid_result); |
- __ fstp_d(Operand(rsp, kRegisterSize)); |
- __ Movsd(xmm0, Operand(rsp, kRegisterSize)); |
- |
- // Clean up FPU stack and exceptions and return xmm0 |
- __ bind(&return_result); |
- __ fstp(0); // Unload y. |
- |
- Label clear_exceptions; |
- __ testb(rax, Immediate(0x3f /* Any Exception*/)); |
- __ j(not_zero, &clear_exceptions); |
- __ ret(0); |
- __ bind(&clear_exceptions); |
- __ fnclex(); |
- __ ret(0); |
- |
- CodeDesc desc; |
- masm.GetCode(&desc); |
- base::OS::ProtectCode(buffer, actual_size); |
- // Call the function from C++ through this pointer. |
- return FUNCTION_CAST<ModuloFunction>(buffer); |
-} |
- |
-#endif |
- |
#undef __ |
// ------------------------------------------------------------------------- |