| Index: src/x64/builtins-x64.cc
 | 
| diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc
 | 
| index 35eddc45e30d875edd4ba768e1443149c0ba8acc..01992ce4fb67ac708226d1bef77d8dace3d021f6 100644
 | 
| --- a/src/x64/builtins-x64.cc
 | 
| +++ b/src/x64/builtins-x64.cc
 | 
| @@ -53,7 +53,7 @@ static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
 | 
|    __ movq(rbp, rsp);
 | 
|  
 | 
|    // Store the arguments adaptor context sentinel.
 | 
| -  __ push(Immediate(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
 | 
| +  __ Push(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR));
 | 
|  
 | 
|    // Push the function on the stack.
 | 
|    __ push(rdi);
 | 
| @@ -75,14 +75,9 @@ static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
 | 
|    __ pop(rbp);
 | 
|  
 | 
|    // Remove caller arguments from the stack.
 | 
| -  // rbx holds a Smi, so we convery to dword offset by multiplying by 4.
 | 
| -  // TODO(smi): Find a way to abstract indexing by a smi.
 | 
| -  ASSERT_EQ(kSmiTagSize, 1 && kSmiTag == 0);
 | 
| -  ASSERT_EQ(kPointerSize, (1 << kSmiTagSize) * 4);
 | 
| -  // TODO(smi): Find way to abstract indexing by a smi.
 | 
|    __ pop(rcx);
 | 
| -  // 1 * kPointerSize is offset of receiver.
 | 
| -  __ lea(rsp, Operand(rsp, rbx, times_half_pointer_size, 1 * kPointerSize));
 | 
| +  SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2);
 | 
| +  __ lea(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize));
 | 
|    __ push(rcx);
 | 
|  }
 | 
|  
 | 
| @@ -342,7 +337,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
 | 
|      // Because runtime functions always remove the receiver from the stack, we
 | 
|      // have to fake one to avoid underflowing the stack.
 | 
|      __ push(rax);
 | 
| -    __ push(Immediate(Smi::FromInt(0)));
 | 
| +    __ Push(Smi::FromInt(0));
 | 
|  
 | 
|      // Do call to runtime routine.
 | 
|      __ CallRuntime(Runtime::kStackGuard, 1);
 | 
| @@ -434,7 +429,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
 | 
|  
 | 
|    // Update the index on the stack and in register rax.
 | 
|    __ movq(rax, Operand(rbp, kIndexOffset));
 | 
| -  __ addq(rax, Immediate(Smi::FromInt(1)));
 | 
| +  __ SmiAddConstant(rax, rax, Smi::FromInt(1));
 | 
|    __ movq(Operand(rbp, kIndexOffset), rax);
 | 
|  
 | 
|    __ bind(&entry);
 | 
| @@ -507,7 +502,7 @@ static void AllocateEmptyJSArray(MacroAssembler* masm,
 | 
|    __ Move(FieldOperand(result, JSArray::kPropertiesOffset),
 | 
|            Factory::empty_fixed_array());
 | 
|    // Field JSArray::kElementsOffset is initialized later.
 | 
| -  __ movq(FieldOperand(result, JSArray::kLengthOffset), Immediate(0));
 | 
| +  __ Move(FieldOperand(result, JSArray::kLengthOffset), Smi::FromInt(0));
 | 
|  
 | 
|    // If no storage is requested for the elements array just set the empty
 | 
|    // fixed array.
 | 
| @@ -718,14 +713,12 @@ static void ArrayNativeCode(MacroAssembler* masm,
 | 
|    __ cmpq(rax, Immediate(1));
 | 
|    __ j(not_equal, &argc_two_or_more);
 | 
|    __ movq(rdx, Operand(rsp, kPointerSize));  // Get the argument from the stack.
 | 
| -  Condition not_positive_smi = __ CheckNotPositiveSmi(rdx);
 | 
| -  __ j(not_positive_smi, call_generic_code);
 | 
| +  __ JumpIfNotPositiveSmi(rdx, call_generic_code);
 | 
|  
 | 
|    // Handle construction of an empty array of a certain size. Bail out if size
 | 
|    // is to large to actually allocate an elements array.
 | 
| -  __ JumpIfSmiGreaterEqualsConstant(rdx,
 | 
| -                                    JSObject::kInitialMaxFastElementArray,
 | 
| -                                    call_generic_code);
 | 
| +  __ SmiCompare(rdx, Smi::FromInt(JSObject::kInitialMaxFastElementArray));
 | 
| +  __ j(greater_equal, call_generic_code);
 | 
|  
 | 
|    // rax: argc
 | 
|    // rdx: array_size (smi)
 | 
| @@ -825,10 +818,10 @@ void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
 | 
|      __ movq(rbx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset));
 | 
|      // Will both indicate a NULL and a Smi.
 | 
|      ASSERT(kSmiTag == 0);
 | 
| -    Condition not_smi = __ CheckNotSmi(rbx);
 | 
| -    __ Assert(not_smi, "Unexpected initial map for Array function");
 | 
| +    Condition not_smi = NegateCondition(masm->CheckSmi(rbx));
 | 
| +    __ Check(not_smi, "Unexpected initial map for Array function");
 | 
|      __ CmpObjectType(rbx, MAP_TYPE, rcx);
 | 
| -    __ Assert(equal, "Unexpected initial map for Array function");
 | 
| +    __ Check(equal, "Unexpected initial map for Array function");
 | 
|    }
 | 
|  
 | 
|    // Run the native code for the Array function called as a normal function.
 | 
| @@ -857,15 +850,15 @@ void Builtins::Generate_ArrayConstructCode(MacroAssembler* masm) {
 | 
|      // does always have a map.
 | 
|      GenerateLoadArrayFunction(masm, rbx);
 | 
|      __ cmpq(rdi, rbx);
 | 
| -    __ Assert(equal, "Unexpected Array function");
 | 
| +    __ Check(equal, "Unexpected Array function");
 | 
|      // Initial map for the builtin Array function should be a map.
 | 
|      __ movq(rbx, FieldOperand(rdi, JSFunction::kPrototypeOrInitialMapOffset));
 | 
|      // Will both indicate a NULL and a Smi.
 | 
|      ASSERT(kSmiTag == 0);
 | 
| -    Condition not_smi = __ CheckNotSmi(rbx);
 | 
| -    __ Assert(not_smi, "Unexpected initial map for Array function");
 | 
| +    Condition not_smi = NegateCondition(masm->CheckSmi(rbx));
 | 
| +    __ Check(not_smi, "Unexpected initial map for Array function");
 | 
|      __ CmpObjectType(rbx, MAP_TYPE, rcx);
 | 
| -    __ Assert(equal, "Unexpected initial map for Array function");
 | 
| +    __ Check(equal, "Unexpected initial map for Array function");
 | 
|    }
 | 
|  
 | 
|    // Run the native code for the Array function called as constructor.
 | 
| @@ -902,7 +895,6 @@ void Builtins::Generate_JSConstructCall(MacroAssembler* masm) {
 | 
|    // edi: called object
 | 
|    // eax: number of arguments
 | 
|    __ bind(&non_function_call);
 | 
| -
 | 
|    // Set expected number of arguments to zero (not changing eax).
 | 
|    __ movq(rbx, Immediate(0));
 | 
|    __ GetBuiltinEntry(rdx, Builtins::CALL_NON_FUNCTION_AS_CONSTRUCTOR);
 | 
| @@ -1143,11 +1135,9 @@ void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
 | 
|    __ LeaveConstructFrame();
 | 
|  
 | 
|    // Remove caller arguments from the stack and return.
 | 
| -  ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
 | 
| -  // TODO(smi): Find a way to abstract indexing by a smi.
 | 
|    __ pop(rcx);
 | 
| -  // 1 * kPointerSize is offset of receiver.
 | 
| -  __ lea(rsp, Operand(rsp, rbx, times_half_pointer_size, 1 * kPointerSize));
 | 
| +  SmiIndex index = masm->SmiToIndex(rbx, rbx, kPointerSizeLog2);
 | 
| +  __ lea(rsp, Operand(rsp, index.reg, index.scale, 1 * kPointerSize));
 | 
|    __ push(rcx);
 | 
|    __ IncrementCounter(&Counters::constructed_objects, 1);
 | 
|    __ ret(0);
 | 
| 
 |