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
This commit is contained in:
parent
8a21855b7f
commit
cb3c7a0db9
@ -2369,9 +2369,7 @@ LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
|
|||||||
LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
|
LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
|
||||||
info()->MarkAsDeferredCalling();
|
info()->MarkAsDeferredCalling();
|
||||||
LOperand* context = UseAny(instr->context());
|
LOperand* context = UseAny(instr->context());
|
||||||
LOperand* size = instr->size()->IsConstant()
|
LOperand* size = UseRegisterOrConstant(instr->size());
|
||||||
? UseConstant(instr->size())
|
|
||||||
: UseTempRegister(instr->size());
|
|
||||||
LOperand* temp1 = TempRegister();
|
LOperand* temp1 = TempRegister();
|
||||||
LOperand* temp2 = TempRegister();
|
LOperand* temp2 = TempRegister();
|
||||||
LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2);
|
LAllocate* result = new(zone()) LAllocate(context, size, temp1, temp2);
|
||||||
|
@ -5276,33 +5276,25 @@ void LCodeGen::DoAllocate(LAllocate* instr) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Register size = ToRegister(instr->size());
|
Register size = ToRegister(instr->size());
|
||||||
__ Allocate(size,
|
__ Allocate(size, result, scratch, scratch2, deferred->entry(), flags);
|
||||||
result,
|
|
||||||
scratch,
|
|
||||||
scratch2,
|
|
||||||
deferred->entry(),
|
|
||||||
flags);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__ bind(deferred->exit());
|
__ bind(deferred->exit());
|
||||||
|
|
||||||
if (instr->hydrogen()->MustPrefillWithFiller()) {
|
if (instr->hydrogen()->MustPrefillWithFiller()) {
|
||||||
|
STATIC_ASSERT(kHeapObjectTag == 1);
|
||||||
if (instr->size()->IsConstantOperand()) {
|
if (instr->size()->IsConstantOperand()) {
|
||||||
int32_t size = ToInteger32(LConstantOperand::cast(instr->size()));
|
int32_t size = ToInteger32(LConstantOperand::cast(instr->size()));
|
||||||
__ mov(scratch, Operand(size));
|
__ mov(scratch, Operand(size - kHeapObjectTag));
|
||||||
} else {
|
} else {
|
||||||
scratch = ToRegister(instr->size());
|
__ sub(scratch, ToRegister(instr->size()), Operand(kHeapObjectTag));
|
||||||
}
|
}
|
||||||
__ sub(scratch, scratch, Operand(kPointerSize));
|
__ mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map()));
|
||||||
__ sub(result, result, Operand(kHeapObjectTag));
|
|
||||||
Label loop;
|
Label loop;
|
||||||
__ bind(&loop);
|
__ bind(&loop);
|
||||||
__ mov(scratch2, Operand(isolate()->factory()->one_pointer_filler_map()));
|
__ sub(scratch, scratch, Operand(kPointerSize), SetCC);
|
||||||
__ str(scratch2, MemOperand(result, scratch));
|
__ str(scratch2, MemOperand(result, scratch));
|
||||||
__ sub(scratch, scratch, Operand(kPointerSize));
|
|
||||||
__ cmp(scratch, Operand(0));
|
|
||||||
__ b(ge, &loop);
|
__ b(ge, &loop);
|
||||||
__ add(result, result, Operand(kHeapObjectTag));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user