| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 2e5fa56347105e9f97142dae783b058bd4406283..aea9b34fc0c50daf7f5182ea2c397b68cc65524c 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -504,8 +504,6 @@ XMMRegister LCodeGen::ToDoubleRegister(LOperand* op) const {
|
|
|
| int LCodeGen::ToInteger32(LConstantOperand* op) const {
|
| HConstant* constant = chunk_->LookupConstant(op);
|
| - ASSERT(chunk_->LookupLiteralRepresentation(op).IsInteger32());
|
| - ASSERT(constant->HasInteger32Value());
|
| return constant->Integer32Value();
|
| }
|
|
|
| @@ -3209,13 +3207,6 @@ Operand LCodeGen::BuildFastArrayOperand(
|
| uint32_t additional_index) {
|
| Register elements_pointer_reg = ToRegister(elements_pointer);
|
| int shift_size = ElementsKindToShiftSize(elements_kind);
|
| - // Even though the HLoad/StoreKeyed instructions force the input
|
| - // representation for the key to be an integer, the input gets replaced during
|
| - // bound check elimination with the index argument to the bounds check, which
|
| - // can be tagged, so that case must be handled here, too.
|
| - if (key_representation.IsTagged() && (shift_size >= 1)) {
|
| - shift_size -= kSmiTagSize;
|
| - }
|
| if (key->IsConstantOperand()) {
|
| int constant_value = ToInteger32(LConstantOperand::cast(key));
|
| if (constant_value & 0xF0000000) {
|
| @@ -3225,6 +3216,10 @@ Operand LCodeGen::BuildFastArrayOperand(
|
| ((constant_value + additional_index) << shift_size)
|
| + offset);
|
| } else {
|
| + // Take the tag bit into account while computing the shift size.
|
| + if (key_representation.IsTagged() && (shift_size >= 1)) {
|
| + shift_size -= kSmiTagSize;
|
| + }
|
| ScaleFactor scale_factor = static_cast<ScaleFactor>(shift_size);
|
| return Operand(elements_pointer_reg,
|
| ToRegister(key),
|
|
|