Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index 053bcb642431a50897839f3244f8cde95ea7a453..83eb32c1f25b3ace868cb3b38c5c241942660265 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -2426,9 +2426,11 @@ void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { |
| // Load the result. |
| __ mov(result, |
| - BuildFastArrayOperand(instr->elements(), instr->key(), |
| + BuildFastArrayOperand(instr->elements(), |
| + instr->key(), |
| FAST_ELEMENTS, |
| - FixedArray::kHeaderSize - kHeapObjectTag)); |
| + FixedArray::kHeaderSize - kHeapObjectTag, |
| + instr->additional_index())); |
|
Jakob Kummerow
2012/05/08 13:46:26
You can use "instr->hydrogen()->index_offset()" he
Massi
2012/05/14 13:48:52
Done.
|
| // Check for the hole value. |
| if (instr->hydrogen()->RequiresHoleCheck()) { |
| @@ -2447,13 +2449,17 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
| Operand hole_check_operand = BuildFastArrayOperand( |
| instr->elements(), instr->key(), |
| FAST_DOUBLE_ELEMENTS, |
| - offset); |
| + offset, |
| + instr->additional_index()); |
| __ cmp(hole_check_operand, Immediate(kHoleNanUpper32)); |
| DeoptimizeIf(equal, instr->environment()); |
| Operand double_load_operand = BuildFastArrayOperand( |
| - instr->elements(), instr->key(), FAST_DOUBLE_ELEMENTS, |
| - FixedDoubleArray::kHeaderSize - kHeapObjectTag); |
| + instr->elements(), |
|
Jakob Kummerow
2012/05/08 13:46:26
Leaving these on one line is fine, actually. But i
Massi
2012/05/14 13:48:52
Done.
|
| + instr->key(), |
| + FAST_DOUBLE_ELEMENTS, |
| + FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
| + instr->additional_index()); |
| __ movdbl(result, double_load_operand); |
| } |
| @@ -2462,7 +2468,8 @@ Operand LCodeGen::BuildFastArrayOperand( |
| LOperand* elements_pointer, |
| LOperand* key, |
| ElementsKind elements_kind, |
| - uint32_t offset) { |
| + uint32_t offset, |
| + uint32_t additional_index) { |
|
Jakob Kummerow
2012/05/08 13:46:26
int32_t
Massi
2012/05/14 13:48:52
See above.
|
| Register elements_pointer_reg = ToRegister(elements_pointer); |
| int shift_size = ElementsKindToShiftSize(elements_kind); |
| if (key->IsConstantOperand()) { |
| @@ -2471,10 +2478,14 @@ Operand LCodeGen::BuildFastArrayOperand( |
| Abort("array index constant value too big"); |
| } |
| return Operand(elements_pointer_reg, |
| - constant_value * (1 << shift_size) + offset); |
| + (constant_value + additional_index) * (1 << shift_size) |
|
fschneider
2012/05/09 10:32:27
You could just rewrite
expr * (1 << shift_size) i
Massi
2012/05/14 13:48:52
Done (on all archs).
|
| + + offset); |
| } else { |
| ScaleFactor scale_factor = static_cast<ScaleFactor>(shift_size); |
| - return Operand(elements_pointer_reg, ToRegister(key), scale_factor, offset); |
| + return Operand(elements_pointer_reg, |
| + ToRegister(key), |
| + scale_factor, |
| + offset + (additional_index << shift_size)); |
| } |
| } |
| @@ -2483,7 +2494,10 @@ void LCodeGen::DoLoadKeyedSpecializedArrayElement( |
| LLoadKeyedSpecializedArrayElement* instr) { |
| ElementsKind elements_kind = instr->elements_kind(); |
| Operand operand(BuildFastArrayOperand(instr->external_pointer(), |
| - instr->key(), elements_kind, 0)); |
| + instr->key(), |
| + elements_kind, |
| + 0, |
| + instr->additional_index())); |
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
| XMMRegister result(ToDoubleRegister(instr->result())); |
| __ movss(result, operand); |
| @@ -3420,7 +3434,10 @@ void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
| LStoreKeyedSpecializedArrayElement* instr) { |
| ElementsKind elements_kind = instr->elements_kind(); |
| Operand operand(BuildFastArrayOperand(instr->external_pointer(), |
| - instr->key(), elements_kind, 0)); |
| + instr->key(), |
| + elements_kind, |
| + 0, |
| + instr->additional_index())); |
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
| __ cvtsd2ss(xmm0, ToDoubleRegister(instr->value())); |
| __ movss(operand, xmm0); |
| @@ -3461,31 +3478,21 @@ void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { |
| Register elements = ToRegister(instr->object()); |
| Register key = instr->key()->IsRegister() ? ToRegister(instr->key()) : no_reg; |
| - // Do the store. |
| - if (instr->key()->IsConstantOperand()) { |
| - ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); |
| - LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); |
| - int offset = |
| - ToInteger32(const_operand) * kPointerSize + FixedArray::kHeaderSize; |
| - __ mov(FieldOperand(elements, offset), value); |
| - } else { |
| - __ mov(FieldOperand(elements, |
| - key, |
| - times_pointer_size, |
| - FixedArray::kHeaderSize), |
| - value); |
| - } |
| + Operand operand = BuildFastArrayOperand(instr->object(), |
| + instr->key(), |
| + FAST_ELEMENTS, |
| + FixedArray::kHeaderSize |
| + - kHeapObjectTag, |
|
Jakob Kummerow
2012/05/08 13:46:26
Nit: this is ugly, please move all parameters to t
Massi
2012/05/14 13:48:52
Done.
|
| + instr->additional_index()); |
| + __ mov(operand, value); |
| if (instr->hydrogen()->NeedsWriteBarrier()) { |
| + ASSERT(!instr->key()->IsConstantOperand()); |
| HType type = instr->hydrogen()->value()->type(); |
| SmiCheck check_needed = |
| type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| // Compute address of modified element and store it into key register. |
| - __ lea(key, |
| - FieldOperand(elements, |
| - key, |
| - times_pointer_size, |
| - FixedArray::kHeaderSize)); |
| + __ lea(key, operand); |
| __ RecordWrite(elements, |
| key, |
| value, |
| @@ -3513,8 +3520,11 @@ void LCodeGen::DoStoreKeyedFastDoubleElement( |
| } |
| Operand double_store_operand = BuildFastArrayOperand( |
| - instr->elements(), instr->key(), FAST_DOUBLE_ELEMENTS, |
| - FixedDoubleArray::kHeaderSize - kHeapObjectTag); |
| + instr->elements(), |
| + instr->key(), |
| + FAST_DOUBLE_ELEMENTS, |
| + FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
| + instr->additional_index()); |
| __ movdbl(double_store_operand, value); |
| } |