Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index 97dcd163cf2c7a6b2ffaf0e37e3feacf31db8c29..d44c98811d3004945c2b35617b7fd800967ce15e 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -3124,28 +3124,31 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { |
Register scratch = scratch0(); |
int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); |
- int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
- ? (element_size_shift - kSmiTagSize) : element_size_shift; |
- int constant_key = 0; |
+ |
+ int base_offset = |
+ FixedDoubleArray::kHeaderSize - kHeapObjectTag + |
+ (instr->additional_index() << element_size_shift); |
if (key_is_constant) { |
- constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
+ int constant_key = ToInteger32(LConstantOperand::cast(instr->key())); |
if (constant_key & 0xF0000000) { |
Abort(kArrayIndexConstantValueTooBig); |
} |
- } else { |
- key = ToRegister(instr->key()); |
+ base_offset += constant_key << element_size_shift; |
} |
+ __ Addu(scratch, elements, Operand(base_offset)); |
- int base_offset = (FixedDoubleArray::kHeaderSize - kHeapObjectTag) + |
- ((constant_key + instr->additional_index()) << element_size_shift); |
if (!key_is_constant) { |
- __ sll(scratch, key, shift_size); |
- __ Addu(elements, elements, scratch); |
+ key = ToRegister(instr->key()); |
+ int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
+ ? (element_size_shift - kSmiTagSize) : element_size_shift; |
+ __ sll(at, key, shift_size); |
+ __ Addu(scratch, scratch, at); |
} |
- __ Addu(elements, elements, Operand(base_offset)); |
- __ ldc1(result, MemOperand(elements)); |
+ |
+ __ ldc1(result, MemOperand(scratch)); |
+ |
if (instr->hydrogen()->RequiresHoleCheck()) { |
- __ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32))); |
+ __ lw(scratch, MemOperand(scratch, sizeof(kHoleNanLower32))); |
DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32)); |
} |
} |
@@ -3164,7 +3167,7 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { |
instr->additional_index()); |
store_base = elements; |
} else { |
- Register key = EmitLoadRegister(instr->key(), scratch0()); |
+ Register key = ToRegister(instr->key()); |
// Even though the HLoadKeyed instruction forces 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 |