| Index: src/crankshaft/x87/lithium-codegen-x87.cc
|
| diff --git a/src/crankshaft/x87/lithium-codegen-x87.cc b/src/crankshaft/x87/lithium-codegen-x87.cc
|
| index 4c405337c687ce2129db1f62438e00f2729c00cb..ab19eea38ea74123049031dc7b8591304cbda740 100644
|
| --- a/src/crankshaft/x87/lithium-codegen-x87.cc
|
| +++ b/src/crankshaft/x87/lithium-codegen-x87.cc
|
| @@ -3702,65 +3702,17 @@ void LCodeGen::DoMathClz32(LMathClz32* instr) {
|
|
|
|
|
| void LCodeGen::DoMathExp(LMathExp* instr) {
|
| - X87Register input = ToX87Register(instr->value());
|
| - X87Register result_reg = ToX87Register(instr->result());
|
| - Register temp_result = ToRegister(instr->temp1());
|
| - Register temp = ToRegister(instr->temp2());
|
| - Label slow, done, smi, finish;
|
| - DCHECK(result_reg.is(input));
|
| -
|
| - // Store input into Heap number and call runtime function kMathExpRT.
|
| - if (FLAG_inline_new) {
|
| - __ AllocateHeapNumber(temp_result, temp, no_reg, &slow);
|
| - __ jmp(&done, Label::kNear);
|
| - }
|
| -
|
| - // Slow case: Call the runtime system to do the number allocation.
|
| - __ bind(&slow);
|
| - {
|
| - // TODO(3095996): Put a valid pointer value in the stack slot where the
|
| - // result register is stored, as this register is in the pointer map, but
|
| - // contains an integer value.
|
| - __ Move(temp_result, Immediate(0));
|
| -
|
| - // Preserve the value of all registers.
|
| - PushSafepointRegistersScope scope(this);
|
| -
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| - __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
|
| - RecordSafepointWithRegisters(instr->pointer_map(), 0,
|
| - Safepoint::kNoLazyDeopt);
|
| - __ StoreToSafepointRegisterSlot(temp_result, eax);
|
| - }
|
| - __ bind(&done);
|
| - X87LoadForUsage(input);
|
| - __ fstp_d(FieldOperand(temp_result, HeapNumber::kValueOffset));
|
| -
|
| - {
|
| - // Preserve the value of all registers.
|
| - PushSafepointRegistersScope scope(this);
|
| + X87Register result = ToX87Register(instr->result());
|
| + X87Register input_reg = ToX87Register(instr->value());
|
| + __ fld(x87_stack_.st(input_reg));
|
|
|
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| - __ push(temp_result);
|
| - __ CallRuntimeSaveDoubles(Runtime::kMathExpRT);
|
| - RecordSafepointWithRegisters(instr->pointer_map(), 1,
|
| - Safepoint::kNoLazyDeopt);
|
| - __ StoreToSafepointRegisterSlot(temp_result, eax);
|
| - }
|
| - X87PrepareToWrite(result_reg);
|
| - // return value of MathExpRT is Smi or Heap Number.
|
| - __ JumpIfSmi(temp_result, &smi);
|
| - // Heap number(double)
|
| - __ fld_d(FieldOperand(temp_result, HeapNumber::kValueOffset));
|
| - __ jmp(&finish);
|
| - // SMI
|
| - __ bind(&smi);
|
| - __ SmiUntag(temp_result);
|
| - __ push(temp_result);
|
| - __ fild_s(MemOperand(esp, 0));
|
| - __ pop(temp_result);
|
| - __ bind(&finish);
|
| - X87CommitWrite(result_reg);
|
| + // Pass one double as argument on the stack.
|
| + __ PrepareCallCFunction(2, eax);
|
| + __ fstp_d(MemOperand(esp, 0));
|
| + X87PrepareToWrite(result);
|
| + __ CallCFunction(ExternalReference::ieee754_exp_function(isolate()), 2);
|
| + // Return value is in st(0) on ia32.
|
| + X87CommitWrite(result);
|
| }
|
|
|
| void LCodeGen::PrepareForTailCall(const ParameterCount& actual,
|
|
|