MIPS: Lithium: avoid registers for constants when possible.
Port r14460 (9e3dab0c) BUG= Review URL: https://codereview.chromium.org/14520016 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14473 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
4b010329c9
commit
84a5a45e8a
@ -5150,7 +5150,6 @@ void LCodeGen::DoAllocate(LAllocate* instr) {
|
||||
|
||||
|
||||
void LCodeGen::DoDeferredAllocate(LAllocate* instr) {
|
||||
Register size = ToRegister(instr->size());
|
||||
Register result = ToRegister(instr->result());
|
||||
|
||||
// TODO(3095996): Get rid of this. For now, we need to make the
|
||||
@ -5159,8 +5158,16 @@ void LCodeGen::DoDeferredAllocate(LAllocate* instr) {
|
||||
__ mov(result, zero_reg);
|
||||
|
||||
PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters);
|
||||
__ SmiTag(size, size);
|
||||
__ push(size);
|
||||
if (instr->size()->IsRegister()) {
|
||||
Register size = ToRegister(instr->size());
|
||||
ASSERT(!size.is(result));
|
||||
__ SmiTag(size);
|
||||
__ push(size);
|
||||
} else {
|
||||
int32_t size = ToInteger32(LConstantOperand::cast(instr->size()));
|
||||
__ Push(Smi::FromInt(size));
|
||||
}
|
||||
|
||||
if (instr->hydrogen()->CanAllocateInOldPointerSpace()) {
|
||||
CallRuntimeFromDeferred(
|
||||
Runtime::kAllocateInOldPointerSpace, 1, instr);
|
||||
|
@ -552,6 +552,11 @@ LOperand* LChunkBuilder::UseRegisterOrConstantAtStart(HValue* value) {
|
||||
}
|
||||
|
||||
|
||||
LOperand* LChunkBuilder::UseConstant(HValue* value) {
|
||||
return chunk_->DefineConstantOperand(HConstant::cast(value));
|
||||
}
|
||||
|
||||
|
||||
LOperand* LChunkBuilder::UseAny(HValue* value) {
|
||||
return value->IsConstant()
|
||||
? chunk_->DefineConstantOperand(HConstant::cast(value))
|
||||
@ -2253,7 +2258,9 @@ LInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
|
||||
|
||||
LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
|
||||
info()->MarkAsDeferredCalling();
|
||||
LOperand* size = UseTempRegister(instr->size());
|
||||
LOperand* size = instr->size()->IsConstant()
|
||||
? UseConstant(instr->size())
|
||||
: UseTempRegister(instr->size());
|
||||
LOperand* temp1 = TempRegister();
|
||||
LOperand* temp2 = TempRegister();
|
||||
LAllocate* result = new(zone()) LAllocate(size, temp1, temp2);
|
||||
|
@ -2722,6 +2722,9 @@ class LChunkBuilder BASE_EMBEDDED {
|
||||
MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value);
|
||||
MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
|
||||
|
||||
// An input operand in a constant operand.
|
||||
MUST_USE_RESULT LOperand* UseConstant(HValue* value);
|
||||
|
||||
// An input operand in register, stack slot or a constant operand.
|
||||
// Will not be moved to a register even if one is freely available.
|
||||
MUST_USE_RESULT LOperand* UseAny(HValue* value);
|
||||
|
Loading…
Reference in New Issue
Block a user