Index: src/arm64/builtins-arm64.cc |
diff --git a/src/arm64/builtins-arm64.cc b/src/arm64/builtins-arm64.cc |
index b31acb4069d757d5a3dd79e6444f496244d908a8..283a5a777d89d5068eab42f685aac0edc44a5d19 100644 |
--- a/src/arm64/builtins-arm64.cc |
+++ b/src/arm64/builtins-arm64.cc |
@@ -431,49 +431,29 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
Label rt_call_reload_new_target; |
Register obj_size = x3; |
Register new_obj = x4; |
+ Register next_obj = x10; |
__ Ldrb(obj_size, FieldMemOperand(init_map, Map::kInstanceSizeOffset)); |
- __ Allocate(obj_size, new_obj, x10, x11, &rt_call_reload_new_target, |
- SIZE_IN_WORDS); |
+ __ Allocate(obj_size, new_obj, next_obj, x11, |
+ &rt_call_reload_new_target, SIZE_IN_WORDS); |
// Allocated the JSObject, now initialize the fields. Map is set to |
// initial map and properties and elements are set to empty fixed array. |
// NB. the object pointer is not tagged, so MemOperand is used. |
- Register empty = x5; |
+ Register write_address = x5; |
+ Register empty = x7; |
+ __ Mov(write_address, new_obj); |
__ LoadRoot(empty, Heap::kEmptyFixedArrayRootIndex); |
- __ Str(init_map, MemOperand(new_obj, JSObject::kMapOffset)); |
- STATIC_ASSERT(JSObject::kElementsOffset == |
- (JSObject::kPropertiesOffset + kPointerSize)); |
- __ Stp(empty, empty, MemOperand(new_obj, JSObject::kPropertiesOffset)); |
- |
- Register first_prop = x5; |
- __ Add(first_prop, new_obj, JSObject::kHeaderSize); |
+ STATIC_ASSERT(0 * kPointerSize == JSObject::kMapOffset); |
+ __ Str(init_map, MemOperand(write_address, kPointerSize, PostIndex)); |
+ STATIC_ASSERT(1 * kPointerSize == JSObject::kPropertiesOffset); |
+ STATIC_ASSERT(2 * kPointerSize == JSObject::kElementsOffset); |
+ __ Stp(empty, empty, |
+ MemOperand(write_address, 2 * kPointerSize, PostIndex)); |
// Fill all of the in-object properties with the appropriate filler. |
Register filler = x7; |
__ LoadRoot(filler, Heap::kUndefinedValueRootIndex); |
- // Obtain number of pre-allocated property fields and in-object |
- // properties. |
- Register unused_props = x10; |
- Register inobject_props = x11; |
- Register inst_sizes_or_attrs = x11; |
- Register prealloc_fields = x10; |
- __ Ldr(inst_sizes_or_attrs, |
- FieldMemOperand(init_map, Map::kInstanceAttributesOffset)); |
- __ Ubfx(unused_props, inst_sizes_or_attrs, |
- Map::kUnusedPropertyFieldsByte * kBitsPerByte, kBitsPerByte); |
- __ Ldr(inst_sizes_or_attrs, |
- FieldMemOperand(init_map, Map::kInstanceSizesOffset)); |
- __ Ubfx(inobject_props, inst_sizes_or_attrs, |
- Map::kInObjectPropertiesOrConstructorFunctionIndexByte * |
- kBitsPerByte, |
- kBitsPerByte); |
- __ Sub(prealloc_fields, inobject_props, unused_props); |
- |
- // Calculate number of property fields in the object. |
- Register prop_fields = x6; |
- __ Sub(prop_fields, obj_size, JSObject::kHeaderSize / kPointerSize); |
- |
if (!is_api_function) { |
Label no_inobject_slack_tracking; |
@@ -482,33 +462,35 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, |
__ B(lt, &no_inobject_slack_tracking); |
constructon_count = NoReg; |
- // Fill the pre-allocated fields with undef. |
- __ FillFields(first_prop, prealloc_fields, filler); |
+ // Allocate object with a slack. |
+ Register unused_props = x11; |
+ __ Ldr(unused_props, |
+ FieldMemOperand(init_map, Map::kInstanceAttributesOffset)); |
+ __ Ubfx(unused_props, unused_props, |
+ Map::kUnusedPropertyFieldsByte * kBitsPerByte, kBitsPerByte); |
- // Update first_prop register to be the offset of the first field |
- // after |
- // pre-allocated fields. |
- __ Add(first_prop, first_prop, |
- Operand(prealloc_fields, LSL, kPointerSizeLog2)); |
+ Register end_of_pre_allocated = x11; |
+ __ Sub(end_of_pre_allocated, next_obj, |
+ Operand(unused_props, LSL, kPointerSizeLog2)); |
+ unused_props = NoReg; |
if (FLAG_debug_code) { |
- Register obj_end = x14; |
- __ Add(obj_end, new_obj, Operand(obj_size, LSL, kPointerSizeLog2)); |
- __ Cmp(first_prop, obj_end); |
+ __ Cmp(write_address, end_of_pre_allocated); |
__ Assert(le, kUnexpectedNumberOfPreAllocatedPropertyFields); |
} |
+ // Fill the pre-allocated fields with undef. |
+ __ InitializeFieldsWithFiller(write_address, end_of_pre_allocated, |
+ filler); |
+ |
// Fill the remaining fields with one pointer filler map. |
__ LoadRoot(filler, Heap::kOnePointerFillerMapRootIndex); |
- __ Sub(prop_fields, prop_fields, prealloc_fields); |
__ bind(&no_inobject_slack_tracking); |
} |
// Fill all of the property fields with undef. |
- __ FillFields(first_prop, prop_fields, filler); |
- first_prop = NoReg; |
- prop_fields = NoReg; |
+ __ InitializeFieldsWithFiller(write_address, next_obj, filler); |
// Add the object tag to make the JSObject real, so that we can continue |
// and jump into the continuation code at any time from now on. |