Index: src/x64/builtins-x64.cc |
diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc |
index c55a4ea57638b5fa1489a441a2b0cf7cc38f2da0..1256fcfa2dc3f650c0a20f7a0e8105c1b87d0528 100644 |
--- a/src/x64/builtins-x64.cc |
+++ b/src/x64/builtins-x64.cc |
@@ -305,7 +305,8 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { |
// (tail-call) to the code in register edx without checking arguments. |
__ movq(rdx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset)); |
__ movsxlq(rbx, |
- FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); |
+ FieldOperand(rdx, |
+ SharedFunctionInfo::kFormalParameterCountOffset)); |
__ movq(rdx, FieldOperand(rdx, SharedFunctionInfo::kCodeOffset)); |
__ lea(rdx, FieldOperand(rdx, Code::kHeaderSize)); |
__ cmpq(rax, rbx); |
@@ -522,15 +523,15 @@ static void AllocateEmptyJSArray(MacroAssembler* masm, |
__ lea(scratch1, Operand(result, JSArray::kSize)); |
__ movq(FieldOperand(result, JSArray::kElementsOffset), scratch1); |
- // Initialize the FixedArray and fill it with holes. FixedArray length is not |
+ // Initialize the FixedArray and fill it with holes. FixedArray length is |
// stored as a smi. |
// result: JSObject |
// scratch1: elements array |
// scratch2: start of next object |
- __ Move(FieldOperand(scratch1, JSObject::kMapOffset), |
+ __ Move(FieldOperand(scratch1, HeapObject::kMapOffset), |
Factory::fixed_array_map()); |
- __ movq(FieldOperand(scratch1, Array::kLengthOffset), |
- Immediate(initial_capacity)); |
+ __ Move(FieldOperand(scratch1, FixedArray::kLengthOffset), |
+ Smi::FromInt(initial_capacity)); |
// Fill the FixedArray with the hole value. Inline the code if short. |
// Reconsider loop unfolding if kPreallocatedArrayElements gets changed. |
@@ -584,7 +585,6 @@ static void AllocateJSArray(MacroAssembler* masm, |
JSFunction::kPrototypeOrInitialMapOffset)); |
// Check whether an empty sized array is requested. |
- __ SmiToInteger64(array_size, array_size); |
__ testq(array_size, array_size); |
__ j(not_zero, ¬_empty); |
@@ -602,10 +602,11 @@ static void AllocateJSArray(MacroAssembler* masm, |
// Allocate the JSArray object together with space for a FixedArray with the |
// requested elements. |
__ bind(¬_empty); |
- ASSERT(kSmiTagSize == 1 && kSmiTag == 0); |
+ SmiIndex index = |
+ masm->SmiToIndex(kScratchRegister, array_size, kPointerSizeLog2); |
__ AllocateInNewSpace(JSArray::kSize + FixedArray::kHeaderSize, |
- times_pointer_size, |
- array_size, |
+ index.scale, |
+ index.reg, |
result, |
elements_array_end, |
scratch, |
@@ -617,43 +618,41 @@ static void AllocateJSArray(MacroAssembler* masm, |
// result: JSObject |
// elements_array: initial map |
// elements_array_end: start of next object |
- // array_size: size of array |
+ // array_size: size of array (smi) |
__ bind(&allocated); |
__ movq(FieldOperand(result, JSObject::kMapOffset), elements_array); |
__ Move(elements_array, Factory::empty_fixed_array()); |
__ movq(FieldOperand(result, JSArray::kPropertiesOffset), elements_array); |
// Field JSArray::kElementsOffset is initialized later. |
- __ Integer32ToSmi(scratch, array_size); |
- __ movq(FieldOperand(result, JSArray::kLengthOffset), scratch); |
+ __ movq(FieldOperand(result, JSArray::kLengthOffset), array_size); |
// Calculate the location of the elements array and set elements array member |
// of the JSArray. |
// result: JSObject |
// elements_array_end: start of next object |
- // array_size: size of array |
+ // array_size: size of array (smi) |
__ lea(elements_array, Operand(result, JSArray::kSize)); |
__ movq(FieldOperand(result, JSArray::kElementsOffset), elements_array); |
- // Initialize the fixed array. FixedArray length is not stored as a smi. |
+ // Initialize the fixed array. FixedArray length is stored as a smi. |
// result: JSObject |
// elements_array: elements array |
// elements_array_end: start of next object |
- // array_size: size of array |
- ASSERT(kSmiTag == 0); |
+ // array_size: size of array (smi) |
__ Move(FieldOperand(elements_array, JSObject::kMapOffset), |
Factory::fixed_array_map()); |
Label not_empty_2, fill_array; |
- __ testq(array_size, array_size); |
+ __ SmiTest(array_size); |
__ j(not_zero, ¬_empty_2); |
// Length of the FixedArray is the number of pre-allocated elements even |
// though the actual JSArray has length 0. |
- __ movq(FieldOperand(elements_array, Array::kLengthOffset), |
- Immediate(kPreallocatedArrayElements)); |
+ __ Move(FieldOperand(elements_array, FixedArray::kLengthOffset), |
+ Smi::FromInt(kPreallocatedArrayElements)); |
__ jmp(&fill_array); |
__ bind(¬_empty_2); |
// For non-empty JSArrays the length of the FixedArray and the JSArray is the |
// same. |
- __ movq(FieldOperand(elements_array, Array::kLengthOffset), array_size); |
+ __ movq(FieldOperand(elements_array, FixedArray::kLengthOffset), array_size); |
// Fill the allocated FixedArray with the hole value if requested. |
// result: JSObject |
@@ -1036,8 +1035,9 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
// rdx: number of elements |
// rax: start of next object |
__ LoadRoot(rcx, Heap::kFixedArrayMapRootIndex); |
- __ movq(Operand(rdi, JSObject::kMapOffset), rcx); // setup the map |
- __ movl(Operand(rdi, FixedArray::kLengthOffset), rdx); // and length |
+ __ movq(Operand(rdi, HeapObject::kMapOffset), rcx); // setup the map |
+ __ Integer32ToSmi(rdx, rdx); |
+ __ movq(Operand(rdi, FixedArray::kLengthOffset), rdx); // and length |
// Initialize the fields to undefined. |
// rbx: JSObject |