A64: Improve constraints on StoreKeyed instructions
BUG= R=ulan@chromium.org Review URL: https://codereview.chromium.org/190783002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19730 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
737584cca1
commit
b2041607a3
@ -2124,7 +2124,7 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
|||||||
LOperand* temp = NULL;
|
LOperand* temp = NULL;
|
||||||
LOperand* elements = NULL;
|
LOperand* elements = NULL;
|
||||||
LOperand* val = NULL;
|
LOperand* val = NULL;
|
||||||
LOperand* key = NULL;
|
LOperand* key = UseRegisterOrConstantAtStart(instr->key());
|
||||||
|
|
||||||
if (!instr->is_typed_elements() &&
|
if (!instr->is_typed_elements() &&
|
||||||
instr->value()->representation().IsTagged() &&
|
instr->value()->representation().IsTagged() &&
|
||||||
@ -2132,11 +2132,11 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
|||||||
// RecordWrite() will clobber all registers.
|
// RecordWrite() will clobber all registers.
|
||||||
elements = UseRegisterAndClobber(instr->elements());
|
elements = UseRegisterAndClobber(instr->elements());
|
||||||
val = UseRegisterAndClobber(instr->value());
|
val = UseRegisterAndClobber(instr->value());
|
||||||
key = UseRegisterAndClobber(instr->key());
|
temp = TempRegister();
|
||||||
} else {
|
} else {
|
||||||
elements = UseRegister(instr->elements());
|
elements = UseRegister(instr->elements());
|
||||||
val = UseRegister(instr->value());
|
val = UseRegister(instr->value());
|
||||||
key = UseRegisterOrConstantAtStart(instr->key());
|
temp = instr->key()->IsConstant() ? NULL : TempRegister();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (instr->is_typed_elements()) {
|
if (instr->is_typed_elements()) {
|
||||||
@ -2148,23 +2148,16 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
|||||||
instr->elements()->representation().IsTagged()) ||
|
instr->elements()->representation().IsTagged()) ||
|
||||||
(instr->is_external() &&
|
(instr->is_external() &&
|
||||||
instr->elements()->representation().IsExternal()));
|
instr->elements()->representation().IsExternal()));
|
||||||
temp = instr->key()->IsConstant() ? NULL : TempRegister();
|
|
||||||
return new(zone()) LStoreKeyedExternal(elements, key, val, temp);
|
return new(zone()) LStoreKeyedExternal(elements, key, val, temp);
|
||||||
|
|
||||||
} else if (instr->value()->representation().IsDouble()) {
|
} else if (instr->value()->representation().IsDouble()) {
|
||||||
ASSERT(instr->elements()->representation().IsTagged());
|
ASSERT(instr->elements()->representation().IsTagged());
|
||||||
|
|
||||||
// The constraint used here is UseRegister, even though the StoreKeyed
|
|
||||||
// instruction may canonicalize the value in the register if it is a NaN.
|
|
||||||
temp = TempRegister();
|
|
||||||
return new(zone()) LStoreKeyedFixedDouble(elements, key, val, temp);
|
return new(zone()) LStoreKeyedFixedDouble(elements, key, val, temp);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ASSERT(instr->elements()->representation().IsTagged());
|
ASSERT(instr->elements()->representation().IsTagged());
|
||||||
ASSERT(instr->value()->representation().IsSmiOrTagged() ||
|
ASSERT(instr->value()->representation().IsSmiOrTagged() ||
|
||||||
instr->value()->representation().IsInteger32());
|
instr->value()->representation().IsInteger32());
|
||||||
|
|
||||||
temp = TempRegister();
|
|
||||||
return new(zone()) LStoreKeyedFixed(elements, key, val, temp);
|
return new(zone()) LStoreKeyedFixed(elements, key, val, temp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4989,7 +4989,7 @@ void LCodeGen::DoStoreKeyedExternal(LStoreKeyedExternal* instr) {
|
|||||||
void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
||||||
Register elements = ToRegister(instr->elements());
|
Register elements = ToRegister(instr->elements());
|
||||||
DoubleRegister value = ToDoubleRegister(instr->value());
|
DoubleRegister value = ToDoubleRegister(instr->value());
|
||||||
Register store_base = ToRegister(instr->temp());
|
Register store_base = no_reg;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
if (instr->key()->IsConstantOperand()) {
|
if (instr->key()->IsConstantOperand()) {
|
||||||
@ -5001,6 +5001,7 @@ void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
|||||||
instr->additional_index());
|
instr->additional_index());
|
||||||
store_base = elements;
|
store_base = elements;
|
||||||
} else {
|
} else {
|
||||||
|
store_base = ToRegister(instr->temp());
|
||||||
Register key = ToRegister(instr->key());
|
Register key = ToRegister(instr->key());
|
||||||
bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
||||||
CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
||||||
@ -5023,17 +5024,23 @@ void LCodeGen::DoStoreKeyedFixedDouble(LStoreKeyedFixedDouble* instr) {
|
|||||||
void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) {
|
void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) {
|
||||||
Register value = ToRegister(instr->value());
|
Register value = ToRegister(instr->value());
|
||||||
Register elements = ToRegister(instr->elements());
|
Register elements = ToRegister(instr->elements());
|
||||||
Register store_base = ToRegister(instr->temp());
|
Register scratch = no_reg;
|
||||||
|
Register store_base = no_reg;
|
||||||
Register key = no_reg;
|
Register key = no_reg;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
|
if (!instr->key()->IsConstantOperand() ||
|
||||||
|
instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
|
scratch = ToRegister(instr->temp());
|
||||||
|
}
|
||||||
|
|
||||||
if (instr->key()->IsConstantOperand()) {
|
if (instr->key()->IsConstantOperand()) {
|
||||||
ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
|
|
||||||
LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
|
LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
|
||||||
offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) +
|
offset = FixedArray::OffsetOfElementAt(ToInteger32(const_operand) +
|
||||||
instr->additional_index());
|
instr->additional_index());
|
||||||
store_base = elements;
|
store_base = elements;
|
||||||
} else {
|
} else {
|
||||||
|
store_base = scratch;
|
||||||
key = ToRegister(instr->key());
|
key = ToRegister(instr->key());
|
||||||
bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
bool key_is_tagged = instr->hydrogen()->key()->representation().IsSmi();
|
||||||
CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
CalcKeyedArrayBaseRegister(store_base, elements, key, key_is_tagged,
|
||||||
@ -5052,13 +5059,16 @@ void LCodeGen::DoStoreKeyedFixed(LStoreKeyedFixed* instr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
if (instr->hydrogen()->NeedsWriteBarrier()) {
|
||||||
|
ASSERT(representation.IsTagged());
|
||||||
|
// This assignment may cause element_addr to alias store_base.
|
||||||
|
Register element_addr = scratch;
|
||||||
SmiCheck check_needed =
|
SmiCheck check_needed =
|
||||||
instr->hydrogen()->value()->IsHeapObject()
|
instr->hydrogen()->value()->IsHeapObject()
|
||||||
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
|
||||||
// Compute address of modified element and store it into key register.
|
// Compute address of modified element and store it into key register.
|
||||||
__ Add(key, store_base, offset - kHeapObjectTag);
|
__ Add(element_addr, store_base, offset - kHeapObjectTag);
|
||||||
__ RecordWrite(elements, key, value, GetLinkRegisterState(), kSaveFPRegs,
|
__ RecordWrite(elements, element_addr, value, GetLinkRegisterState(),
|
||||||
EMIT_REMEMBERED_SET, check_needed);
|
kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user