| Index: src/ia32/code-stubs-ia32.cc
|
| diff --git a/src/ia32/code-stubs-ia32.cc b/src/ia32/code-stubs-ia32.cc
|
| index 5761b1627578f8136ed6f0798edf935bb2038df7..6c25f3cb3ee69753182dc916530960fab3f7d613 100644
|
| --- a/src/ia32/code-stubs-ia32.cc
|
| +++ b/src/ia32/code-stubs-ia32.cc
|
| @@ -326,10 +326,8 @@ void FloatingPointHelper::CheckFloatOperands(MacroAssembler* masm,
|
|
|
|
|
| void MathPowStub::Generate(MacroAssembler* masm) {
|
| - Factory* factory = isolate()->factory();
|
| const Register exponent = MathPowTaggedDescriptor::exponent();
|
| DCHECK(exponent.is(eax));
|
| - const Register base = edx;
|
| const Register scratch = ecx;
|
| const XMMRegister double_result = xmm3;
|
| const XMMRegister double_base = xmm2;
|
| @@ -342,38 +340,7 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ mov(scratch, Immediate(1));
|
| __ Cvtsi2sd(double_result, scratch);
|
|
|
| - if (exponent_type() == ON_STACK) {
|
| - Label base_is_smi, unpack_exponent;
|
| - // The exponent and base are supplied as arguments on the stack.
|
| - // This can only happen if the stub is called from non-optimized code.
|
| - // Load input parameters from stack.
|
| - __ mov(base, Operand(esp, 2 * kPointerSize));
|
| - __ mov(exponent, Operand(esp, 1 * kPointerSize));
|
| -
|
| - __ JumpIfSmi(base, &base_is_smi, Label::kNear);
|
| - __ cmp(FieldOperand(base, HeapObject::kMapOffset),
|
| - factory->heap_number_map());
|
| - __ j(not_equal, &call_runtime);
|
| -
|
| - __ movsd(double_base, FieldOperand(base, HeapNumber::kValueOffset));
|
| - __ jmp(&unpack_exponent, Label::kNear);
|
| -
|
| - __ bind(&base_is_smi);
|
| - __ SmiUntag(base);
|
| - __ Cvtsi2sd(double_base, base);
|
| -
|
| - __ bind(&unpack_exponent);
|
| - __ JumpIfNotSmi(exponent, &exponent_not_smi, Label::kNear);
|
| - __ SmiUntag(exponent);
|
| - __ jmp(&int_exponent);
|
| -
|
| - __ bind(&exponent_not_smi);
|
| - __ cmp(FieldOperand(exponent, HeapObject::kMapOffset),
|
| - factory->heap_number_map());
|
| - __ j(not_equal, &call_runtime);
|
| - __ movsd(double_exponent,
|
| - FieldOperand(exponent, HeapNumber::kValueOffset));
|
| - } else if (exponent_type() == TAGGED) {
|
| + if (exponent_type() == TAGGED) {
|
| __ JumpIfNotSmi(exponent, &exponent_not_smi, Label::kNear);
|
| __ SmiUntag(exponent);
|
| __ jmp(&int_exponent);
|
| @@ -397,79 +364,6 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ cmp(exponent, Immediate(0x1));
|
| __ j(overflow, &call_runtime);
|
|
|
| - if (exponent_type() == ON_STACK) {
|
| - // Detect square root case. Crankshaft detects constant +/-0.5 at
|
| - // compile time and uses DoMathPowHalf instead. We then skip this check
|
| - // for non-constant cases of +/-0.5 as these hardly occur.
|
| - Label continue_sqrt, continue_rsqrt, not_plus_half;
|
| - // Test for 0.5.
|
| - // Load double_scratch with 0.5.
|
| - __ mov(scratch, Immediate(0x3F000000u));
|
| - __ movd(double_scratch, scratch);
|
| - __ cvtss2sd(double_scratch, double_scratch);
|
| - // Already ruled out NaNs for exponent.
|
| - __ ucomisd(double_scratch, double_exponent);
|
| - __ j(not_equal, ¬_plus_half, Label::kNear);
|
| -
|
| - // Calculates square root of base. Check for the special case of
|
| - // Math.pow(-Infinity, 0.5) == Infinity (ECMA spec, 15.8.2.13).
|
| - // According to IEEE-754, single-precision -Infinity has the highest
|
| - // 9 bits set and the lowest 23 bits cleared.
|
| - __ mov(scratch, 0xFF800000u);
|
| - __ movd(double_scratch, scratch);
|
| - __ cvtss2sd(double_scratch, double_scratch);
|
| - __ ucomisd(double_base, double_scratch);
|
| - // Comparing -Infinity with NaN results in "unordered", which sets the
|
| - // zero flag as if both were equal. However, it also sets the carry flag.
|
| - __ j(not_equal, &continue_sqrt, Label::kNear);
|
| - __ j(carry, &continue_sqrt, Label::kNear);
|
| -
|
| - // Set result to Infinity in the special case.
|
| - __ xorps(double_result, double_result);
|
| - __ subsd(double_result, double_scratch);
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&continue_sqrt);
|
| - // sqrtsd returns -0 when input is -0. ECMA spec requires +0.
|
| - __ xorps(double_scratch, double_scratch);
|
| - __ addsd(double_scratch, double_base); // Convert -0 to +0.
|
| - __ sqrtsd(double_result, double_scratch);
|
| - __ jmp(&done);
|
| -
|
| - // Test for -0.5.
|
| - __ bind(¬_plus_half);
|
| - // Load double_exponent with -0.5 by substracting 1.
|
| - __ subsd(double_scratch, double_result);
|
| - // Already ruled out NaNs for exponent.
|
| - __ ucomisd(double_scratch, double_exponent);
|
| - __ j(not_equal, &fast_power, Label::kNear);
|
| -
|
| - // Calculates reciprocal of square root of base. Check for the special
|
| - // case of Math.pow(-Infinity, -0.5) == 0 (ECMA spec, 15.8.2.13).
|
| - // According to IEEE-754, single-precision -Infinity has the highest
|
| - // 9 bits set and the lowest 23 bits cleared.
|
| - __ mov(scratch, 0xFF800000u);
|
| - __ movd(double_scratch, scratch);
|
| - __ cvtss2sd(double_scratch, double_scratch);
|
| - __ ucomisd(double_base, double_scratch);
|
| - // Comparing -Infinity with NaN results in "unordered", which sets the
|
| - // zero flag as if both were equal. However, it also sets the carry flag.
|
| - __ j(not_equal, &continue_rsqrt, Label::kNear);
|
| - __ j(carry, &continue_rsqrt, Label::kNear);
|
| -
|
| - // Set result to 0 in the special case.
|
| - __ xorps(double_result, double_result);
|
| - __ jmp(&done);
|
| -
|
| - __ bind(&continue_rsqrt);
|
| - // sqrtsd returns -0 when input is -0. ECMA spec requires +0.
|
| - __ xorps(double_exponent, double_exponent);
|
| - __ addsd(double_exponent, double_base); // Convert -0 to +0.
|
| - __ sqrtsd(double_exponent, double_exponent);
|
| - __ divsd(double_result, double_exponent);
|
| - __ jmp(&done);
|
| - }
|
| -
|
| // Using FPU instructions to calculate power.
|
| Label fast_power_failed;
|
| __ bind(&fast_power);
|
| @@ -559,39 +453,25 @@ void MathPowStub::Generate(MacroAssembler* masm) {
|
| __ Cvtsi2sd(double_exponent, exponent);
|
|
|
| // Returning or bailing out.
|
| - if (exponent_type() == ON_STACK) {
|
| - // The arguments are still on the stack.
|
| - __ bind(&call_runtime);
|
| - __ TailCallRuntime(Runtime::kMathPowRT);
|
| -
|
| - // The stub is called from non-optimized code, which expects the result
|
| - // as heap number in exponent.
|
| - __ bind(&done);
|
| - __ AllocateHeapNumber(eax, scratch, base, &call_runtime);
|
| - __ movsd(FieldOperand(eax, HeapNumber::kValueOffset), double_result);
|
| - __ ret(2 * kPointerSize);
|
| - } else {
|
| - __ bind(&call_runtime);
|
| - {
|
| - AllowExternalCallThatCantCauseGC scope(masm);
|
| - __ PrepareCallCFunction(4, scratch);
|
| - __ movsd(Operand(esp, 0 * kDoubleSize), double_base);
|
| - __ movsd(Operand(esp, 1 * kDoubleSize), double_exponent);
|
| - __ CallCFunction(
|
| - ExternalReference::power_double_double_function(isolate()), 4);
|
| - }
|
| - // Return value is in st(0) on ia32.
|
| - // Store it into the (fixed) result register.
|
| - __ sub(esp, Immediate(kDoubleSize));
|
| - __ fstp_d(Operand(esp, 0));
|
| - __ movsd(double_result, Operand(esp, 0));
|
| - __ add(esp, Immediate(kDoubleSize));
|
| -
|
| - __ bind(&done);
|
| - __ ret(0);
|
| + __ bind(&call_runtime);
|
| + {
|
| + AllowExternalCallThatCantCauseGC scope(masm);
|
| + __ PrepareCallCFunction(4, scratch);
|
| + __ movsd(Operand(esp, 0 * kDoubleSize), double_base);
|
| + __ movsd(Operand(esp, 1 * kDoubleSize), double_exponent);
|
| + __ CallCFunction(ExternalReference::power_double_double_function(isolate()),
|
| + 4);
|
| }
|
| -}
|
| + // Return value is in st(0) on ia32.
|
| + // Store it into the (fixed) result register.
|
| + __ sub(esp, Immediate(kDoubleSize));
|
| + __ fstp_d(Operand(esp, 0));
|
| + __ movsd(double_result, Operand(esp, 0));
|
| + __ add(esp, Immediate(kDoubleSize));
|
|
|
| + __ bind(&done);
|
| + __ ret(0);
|
| +}
|
|
|
| void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
|
| Label miss;
|
|
|