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..0078cc32aee3d92b5c544875d077c99603b3eadf 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 (SmiValuesAre32Bits()) { |
+ __ subq(rax, rbx); |
+ } else { |
+ ASSERT(SmiValuesAre31Bits()); |
+ __ 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); |
} |