| 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);
|
|
|