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; |