Chromium Code Reviews| Index: src/arm/lithium-codegen-arm.cc |
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc |
| index afe90159bc3dd520ef48962a9487f00d180f2898..f271f04fd1419f487149ef95f6b6b56e23fc3505 100644 |
| --- a/src/arm/lithium-codegen-arm.cc |
| +++ b/src/arm/lithium-codegen-arm.cc |
| @@ -745,10 +745,6 @@ void LCodeGen::DoCallStub(LCallStub* instr) { |
| CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| break; |
| } |
| - case CodeStub::MathPow: { |
| - Abort("MathPowStub unimplemented."); |
| - break; |
| - } |
| case CodeStub::NumberToString: { |
| NumberToStringStub stub; |
| CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); |
| @@ -2646,6 +2642,22 @@ void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) { |
| } |
| +void LCodeGen::DoMathPowHalf(LUnaryMathOperation* instr) { |
| + DoubleRegister input = ToDoubleRegister(instr->InputAt(0)); |
| + Register scratch = scratch0(); |
| + SwVfpRegister single_scratch = double_scratch0().low(); |
| + DoubleRegister double_scratch = double_scratch0(); |
| + ASSERT(ToDoubleRegister(instr->result()).is(input)); |
| + |
| + // Add +0 to convert -0 to +0. |
| + __ eor(scratch, scratch, Operand(scratch)); |
|
Søren Thygesen Gjesse
2011/03/08 10:05:12
On ARM just using mov(scratch, Operand(0)) should
Karl Klose
2011/03/08 10:29:00
Done.
|
| + __ vmov(single_scratch, scratch); |
| + __ vcvt_f64_s32(double_scratch, single_scratch); |
| + __ vadd(input, input, double_scratch); |
| + __ vsqrt(input, input); |
| +} |
| + |
| + |
| void LCodeGen::DoPower(LPower* instr) { |
| LOperand* left = instr->InputAt(0); |
| LOperand* right = instr->InputAt(1); |
| @@ -2742,6 +2754,9 @@ void LCodeGen::DoUnaryMathOperation(LUnaryMathOperation* instr) { |
| case kMathSqrt: |
| DoMathSqrt(instr); |
| break; |
| + case kMathPowHalf: |
| + DoMathPowHalf(instr); |
| + break; |
| case kMathCos: |
| DoMathCos(instr); |
| break; |