Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index 0af1f50a8e6498de99f5f5d8f0ca735e12a453e5..760ce30c2faeb686821aad25eae347bcc8ea2ba2 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -2996,13 +2996,24 @@ void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) { |
void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) { |
DoubleRegister input = ToDoubleRegister(instr->InputAt(0)); |
DoubleRegister result = ToDoubleRegister(instr->result()); |
- DoubleRegister double_scratch = double_scratch0(); |
+ DoubleRegister temp = ToDoubleRegister(instr->TempAt(0)); |
+ |
Yang
2011/12/06 16:21:53
From what I can see, you don't need to reserve an
kalmard
2011/12/08 13:19:27
I generally try to stick close to the ARM version
|
+ ASSERT(!input.is(result)); |
+ |
+ // Note that according to ECMA-262 15.8.2.13: |
+ // Math.pow(-Infinity, 0.5) == Infinity |
+ // Math.sqrt(-Infinity) == NaN |
+ Label done; |
+ __ Move(temp, -V8_INFINITY); |
+ __ BranchF(USE_DELAY_SLOT, &done, NULL, eq, temp, input); |
+ // Set up Infinity in the delay slot. |
+ // result is overwritten if the branch is not taken. |
+ __ neg_d(result, temp); |
// Add +0 to convert -0 to +0. |
- __ mtc1(zero_reg, double_scratch.low()); |
- __ mtc1(zero_reg, double_scratch.high()); |
- __ add_d(result, input, double_scratch); |
+ __ add_d(result, input, kDoubleRegZero); |
__ sqrt_d(result, result); |
+ __ bind(&done); |
} |