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 <kalmard@homejinni.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10214 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
251caf1b22
commit
f206e15c42
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user