| Index: src/x64/macro-assembler-x64.cc
 | 
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
 | 
| index 37220c3d26e8d9ef95692a371baf971de0009b96..30ae159aff5568cfaf671bdea8f8082f74831345 100644
 | 
| --- a/src/x64/macro-assembler-x64.cc
 | 
| +++ b/src/x64/macro-assembler-x64.cc
 | 
| @@ -2465,10 +2465,19 @@ void MacroAssembler::Push(Smi* source) {
 | 
|    intptr_t smi = reinterpret_cast<intptr_t>(source);
 | 
|    if (is_int32(smi)) {
 | 
|      Push(Immediate(static_cast<int32_t>(smi)));
 | 
| -  } else {
 | 
| -    Register constant = GetSmiConstant(source);
 | 
| -    Push(constant);
 | 
| +    return;
 | 
| +  }
 | 
| +  int first_byte_set = base::bits::CountTrailingZeros64(smi) / 8;
 | 
| +  int last_byte_set = (63 - base::bits::CountLeadingZeros64(smi)) / 8;
 | 
| +  if (first_byte_set == last_byte_set && kPointerSize == kInt64Size) {
 | 
| +    // This sequence has only 7 bytes, compared to the 12 bytes below.
 | 
| +    Push(Immediate(0));
 | 
| +    movb(Operand(rsp, first_byte_set),
 | 
| +         Immediate(static_cast<int8_t>(smi >> (8 * first_byte_set))));
 | 
| +    return;
 | 
|    }
 | 
| +  Register constant = GetSmiConstant(source);
 | 
| +  Push(constant);
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |