Chromium Code Reviews| Index: src/x64/lithium-codegen-x64.cc |
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc |
| index 7c9949a1fad8da5b441e7ecd79d96ab41dbea073..e8287e2aaec1fdf907b7d4fb670e5da30ac95c64 100644 |
| --- a/src/x64/lithium-codegen-x64.cc |
| +++ b/src/x64/lithium-codegen-x64.cc |
| @@ -3053,6 +3053,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) { |
| void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { |
| + HLoadKeyed* hinstr = instr->hydrogen(); |
| Register result = ToRegister(instr->result()); |
| LOperand* key = instr->key(); |
| if (!key->IsConstantOperand()) { |
| @@ -3062,24 +3063,34 @@ void LCodeGen::DoLoadKeyedFixedArray(LLoadKeyed* instr) { |
| // gets replaced during bound check elimination with the index |
| // argument to the bounds check, which can be tagged, so that |
| // case must be handled here, too. |
| - if (instr->hydrogen()->IsDehoisted()) { |
| + if (hinstr->IsDehoisted()) { |
| // Sign extend key because it could be a 32 bit negative value |
| // and the dehoisted address computation happens in 64 bits |
| __ movsxlq(key_reg, key_reg); |
| } |
| } |
| - // Load the result. |
| - __ movq(result, |
| + bool requires_hole_check = hinstr->RequiresHoleCheck(); |
| + int offs = FixedArray::kHeaderSize - kHeapObjectTag; |
|
Toon Verwaest
2013/12/09 13:47:23
Please write out variable names: "offset".
Igor Sheludko
2013/12/09 17:27:06
Done.
|
| + Representation representation = hinstr->representation(); |
| + |
| + if (hinstr->type().IsSmi() && representation.IsInteger32()) { |
|
Toon Verwaest
2013/12/09 13:47:23
Why check for hinstr->type().IsSmi()? You should o
Igor Sheludko
2013/12/09 17:27:06
We can't rely only on IsInteger32() case since we
|
| + ASSERT(!requires_hole_check); |
| + // Read int value directly from upper half of the smi. |
| + offs += kPointerSize / 2; |
|
Toon Verwaest
2013/12/09 13:47:23
Isn't there a kSmiTagSize you can use? You just wa
Igor Sheludko
2013/12/09 17:27:06
kSmiTagSize is a number of bits, so we can't use i
|
| + } |
| + |
| + __ Load(result, |
| BuildFastArrayOperand(instr->elements(), |
| key, |
| FAST_ELEMENTS, |
| - FixedArray::kHeaderSize - kHeapObjectTag, |
| - instr->additional_index())); |
| + offs, |
| + instr->additional_index()), |
| + representation); |
| // Check for the hole value. |
| - if (instr->hydrogen()->RequiresHoleCheck()) { |
| - if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { |
| + if (requires_hole_check) { |
| + if (IsFastSmiElementsKind(hinstr->elements_kind())) { |
| Condition smi = __ CheckSmi(result); |
| DeoptimizeIf(NegateCondition(smi), instr->environment()); |
| } else { |