ARM: Tweak LoadKeyed.
Avoid corrupting its input. BUG=none TEST=none R=ulan@chromium.org Review URL: https://codereview.chromium.org/25231005 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17042 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
7fae9959e9
commit
c817008da7
@ -2226,7 +2226,7 @@ LInstruction* LChunkBuilder::DoLoadKeyed(HLoadKeyed* instr) {
|
||||
if (!instr->is_external()) {
|
||||
LOperand* obj = NULL;
|
||||
if (instr->representation().IsDouble()) {
|
||||
obj = UseTempRegister(instr->elements());
|
||||
obj = UseRegister(instr->elements());
|
||||
} else {
|
||||
ASSERT(instr->representation().IsSmiOrTagged());
|
||||
obj = UseRegisterAtStart(instr->elements());
|
||||
|
@ -3295,27 +3295,30 @@ 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 {
|
||||
base_offset += constant_key << element_size_shift;
|
||||
}
|
||||
__ add(scratch, elements, Operand(base_offset));
|
||||
|
||||
if (!key_is_constant) {
|
||||
key = ToRegister(instr->key());
|
||||
int shift_size = (instr->hydrogen()->key()->representation().IsSmi())
|
||||
? (element_size_shift - kSmiTagSize) : element_size_shift;
|
||||
__ add(scratch, scratch, Operand(key, LSL, shift_size));
|
||||
}
|
||||
|
||||
int base_offset = (FixedDoubleArray::kHeaderSize - kHeapObjectTag) +
|
||||
((constant_key + instr->additional_index()) << element_size_shift);
|
||||
if (!key_is_constant) {
|
||||
__ add(elements, elements, Operand(key, LSL, shift_size));
|
||||
}
|
||||
__ add(elements, elements, Operand(base_offset));
|
||||
__ vldr(result, elements, 0);
|
||||
__ vldr(result, scratch, 0);
|
||||
|
||||
if (instr->hydrogen()->RequiresHoleCheck()) {
|
||||
__ ldr(scratch, MemOperand(elements, sizeof(kHoleNanLower32)));
|
||||
__ ldr(scratch, MemOperand(scratch, sizeof(kHoleNanLower32)));
|
||||
__ cmp(scratch, Operand(kHoleNanUpper32));
|
||||
DeoptimizeIf(eq, instr->environment());
|
||||
}
|
||||
@ -3335,7 +3338,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
|
||||
|
Loading…
Reference in New Issue
Block a user