Index: src/x64/code-stubs-x64.cc |
diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc |
index 83d01a6a565e927b9bc91ffa07438c91ae86d3ff..f8c9506f4e76b0a859c034b76dc5973930b08037 100644 |
--- a/src/x64/code-stubs-x64.cc |
+++ b/src/x64/code-stubs-x64.cc |
@@ -1136,6 +1136,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
const bool tagged = (argument_type_ == TAGGED); |
if (tagged) { |
Label input_not_smi, loaded; |
+ |
// Test that rax is a number. |
StackArgumentsAccessor args(rsp, 1, ARGUMENTS_DONT_CONTAIN_RECEIVER); |
__ movq(rax, args.GetArgumentOperand(0)); |
@@ -1153,14 +1154,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
__ jmp(&loaded, Label::kNear); |
__ bind(&input_not_smi); |
- // Check if input is a HeapNumber. |
- __ LoadRoot(rbx, Heap::kHeapNumberMapRootIndex); |
- __ cmpq(rbx, FieldOperand(rax, HeapObject::kMapOffset)); |
- __ j(not_equal, &runtime_call); |
- // Input is a HeapNumber. Push it on the FPU stack and load its |
- // bits into rbx. |
- __ fld_d(FieldOperand(rax, HeapNumber::kValueOffset)); |
- __ movq(rbx, FieldOperand(rax, HeapNumber::kValueOffset)); |
+ __ TaggedToI(rbx, rax, xmm1, TREAT_MINUS_ZERO_AS_ZERO, &runtime_call); |
__ movq(rdx, rbx); |
__ bind(&loaded); |
@@ -1446,10 +1440,8 @@ void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, |
__ bind(&arg1_is_object); |
__ cmpq(FieldOperand(rdx, HeapObject::kMapOffset), heap_number_map); |
__ j(not_equal, &check_undefined_arg1); |
- // Get the untagged integer version of the rdx heap number in rcx. |
- DoubleToIStub stub1(rdx, r8, HeapNumber::kValueOffset - kHeapObjectTag, |
- true); |
- __ call(stub1.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
+ // Get the untagged integer version of the rdx heap number in r8. |
+ __ TruncateHeapNumberToI(r8, rdx); |
// Here r8 has the untagged integer, rax has a Smi or a heap number. |
__ bind(&load_arg2); |
@@ -1469,9 +1461,7 @@ void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, |
__ cmpq(FieldOperand(rax, HeapObject::kMapOffset), heap_number_map); |
__ j(not_equal, &check_undefined_arg2); |
// Get the untagged integer version of the rax heap number in rcx. |
- DoubleToIStub stub2(rax, rcx, HeapNumber::kValueOffset - kHeapObjectTag, |
- true); |
- __ call(stub2.GetCode(masm->isolate()), RelocInfo::CODE_TARGET); |
+ __ TruncateHeapNumberToI(rcx, rax); |
__ bind(&done); |
__ movl(rax, r8); |
@@ -1648,16 +1638,17 @@ void MathPowStub::Generate(MacroAssembler* masm) { |
} |
if (exponent_type_ != INTEGER) { |
- Label fast_power; |
+ Label fast_power, try_arithmetic_simplification; |
// Detect integer exponents stored as double. |
+ __ DoubleToI(exponent, double_exponent, double_scratch, |
+ TREAT_MINUS_ZERO_AS_ZERO, &try_arithmetic_simplification); |
+ __ jmp(&int_exponent); |
+ |
+ __ bind(&try_arithmetic_simplification); |
__ cvttsd2si(exponent, double_exponent); |
// Skip to runtime if possibly NaN (indicated by the indefinite integer). |
__ cmpl(exponent, Immediate(0x80000000u)); |
__ j(equal, &call_runtime); |
- __ cvtlsi2sd(double_scratch, exponent); |
- // Already ruled out NaNs for exponent. |
- __ ucomisd(double_exponent, double_scratch); |
- __ j(equal, &int_exponent); |
if (exponent_type_ == ON_STACK) { |
// Detect square root case. Crankshaft detects constant +/-0.5 at |