Index: src/x64/lithium-codegen-x64.cc |
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
index 96aa3e19fc1d1b0b8676da994533ad6154630048..acbac44fc448495cc6257a9136beb84f07e54af2 100644 |
--- a/src/x64/lithium-codegen-x64.cc |
+++ b/src/x64/lithium-codegen-x64.cc |
@@ -2262,16 +2262,13 @@ void LCodeGen::DoAccessArgumentsAt(LAccessArgumentsAt* instr) { |
void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { |
- Register elements = ToRegister(instr->elements()); |
- Register key = ToRegister(instr->key()); |
Register result = ToRegister(instr->result()); |
- ASSERT(result.is(elements)); |
// Load the result. |
- __ movq(result, FieldOperand(elements, |
- key, |
- times_pointer_size, |
- FixedArray::kHeaderSize)); |
+ __ movq(result, |
+ BuildFastArrayOperand(instr->elements(), instr->key(), |
+ JSObject::FAST_ELEMENTS, |
+ FixedArray::kHeaderSize - kHeapObjectTag)); |
// Check for the hole value. |
if (instr->hydrogen()->RequiresHoleCheck()) { |
@@ -2305,22 +2302,22 @@ void LCodeGen::DoLoadKeyedFastDoubleElement( |
Operand LCodeGen::BuildFastArrayOperand( |
- LOperand* external_pointer, |
+ LOperand* elements_pointer, |
LOperand* key, |
JSObject::ElementsKind elements_kind, |
uint32_t offset) { |
- Register external_pointer_reg = ToRegister(external_pointer); |
+ Register elements_pointer_reg = ToRegister(elements_pointer); |
int shift_size = ElementsKindToShiftSize(elements_kind); |
if (key->IsConstantOperand()) { |
int constant_value = ToInteger32(LConstantOperand::cast(key)); |
if (constant_value & 0xF0000000) { |
Abort("array index constant value too big"); |
} |
- return Operand(external_pointer_reg, |
+ return Operand(elements_pointer_reg, |
constant_value * (1 << shift_size) + offset); |
} else { |
ScaleFactor scale_factor = static_cast<ScaleFactor>(shift_size); |
- return Operand(external_pointer_reg, ToRegister(key), |
+ return Operand(elements_pointer_reg, ToRegister(key), |
scale_factor, offset); |
} |
} |
@@ -3103,12 +3100,22 @@ void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
- if (instr->length()->IsRegister()) { |
- __ cmpq(ToRegister(instr->index()), ToRegister(instr->length())); |
+ if (instr->index()->IsConstantOperand()) { |
+ if (instr->length()->IsRegister()) { |
+ __ cmpq(ToRegister(instr->length()), |
+ Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); |
+ } else { |
+ __ cmpq(ToOperand(instr->length()), |
+ Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); |
+ } |
} else { |
- __ cmpq(ToRegister(instr->index()), ToOperand(instr->length())); |
+ if (instr->length()->IsRegister()) { |
+ __ cmpq(ToRegister(instr->length()), ToRegister(instr->index())); |
+ } else { |
+ __ cmpq(ToOperand(instr->length()), ToRegister(instr->index())); |
+ } |
} |
- DeoptimizeIf(above_equal, instr->environment()); |
+ DeoptimizeIf(below_equal, instr->environment()); |
} |