From: yangguo@chromium.org Date: Thu, 8 Dec 2011 14:36:36 +0000 (+0000) Subject: MIPS: Fixing MathPowHalf on ARM. X-Git-Tag: upstream/4.7.83~17748 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f206e15c42f27b4933360f1c6a6469f8ba9c1219;p=platform%2Fupstream%2Fv8.git MIPS: Fixing MathPowHalf on ARM. Port r10166 (b57f3f1a), r10167 (202eada9) and r10170 (5c5c96da). BUG= TEST= Review URL: http://codereview.chromium.org/8822014 Patch from Daniel Kalmar . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10214 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 552f3e3..7ccde79 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -3002,13 +3002,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)); + + 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); } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 19892fc..d824dee 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -1152,6 +1152,13 @@ LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { LOperand* input = UseFixedDouble(instr->value(), f4); LUnaryMathOperation* result = new LUnaryMathOperation(input, NULL); return MarkAsCall(DefineFixedDouble(result, f4), instr); + } else if (op == kMathPowHalf) { + // Input cannot be the same as the result. + // See lithium-codegen-mips.cc::DoMathPowHalf. + LOperand* input = UseFixedDouble(instr->value(), f8); + LOperand* temp = FixedTemp(f6); + LUnaryMathOperation* result = new LUnaryMathOperation(input, temp); + return DefineFixedDouble(result, f4); } else { LOperand* input = UseRegisterAtStart(instr->value()); LOperand* temp = (op == kMathFloor) ? TempRegister() : NULL; @@ -1165,8 +1172,6 @@ LInstruction* LChunkBuilder::DoUnaryMathOperation(HUnaryMathOperation* instr) { return DefineAsRegister(result); case kMathRound: return AssignEnvironment(DefineAsRegister(result)); - case kMathPowHalf: - return DefineAsRegister(result); default: UNREACHABLE(); return NULL;