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), |