From b40af26eec11cc03efafcc9b6c5d1f1172dfc121 Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Thu, 7 Aug 2014 08:11:11 +0000 Subject: [PATCH] X87: Always use the StoreFieldStub to do the actual storing. port r22931. original commit message: Always use the StoreFieldStub to do the actual storing. BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/445343002 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22957 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/stub-cache-x87.cc | 64 +++++++++++------------------------------------ 1 file changed, 15 insertions(+), 49 deletions(-) diff --git a/src/x87/stub-cache-x87.cc b/src/x87/stub-cache-x87.cc index 3f3e75a..f17f1de 100644 --- a/src/x87/stub-cache-x87.cc +++ b/src/x87/stub-cache-x87.cc @@ -567,60 +567,26 @@ void NamedStoreHandlerCompiler::GenerateStoreTransition( } -// Both name_reg and receiver_reg are preserved on jumps to miss_label, -// but may be destroyed if store is successful. -void NamedStoreHandlerCompiler::GenerateStoreField( - Handle object, LookupResult* lookup, Register receiver_reg, - Register name_reg, Register value_reg, Register scratch1, Register scratch2, - Label* miss_label) { - // 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 it = field_type->Classes(); - if (!it.Done()) { - Label do_store; - while (true) { - __ CompareMap(value_reg, it.Current()); - it.Advance(); - if (it.Done()) { - __ j(not_equal, miss_label); - break; - } - __ j(equal, &do_store, Label::kNear); + HeapType::Iterator it = lookup->GetFieldType()->Classes(); + Label do_store; + while (true) { + __ CompareMap(value_reg, it.Current()); + it.Advance(); + if (it.Done()) { + __ j(not_equal, miss_label); + break; } - __ bind(&do_store); + __ j(equal, &do_store, Label::kNear); } - if (index.is_inobject()) { - // Set the property straight into the object. - __ mov(FieldOperand(receiver_reg, index.offset()), value_reg); - - // Update the write barrier for the array address. - // Pass the value being stored in the now unused name_reg. - __ mov(name_reg, value_reg); - __ RecordWriteField(receiver_reg, index.offset(), name_reg, scratch1, - EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - } else { - // Write to the properties array. - // Get the properties array (optimistically). - __ mov(scratch1, FieldOperand(receiver_reg, JSObject::kPropertiesOffset)); - __ mov(FieldOperand(scratch1, index.offset()), value_reg); - - // Update the write barrier for the array address. - // Pass the value being stored in the now unused name_reg. - __ mov(name_reg, value_reg); - __ RecordWriteField(scratch1, index.offset(), name_reg, receiver_reg, - EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - } - - // Return the value (register eax). - DCHECK(value_reg.is(eax)); - __ ret(0); + StoreFieldStub stub(isolate(), lookup->GetFieldIndex(), + lookup->representation()); + GenerateTailCall(masm(), stub.GetCode()); } -- 2.7.4