Commit b0d92814 authored by plind44@gmail.com's avatar plind44@gmail.com

MIPS: Tweak LoadKeyed.

Port r17042 (9ade336)

Original commit message:
Avoid corrupting its input.

BUG=none
TEST=none
R=plind44@gmail.com

Review URL: https://codereview.chromium.org/25563002

Patch from Balazs Kilvady <kilvadyb@homejinni.com>.

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17058 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent e98e7c9f
...@@ -3126,28 +3126,31 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { ...@@ -3126,28 +3126,31 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
Register scratch = scratch0(); Register scratch = scratch0();
int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
? (element_size_shift - kSmiTagSize) : element_size_shift; int base_offset =
int constant_key = 0; FixedDoubleArray::kHeaderSize - kHeapObjectTag +
(instr->additional_index() << element_size_shift);
if (key_is_constant) { if (key_is_constant) {
constant_key = ToInteger32(LConstantOperand::cast(instr->key())); int constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
if (constant_key & 0xF0000000) { if (constant_key & 0xF0000000) {
Abort(kArrayIndexConstantValueTooBig); Abort(kArrayIndexConstantValueTooBig);
} }
} else { base_offset += constant_key << element_size_shift;
key = ToRegister(instr->key());
} }
__ Addu(scratch, elements, Operand(base_offset));
int base_offset = (FixedDoubleArray::kHeaderSize - kHeapObjectTag) +
((constant_key + instr->additional_index()) << element_size_shift);
if (!key_is_constant) { if (!key_is_constant) {
__ sll(scratch, key, shift_size); key = ToRegister(instr->key());
__ Addu(elements, elements, scratch); 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()) { if (instr->hydrogen()->RequiresHoleCheck()) {
__ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32))); __ lw(scratch, MemOperand(scratch, sizeof(kHoleNanLower32)));
DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32)); DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32));
} }
} }
...@@ -3166,7 +3169,7 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { ...@@ -3166,7 +3169,7 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) {
instr->additional_index()); instr->additional_index());
store_base = elements; store_base = elements;
} else { } else {
Register key = EmitLoadRegister(instr->key(), scratch0()); Register key = ToRegister(instr->key());
// Even though the HLoadKeyed instruction forces the input // Even though the HLoadKeyed instruction forces the input
// representation for the key to be an integer, the input gets replaced // representation for the key to be an integer, the input gets replaced
// during bound check elimination with the index argument to the bounds // during bound check elimination with the index argument to the bounds
......
...@@ -2122,7 +2122,7 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) { ...@@ -2122,7 +2122,7 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
if (!instr->is_external()) { if (!instr->is_external()) {
LOperand* obj = NULL; LOperand* obj = NULL;
if (instr->representation().IsDouble()) { if (instr->representation().IsDouble()) {
obj = UseTempRegister(instr->elements()); obj = UseRegister(instr->elements());
} else { } else {
ASSERT(instr->representation().IsSmiOrTagged()); ASSERT(instr->representation().IsSmiOrTagged());
obj = UseRegisterAtStart(instr->elements()); obj = UseRegisterAtStart(instr->elements());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment