| Index: src/x64/lithium-x64.cc
|
| diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc
|
| index bb2ecc06b8e4e374e838cf2847f08221ed9f8faa..708f98bbebe26fa4b2360088edd0d79b40d57ebc 100644
|
| --- a/src/x64/lithium-x64.cc
|
| +++ b/src/x64/lithium-x64.cc
|
| @@ -2121,11 +2121,24 @@ void LChunkBuilder::FindDehoistedKeyDefinitions(HValue* candidate) {
|
|
|
|
|
| LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
|
| - ASSERT(instr->key()->representation().IsInteger32());
|
| + ASSERT((kPointerSize == kInt64Size &&
|
| + instr->key()->representation().IsInteger32()) ||
|
| + (kPointerSize == kInt32Size &&
|
| + instr->key()->representation().IsSmiOrInteger32()));
|
| ElementsKind elements_kind = instr->elements_kind();
|
| - LOperand* key = UseRegisterOrConstantAtStart(instr->key());
|
| + LOperand* key = NULL;
|
| LInstruction* result = NULL;
|
|
|
| + if (kPointerSize == kInt64Size) {
|
| + key = UseRegisterOrConstantAtStart(instr->key());
|
| + } else {
|
| + bool clobbers_key = KeyedLoadOrStoreRequiresTemp(
|
| + instr->key()->representation(), elements_kind);
|
| + key = clobbers_key
|
| + ? UseTempRegister(instr->key())
|
| + : UseRegisterOrConstantAtStart(instr->key());
|
| + }
|
| +
|
| if (instr->IsDehoisted()) {
|
| FindDehoistedKeyDefinitions(instr->key());
|
| }
|
| @@ -2219,7 +2232,16 @@ LInstruction* LChunkBuilder::DoStoreKeyed(HStoreKeyed* instr) {
|
| elements_kind == FLOAT32_ELEMENTS;
|
| LOperand* val = val_is_temp_register ? UseTempRegister(instr->value())
|
| : UseRegister(instr->value());
|
| - LOperand* key = UseRegisterOrConstantAtStart(instr->key());
|
| + LOperand* key = NULL;
|
| + if (kPointerSize == kInt64Size) {
|
| + key = UseRegisterOrConstantAtStart(instr->key());
|
| + } else {
|
| + bool clobbers_key = KeyedLoadOrStoreRequiresTemp(
|
| + instr->key()->representation(), elements_kind);
|
| + key = clobbers_key
|
| + ? UseTempRegister(instr->key())
|
| + : UseRegisterOrConstantAtStart(instr->key());
|
| + }
|
| LOperand* backing_store = UseRegister(instr->elements());
|
| return new(zone()) LStoreKeyed(backing_store, key, val);
|
| }
|
|
|