| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index c7dd7dfc4128003be18c370f55ece35d1a222c08..262395a2e7c9a3add0c39d0b60cc40d3035eaf1f 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -3329,38 +3329,29 @@ void LCodeGen::DoDeferredMathAbsTaggedHeapNumber(LMathAbs* instr) {
|
| Heap::kHeapNumberMapRootIndex);
|
| DeoptimizeIf(not_equal, instr->environment());
|
|
|
| - Label done;
|
| + Label slow, allocated, done;
|
| Register tmp = input_reg.is(rax) ? rcx : rax;
|
| Register tmp2 = tmp.is(rcx) ? rdx : input_reg.is(rcx) ? rdx : rcx;
|
|
|
| // Preserve the value of all registers.
|
| PushSafepointRegistersScope scope(this);
|
|
|
| - Label negative;
|
| __ movl(tmp, FieldOperand(input_reg, HeapNumber::kExponentOffset));
|
| // Check the sign of the argument. If the argument is positive, just
|
| // return it. We do not need to patch the stack since |input| and
|
| // |result| are the same register and |input| will be restored
|
| // unchanged by popping safepoint registers.
|
| __ testl(tmp, Immediate(HeapNumber::kSignMask));
|
| - __ j(not_zero, &negative);
|
| - __ jmp(&done);
|
| + __ j(zero, &done);
|
|
|
| - __ bind(&negative);
|
| -
|
| - Label allocated, slow;
|
| __ AllocateHeapNumber(tmp, tmp2, &slow);
|
| - __ jmp(&allocated);
|
| + __ jmp(&allocated, Label::kNear);
|
|
|
| // Slow case: Call the runtime system to do the number allocation.
|
| __ bind(&slow);
|
| -
|
| CallRuntimeFromDeferred(Runtime::kAllocateHeapNumber, 0, instr);
|
| // Set the pointer to the new heap number in tmp.
|
| - if (!tmp.is(rax)) {
|
| - __ movq(tmp, rax);
|
| - }
|
| -
|
| + if (!tmp.is(rax)) __ movq(tmp, rax);
|
| // Restore input_reg after call to runtime.
|
| __ LoadFromSafepointRegisterSlot(input_reg, input_reg);
|
|
|
| @@ -3379,7 +3370,7 @@ void LCodeGen::EmitIntegerMathAbs(LMathAbs* instr) {
|
| Register input_reg = ToRegister(instr->value());
|
| __ testl(input_reg, input_reg);
|
| Label is_positive;
|
| - __ j(not_sign, &is_positive);
|
| + __ j(not_sign, &is_positive, Label::kNear);
|
| __ negl(input_reg); // Sets flags.
|
| DeoptimizeIf(negative, instr->environment());
|
| __ bind(&is_positive);
|
|
|