Index: src/ia32/lithium-codegen-ia32.cc |
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
index edc4bc2bf011357b3c987f4533192c4f71477e77..f3bcf1abc3fc1974af2b7bd55a8aeec35aec8269 100644 |
--- a/src/ia32/lithium-codegen-ia32.cc |
+++ b/src/ia32/lithium-codegen-ia32.cc |
@@ -2650,6 +2650,7 @@ void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { |
__ mov(result, |
BuildFastArrayOperand(instr->elements(), |
instr->key(), |
+ instr->hydrogen()->key()->representation(), |
FAST_ELEMENTS, |
FixedArray::kHeaderSize - kHeapObjectTag, |
instr->additional_index())); |
@@ -2676,6 +2677,7 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
sizeof(kHoleNanLower32); |
Operand hole_check_operand = BuildFastArrayOperand( |
instr->elements(), instr->key(), |
+ instr->hydrogen()->key()->representation(), |
FAST_DOUBLE_ELEMENTS, |
offset, |
instr->additional_index()); |
@@ -2686,6 +2688,7 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
Operand double_load_operand = BuildFastArrayOperand( |
instr->elements(), |
instr->key(), |
+ instr->hydrogen()->key()->representation(), |
FAST_DOUBLE_ELEMENTS, |
FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
instr->additional_index()); |
@@ -2696,11 +2699,15 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
Operand LCodeGen::BuildFastArrayOperand( |
LOperand* elements_pointer, |
LOperand* key, |
+ Representation key_representation, |
ElementsKind elements_kind, |
uint32_t offset, |
uint32_t additional_index) { |
Register elements_pointer_reg = ToRegister(elements_pointer); |
int shift_size = ElementsKindToShiftSize(elements_kind); |
+ if (key_representation.IsTagged() && (shift_size >= 1)) { |
+ shift_size -= kSmiTagSize; |
+ } |
if (key->IsConstantOperand()) { |
int constant_value = ToInteger32(LConstantOperand::cast(key)); |
if (constant_value & 0xF0000000) { |
@@ -2722,11 +2729,19 @@ Operand LCodeGen::BuildFastArrayOperand( |
void LCodeGen::DoLoadKeyedSpecializedArrayElement( |
LLoadKeyedSpecializedArrayElement* instr) { |
ElementsKind elements_kind = instr->elements_kind(); |
- Operand operand(BuildFastArrayOperand(instr->external_pointer(), |
- instr->key(), |
- elements_kind, |
- 0, |
- instr->additional_index())); |
+ LOperand* key = instr->key(); |
+ if (!key->IsConstantOperand() && |
+ ExternalArrayOpRequiresTemp(instr->hydrogen()->key()->representation(), |
+ elements_kind)) { |
+ __ SmiUntag(ToRegister(key)); |
+ } |
+ Operand operand(BuildFastArrayOperand( |
+ instr->external_pointer(), |
+ key, |
+ instr->hydrogen()->key()->representation(), |
+ elements_kind, |
+ 0, |
+ instr->additional_index())); |
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
XMMRegister result(ToDoubleRegister(instr->result())); |
__ movss(result, operand); |
@@ -3679,11 +3694,19 @@ void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
LStoreKeyedSpecializedArrayElement* instr) { |
ElementsKind elements_kind = instr->elements_kind(); |
- Operand operand(BuildFastArrayOperand(instr->external_pointer(), |
- instr->key(), |
- elements_kind, |
- 0, |
- instr->additional_index())); |
+ LOperand* key = instr->key(); |
+ if (!key->IsConstantOperand() && |
+ ExternalArrayOpRequiresTemp(instr->hydrogen()->key()->representation(), |
+ elements_kind)) { |
+ __ SmiUntag(ToRegister(key)); |
+ } |
+ Operand operand(BuildFastArrayOperand( |
+ instr->external_pointer(), |
+ key, |
+ instr->hydrogen()->key()->representation(), |
+ elements_kind, |
+ 0, |
+ instr->additional_index())); |
if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
__ cvtsd2ss(xmm0, ToDoubleRegister(instr->value())); |
__ movss(operand, xmm0); |
@@ -3730,6 +3753,7 @@ void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { |
Operand operand = BuildFastArrayOperand( |
instr->object(), |
instr->key(), |
+ instr->hydrogen()->key()->representation(), |
FAST_ELEMENTS, |
FixedArray::kHeaderSize - kHeapObjectTag, |
instr->additional_index()); |
@@ -3771,6 +3795,7 @@ void LCodeGen::DoStoreKeyedFastDoubleElement( |
Operand double_store_operand = BuildFastArrayOperand( |
instr->elements(), |
instr->key(), |
+ instr->hydrogen()->key()->representation(), |
FAST_DOUBLE_ELEMENTS, |
FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
instr->additional_index()); |