From cb3c7a0db9b9c1a41e2aac0380211b7632776aef Mon Sep 17 00:00:00 2001 From: "Jacob.Bramley@arm.com" Date: Tue, 24 Jun 2014 12:54:59 +0000 Subject: [PATCH] ARM: optimize Lithium Allocate R=ulan@chromium.org, bmeurer@chromium.org BUG= Review URL: https://codereview.chromium.org/331993004 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21968 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/lithium-arm.cc | 4 +--- src/arm/lithium-codegen-arm.cc | 20 ++++++-------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index 2d2b31c..0392997 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -2369,9 +2369,7 @@ LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) { LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) { info()->MarkAsDeferredCalling(); LOperand* context = UseAny(instr->context()); - LOperand* size = instr->size()->IsConstant() - ? UseConstant(instr->size()) - : UseTempRegister(instr->size()); + LOperand* size = UseRegisterOrConstant(instr->size()); LOperand* temp1 = TempRegister(); LOperand* temp2 = TempRegister(); LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2); diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index 36aec45..14c34ca 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -5276,33 +5276,25 @@ void LCodeGen::DoAllocate(LAllocate* instr) { } } else { Register size = ToRegister(instr->size()); - __ Allocate(size, - result, - scratch, - scratch2, - deferred->entry(), - flags); + __ Allocate(size, result, scratch, scratch2, deferred->entry(), flags); } __ bind(deferred->exit()); if (instr->hydrogen()->MustPrefillWithFiller()) { + STATIC_ASSERT(kHeapObjectTag == 1); if (instr->size()->IsConstantOperand()) { int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); - __ mov(scratch, Operand(size)); + __ mov(scratch, Operand(size - kHeapObjectTag)); } else { - scratch = ToRegister(instr->size()); + __ sub(scratch, ToRegister(instr->size()), Operand(kHeapObjectTag)); } - __ sub(scratch, scratch, Operand(kPointerSize)); - __ sub(result, result, Operand(kHeapObjectTag)); + __ mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); Label loop; __ bind(&loop); - __ mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map())); + __ sub(scratch, scratch, Operand(kPointerSize), SetCC); __ str(scratch2, MemOperand(result, scratch)); - __ sub(scratch, scratch, Operand(kPointerSize)); - __ cmp(scratch, Operand(0)); __ b(ge, &loop); - __ add(result, result, Operand(kHeapObjectTag)); } } -- 2.7.4