Index: src/x64/codegen-x64.cc |
=================================================================== |
--- src/x64/codegen-x64.cc (revision 6572) |
+++ src/x64/codegen-x64.cc (working copy) |
@@ -6969,10 +6969,12 @@ |
__ j(not_equal, ¬_minus_half); |
// Calculates reciprocal of square root. |
- // Note that 1/sqrt(x) = sqrt(1/x)) |
- __ divsd(xmm3, xmm0); |
+ // sqrtsd returns -0 when input is -0. ECMA spec requires +0. |
+ __ xorpd(xmm1, xmm1); |
+ __ addsd(xmm1, xmm0); |
+ __ sqrtsd(xmm1, xmm1); |
+ __ divsd(xmm3, xmm1); |
__ movsd(xmm1, xmm3); |
- __ sqrtsd(xmm1, xmm1); |
__ jmp(&allocate_return); |
// Test for 0.5. |
@@ -6985,7 +6987,9 @@ |
call_runtime.Branch(not_equal); |
// Calculates square root. |
- __ movsd(xmm1, xmm0); |
+ // sqrtsd returns -0 when input is -0. ECMA spec requires +0. |
+ __ xorpd(xmm1, xmm1); |
+ __ addsd(xmm1, xmm0); |
__ sqrtsd(xmm1, xmm1); |
JumpTarget done; |