| Index: src/x64/stub-cache-x64.cc
|
| diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc
|
| index 7ad250a4ad86412d226dd2cec9ee961306e0184c..43a645e17685d21f9233f390dbaa580cd7900020 100644
|
| --- a/src/x64/stub-cache-x64.cc
|
| +++ b/src/x64/stub-cache-x64.cc
|
| @@ -2246,26 +2246,28 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall(
|
| Label not_smi;
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ JumpIfNotSmi(rax, ¬_smi);
|
| - __ SmiToInteger32(rax, rax);
|
|
|
| // Set ebx to 1...1 (== -1) if the argument is negative, or to 0...0
|
| // otherwise.
|
| - __ movl(rbx, rax);
|
| - __ sarl(rbx, Immediate(kBitsPerInt - 1));
|
| + __ movq(rbx, rax);
|
| + __ sar(rbx, Immediate(kBitsPerPointer - 1));
|
|
|
| // Do bitwise not or do nothing depending on ebx.
|
| - __ xorl(rax, rbx);
|
| + __ xor_(rax, rbx);
|
|
|
| // Add 1 or do nothing depending on ebx.
|
| - __ subl(rax, rbx);
|
| + if (kSmiValueSize == 32) {
|
| + __ subq(rax, rbx);
|
| + } else {
|
| + ASSERT(kSmiValueSize == 31);
|
| + __ subl(rax, rbx);
|
| + }
|
|
|
| // If the result is still negative, go to the slow case.
|
| // This only happens for the most negative smi.
|
| Label slow;
|
| __ j(negative, &slow);
|
|
|
| - // Smi case done.
|
| - __ Integer32ToSmi(rax, rax);
|
| __ ret(2 * kPointerSize);
|
|
|
| // Check if the argument is a heap number and load its value.
|
| @@ -3058,6 +3060,7 @@ static void GenerateSmiKeyCheck(MacroAssembler* masm,
|
| __ ucomisd(xmm_scratch1, xmm_scratch0);
|
| __ j(not_equal, fail);
|
| __ j(parity_even, fail); // NaN.
|
| + __ JumpIfNotValidSmiValue(scratch, fail);
|
| __ Integer32ToSmi(key, scratch);
|
| __ bind(&key_ok);
|
| }
|
|
|