| Index: src/arm/stub-cache-arm.cc
|
| diff --git a/src/arm/stub-cache-arm.cc b/src/arm/stub-cache-arm.cc
|
| index f8dfe26e8c29cb62409097ef5896729422254859..38f391a33642270d23605b40872b77c7fc2acff7 100644
|
| --- a/src/arm/stub-cache-arm.cc
|
| +++ b/src/arm/stub-cache-arm.cc
|
| @@ -581,77 +581,28 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition(
|
| }
|
|
|
|
|
| -// Generate StoreField code, value is passed in r0 register.
|
| -// When leaving generated code after success, the receiver_reg and name_reg
|
| -// may be clobbered. Upon branch to miss_label, the receiver and name
|
| -// registers have their original values.
|
| -void NamedStoreHandlerCompiler::GenerateStoreField(
|
| - Handle<JSObject> object, LookupResult* lookup, Register receiver_reg,
|
| - Register name_reg, Register value_reg, Register scratch1, Register scratch2,
|
| - Label* miss_label) {
|
| - // r0 : value
|
| - Label exit;
|
| -
|
| - // Stub never generated for objects that require access checks.
|
| - DCHECK(!object->IsAccessCheckNeeded());
|
| - DCHECK(!object->IsJSGlobalProxy());
|
| -
|
| - FieldIndex index = lookup->GetFieldIndex();
|
| -
|
| +void NamedStoreHandlerCompiler::GenerateStoreField(LookupResult* lookup,
|
| + Register value_reg,
|
| + Label* miss_label) {
|
| DCHECK(lookup->representation().IsHeapObject());
|
| __ JumpIfSmi(value_reg, miss_label);
|
| - HeapType* field_type = lookup->GetFieldType();
|
| - HeapType::Iterator<Map> it = field_type->Classes();
|
| - if (!it.Done()) {
|
| - __ ldr(scratch1, FieldMemOperand(value_reg, HeapObject::kMapOffset));
|
| - Label do_store;
|
| - while (true) {
|
| - __ CompareMap(scratch1, it.Current(), &do_store);
|
| - it.Advance();
|
| - if (it.Done()) {
|
| - __ b(ne, miss_label);
|
| - break;
|
| - }
|
| - __ b(eq, &do_store);
|
| + HeapType::Iterator<Map> it = lookup->GetFieldType()->Classes();
|
| + __ ldr(scratch1(), FieldMemOperand(value_reg, HeapObject::kMapOffset));
|
| + Label do_store;
|
| + while (true) {
|
| + __ CompareMap(scratch1(), it.Current(), &do_store);
|
| + it.Advance();
|
| + if (it.Done()) {
|
| + __ b(ne, miss_label);
|
| + break;
|
| }
|
| - __ bind(&do_store);
|
| - }
|
| -
|
| - if (index.is_inobject()) {
|
| - // Set the property straight into the object.
|
| - __ str(value_reg, FieldMemOperand(receiver_reg, index.offset()));
|
| -
|
| - // Skip updating write barrier if storing a smi.
|
| - __ JumpIfSmi(value_reg, &exit);
|
| -
|
| - // Update the write barrier for the array address.
|
| - // Pass the now unused name_reg as a scratch register.
|
| - __ mov(name_reg, value_reg);
|
| - __ RecordWriteField(receiver_reg, index.offset(), name_reg, scratch1,
|
| - kLRHasNotBeenSaved, kDontSaveFPRegs,
|
| - EMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
|
| - } else {
|
| - // Write to the properties array.
|
| - // Get the properties array
|
| - __ ldr(scratch1,
|
| - FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset));
|
| - __ str(value_reg, FieldMemOperand(scratch1, index.offset()));
|
| -
|
| - // Skip updating write barrier if storing a smi.
|
| - __ JumpIfSmi(value_reg, &exit);
|
| -
|
| - // Update the write barrier for the array address.
|
| - // Ok to clobber receiver_reg and name_reg, since we return.
|
| - __ mov(name_reg, value_reg);
|
| - __ RecordWriteField(scratch1, index.offset(), name_reg, receiver_reg,
|
| - kLRHasNotBeenSaved, kDontSaveFPRegs,
|
| - EMIT_REMEMBERED_SET, OMIT_SMI_CHECK);
|
| + __ b(eq, &do_store);
|
| }
|
| + __ bind(&do_store);
|
|
|
| - // Return the value (register r0).
|
| - DCHECK(value_reg.is(r0));
|
| - __ bind(&exit);
|
| - __ Ret();
|
| + StoreFieldStub stub(isolate(), lookup->GetFieldIndex(),
|
| + lookup->representation());
|
| + GenerateTailCall(masm(), stub.GetCode());
|
| }
|
|
|
|
|
|
|