| 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());
|
| }
|
|
|
|
|
|
|