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); |
} |