| Index: src/x64/stub-cache-x64.cc
|
| ===================================================================
|
| --- src/x64/stub-cache-x64.cc (revision 16112)
|
| +++ src/x64/stub-cache-x64.cc (working copy)
|
| @@ -2246,26 +2246,25 @@
|
| Label not_smi;
|
| STATIC_ASSERT(kSmiTag == 0);
|
| __ JumpIfNotSmi(rax, ¬_smi);
|
| - __ SmiToInteger32(rax, rax);
|
|
|
| + // Branchless abs implementation, refer to below:
|
| + // http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
|
| // 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);
|
| + __ subq(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.
|
|
|