From e6509e77d232dfa418484a5876ef588d98afcece Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Mon, 26 Sep 2011 07:36:44 +0000 Subject: [PATCH] Small refactor to KeyedStoreIC::GenerateGeneric to make it slightly faster. Review URL: http://codereview.chromium.org/8008016 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9418 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/ic-arm.cc | 30 +++++++++++++----------------- src/ia32/ic-ia32.cc | 23 ++++++++++++----------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc index 9932125..68a20cc 100644 --- a/src/arm/ic-arm.cc +++ b/src/arm/ic-arm.cc @@ -1360,28 +1360,25 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, __ bind(&fast); Register scratch_value = r4; Register address = r5; + + Label non_smi_value; + __ JumpIfNotSmi(value, &non_smi_value); + // It's irrelevant whether array is smi-only or not when writing a smi. + __ add(address, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); + __ add(address, address, Operand(key, LSL, kPointerSizeLog2 - kSmiTagSize)); + __ str(value, MemOperand(address)); + __ Ret(); + + __ bind(&non_smi_value); if (FLAG_smi_only_arrays) { - Label not_smi_only; - // Make sure the elements are smi-only. + // Escape to slow case when writing non-smi into smi-only array. __ ldr(scratch_value, FieldMemOperand(receiver, HeapObject::kMapOffset)); - __ CheckFastSmiOnlyElements(scratch_value, scratch_value, ¬_smi_only); - // Non-smis need to call into the runtime if the array is smi only. - __ JumpIfNotSmi(value, &slow); - __ add(address, elements, - Operand(FixedArray::kHeaderSize - kHeapObjectTag)); - __ add(address, address, Operand(key, LSL, kPointerSizeLog2 - kSmiTagSize)); - __ str(value, MemOperand(address)); - __ Ret(); - __ bind(¬_smi_only); + __ CheckFastObjectElements(scratch_value, scratch_value, &slow); } - // Fast case, store the value to the elements backing store. + // Fast elements array, store the value to the elements backing store. __ add(address, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); __ add(address, address, Operand(key, LSL, kPointerSizeLog2 - kSmiTagSize)); __ str(value, MemOperand(address)); - // Skip write barrier if the written value is a smi. - __ tst(value, Operand(kSmiTagMask)); - __ Ret(eq); - // Update write barrier for the elements array address. __ mov(scratch_value, value); // Preserve the value which is returned. __ RecordWrite(elements, @@ -1391,7 +1388,6 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - __ Ret(); } diff --git a/src/ia32/ic-ia32.cc b/src/ia32/ic-ia32.cc index c2181e7..65ecaec 100644 --- a/src/ia32/ic-ia32.cc +++ b/src/ia32/ic-ia32.cc @@ -811,23 +811,24 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, // edx: receiver // edi: FixedArray receiver->elements + Label non_smi_value; + __ JumpIfNotSmi(eax, &non_smi_value); + // It's irrelevant whether array is smi-only or not when writing a smi. + __ mov(CodeGenerator::FixedArrayElementOperand(edi, ecx), eax); + __ ret(0); + + __ bind(&non_smi_value); if (FLAG_smi_only_arrays) { - Label not_smi_only; - // Make sure the elements are smi-only. + // Escape to slow case when writing non-smi into smi-only array. __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); - __ CheckFastSmiOnlyElements(ebx, ¬_smi_only, Label::kNear); - // Non-smis need to call into the runtime if the array is smi only. - __ JumpIfNotSmi(eax, &slow); - __ mov(CodeGenerator::FixedArrayElementOperand(edi, ecx), eax); - __ ret(0); - __ bind(¬_smi_only); + __ CheckFastObjectElements(ebx, &slow, Label::kNear); } - + // Fast elements array, store the value to the elements backing store. __ mov(CodeGenerator::FixedArrayElementOperand(edi, ecx), eax); - // Update write barrier for the elements array address. __ mov(edx, Operand(eax)); // Preserve the value which is returned. - __ RecordWriteArray(edi, edx, ecx, kDontSaveFPRegs); + __ RecordWriteArray( + edi, edx, ecx, kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); __ ret(0); } -- 2.7.4