| Index: src/x64/macro-assembler-x64.cc
 | 
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
 | 
| index b36f4f059332b93b0be6eeea2fc52f9bb0b07b2e..573b396fd5c8cfc6a0e4d5a3e1b48b02134b4a57 100644
 | 
| --- a/src/x64/macro-assembler-x64.cc
 | 
| +++ b/src/x64/macro-assembler-x64.cc
 | 
| @@ -998,11 +998,18 @@ bool MacroAssembler::IsUnsafeInt(const int32_t x) {
 | 
|  
 | 
|  void MacroAssembler::SafeMove(Register dst, Smi* src) {
 | 
|    ASSERT(!dst.is(kScratchRegister));
 | 
| -  ASSERT(SmiValuesAre32Bits());  // JIT cookie can be converted to Smi.
 | 
|    if (IsUnsafeInt(src->value()) && jit_cookie() != 0) {
 | 
| -    Move(dst, Smi::FromInt(src->value() ^ jit_cookie()));
 | 
| -    Move(kScratchRegister, Smi::FromInt(jit_cookie()));
 | 
| -    xorq(dst, kScratchRegister);
 | 
| +    if (SmiValuesAre32Bits()) {
 | 
| +      // JIT cookie can be converted to Smi.
 | 
| +      Move(dst, Smi::FromInt(src->value() ^ jit_cookie()));
 | 
| +      Move(kScratchRegister, Smi::FromInt(jit_cookie()));
 | 
| +      xorp(dst, kScratchRegister);
 | 
| +    } else {
 | 
| +      ASSERT(SmiValuesAre31Bits());
 | 
| +      int32_t value = static_cast<int32_t>(reinterpret_cast<intptr_t>(src));
 | 
| +      movp(dst, Immediate(value ^ jit_cookie()));
 | 
| +      xorp(dst, Immediate(jit_cookie()));
 | 
| +    }
 | 
|    } else {
 | 
|      Move(dst, src);
 | 
|    }
 | 
| @@ -1010,11 +1017,18 @@ void MacroAssembler::SafeMove(Register dst, Smi* src) {
 | 
|  
 | 
|  
 | 
|  void MacroAssembler::SafePush(Smi* src) {
 | 
| -  ASSERT(SmiValuesAre32Bits());  // JIT cookie can be converted to Smi.
 | 
|    if (IsUnsafeInt(src->value()) && jit_cookie() != 0) {
 | 
| -    Push(Smi::FromInt(src->value() ^ jit_cookie()));
 | 
| -    Move(kScratchRegister, Smi::FromInt(jit_cookie()));
 | 
| -    xorq(Operand(rsp, 0), kScratchRegister);
 | 
| +    if (SmiValuesAre32Bits()) {
 | 
| +      // JIT cookie can be converted to Smi.
 | 
| +      Push(Smi::FromInt(src->value() ^ jit_cookie()));
 | 
| +      Move(kScratchRegister, Smi::FromInt(jit_cookie()));
 | 
| +      xorp(Operand(rsp, 0), kScratchRegister);
 | 
| +    } else {
 | 
| +      ASSERT(SmiValuesAre31Bits());
 | 
| +      int32_t value = static_cast<int32_t>(reinterpret_cast<intptr_t>(src));
 | 
| +      Push(Immediate(value ^ jit_cookie()));
 | 
| +      xorp(Operand(rsp, 0), Immediate(jit_cookie()));
 | 
| +    }
 | 
|    } else {
 | 
|      Push(src);
 | 
|    }
 | 
| @@ -2234,35 +2248,66 @@ void MacroAssembler::SelectNonSmi(Register dst,
 | 
|  SmiIndex MacroAssembler::SmiToIndex(Register dst,
 | 
|                                      Register src,
 | 
|                                      int shift) {
 | 
| -  ASSERT(is_uint6(shift));
 | 
| -  // There is a possible optimization if shift is in the range 60-63, but that
 | 
| -  // will (and must) never happen.
 | 
| -  if (!dst.is(src)) {
 | 
| -    movq(dst, src);
 | 
| -  }
 | 
| -  if (shift < kSmiShift) {
 | 
| -    sarq(dst, Immediate(kSmiShift - shift));
 | 
| +  if (SmiValuesAre32Bits()) {
 | 
| +    ASSERT(is_uint6(shift));
 | 
| +    // There is a possible optimization if shift is in the range 60-63, but that
 | 
| +    // will (and must) never happen.
 | 
| +    if (!dst.is(src)) {
 | 
| +      movp(dst, src);
 | 
| +    }
 | 
| +    if (shift < kSmiShift) {
 | 
| +      sarp(dst, Immediate(kSmiShift - shift));
 | 
| +    } else {
 | 
| +      shlp(dst, Immediate(shift - kSmiShift));
 | 
| +    }
 | 
| +    return SmiIndex(dst, times_1);
 | 
|    } else {
 | 
| -    shlq(dst, Immediate(shift - kSmiShift));
 | 
| +    ASSERT(SmiValuesAre31Bits());
 | 
| +    ASSERT(shift >= times_1 && shift <= (static_cast<int>(times_8) + 1));
 | 
| +    if (!dst.is(src)) {
 | 
| +      movp(dst, src);
 | 
| +    }
 | 
| +    // We have to sign extend the index register to 64-bit as the SMI might
 | 
| +    // be negative.
 | 
| +    movsxlq(dst, dst);
 | 
| +    if (shift == times_1) {
 | 
| +      sarq(dst, Immediate(kSmiShift));
 | 
| +      return SmiIndex(dst, times_1);
 | 
| +    }
 | 
| +    return SmiIndex(dst, static_cast<ScaleFactor>(shift - 1));
 | 
|    }
 | 
| -  return SmiIndex(dst, times_1);
 | 
|  }
 | 
|  
 | 
| +
 | 
|  SmiIndex MacroAssembler::SmiToNegativeIndex(Register dst,
 | 
|                                              Register src,
 | 
|                                              int shift) {
 | 
| -  // Register src holds a positive smi.
 | 
| -  ASSERT(is_uint6(shift));
 | 
| -  if (!dst.is(src)) {
 | 
| -    movq(dst, src);
 | 
| -  }
 | 
| -  negq(dst);
 | 
| -  if (shift < kSmiShift) {
 | 
| -    sarq(dst, Immediate(kSmiShift - shift));
 | 
| +  if (SmiValuesAre32Bits()) {
 | 
| +    // Register src holds a positive smi.
 | 
| +    ASSERT(is_uint6(shift));
 | 
| +    if (!dst.is(src)) {
 | 
| +      movp(dst, src);
 | 
| +    }
 | 
| +    negp(dst);
 | 
| +    if (shift < kSmiShift) {
 | 
| +      sarp(dst, Immediate(kSmiShift - shift));
 | 
| +    } else {
 | 
| +      shlp(dst, Immediate(shift - kSmiShift));
 | 
| +    }
 | 
| +    return SmiIndex(dst, times_1);
 | 
|    } else {
 | 
| -    shlq(dst, Immediate(shift - kSmiShift));
 | 
| +    ASSERT(SmiValuesAre31Bits());
 | 
| +    ASSERT(shift >= times_1 && shift <= (static_cast<int>(times_8) + 1));
 | 
| +    if (!dst.is(src)) {
 | 
| +      movp(dst, src);
 | 
| +    }
 | 
| +    negq(dst);
 | 
| +    if (shift == times_1) {
 | 
| +      sarq(dst, Immediate(kSmiShift));
 | 
| +      return SmiIndex(dst, times_1);
 | 
| +    }
 | 
| +    return SmiIndex(dst, static_cast<ScaleFactor>(shift - 1));
 | 
|    }
 | 
| -  return SmiIndex(dst, times_1);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |