From 5fef5b2cc3aac065a8eb8c62cfb2fd88548862fc Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Thu, 7 Aug 2014 07:12:27 +0000 Subject: [PATCH] X87: Hydrogenize (and share) StoreField except heapobject (for now) port r22909. original commit message: Hydrogenize (and share) StoreField except heapobject (for now) BUG= R=weiliang.lin@intel.com Review URL: https://codereview.chromium.org/445313002 Patch from Chunyang Dai . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22953 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/stub-cache-x87.cc | 96 ++++++++++++----------------------------------- 1 file changed, 23 insertions(+), 73 deletions(-) diff --git a/src/x87/stub-cache-x87.cc b/src/x87/stub-cache-x87.cc index 58f059f..3f3e75a 100644 --- a/src/x87/stub-cache-x87.cc +++ b/src/x87/stub-cache-x87.cc @@ -578,94 +578,44 @@ void NamedStoreHandlerCompiler::GenerateStoreField( DCHECK(!object->IsJSGlobalProxy()); FieldIndex index = lookup->GetFieldIndex(); - - Representation representation = lookup->representation(); - DCHECK(!representation.IsNone()); - if (representation.IsSmi()) { - __ JumpIfNotSmi(value_reg, miss_label); - } else if (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); + 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; } - __ bind(&do_store); + __ j(equal, &do_store, Label::kNear); } - } else if (representation.IsDouble()) { - // Load the double storage. - if (index.is_inobject()) { - __ mov(scratch1, FieldOperand(receiver_reg, index.offset())); - } else { - __ mov(scratch1, FieldOperand(receiver_reg, JSObject::kPropertiesOffset)); - __ mov(scratch1, FieldOperand(scratch1, index.offset())); - } - - // Store the value into the storage. - Label do_store, heap_number; - __ JumpIfNotSmi(value_reg, &heap_number); - __ SmiUntag(value_reg); - __ push(value_reg); - __ fild_s(Operand(esp, 0)); - __ pop(value_reg); - __ SmiTag(value_reg); - __ jmp(&do_store); - __ bind(&heap_number); - __ CheckMap(value_reg, isolate()->factory()->heap_number_map(), miss_label, - DONT_DO_SMI_CHECK); - __ fld_d(FieldOperand(value_reg, HeapNumber::kValueOffset)); __ bind(&do_store); - __ fstp_d(FieldOperand(scratch1, HeapNumber::kValueOffset)); - // Return the value (register eax). - DCHECK(value_reg.is(eax)); - __ ret(0); - return; } - DCHECK(!representation.IsDouble()); - // TODO(verwaest): Share this code as a code stub. - SmiCheck smi_check = representation.IsTagged() - ? INLINE_SMI_CHECK : OMIT_SMI_CHECK; if (index.is_inobject()) { // Set the property straight into the object. __ mov(FieldOperand(receiver_reg, index.offset()), value_reg); - if (!representation.IsSmi()) { - // 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, - smi_check); - } + // 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); - if (!representation.IsSmi()) { - // 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, - smi_check); - } + // 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). -- 2.7.4