| Index: src/x64/lithium-codegen-x64.cc
|
| diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
|
| index 9a1ce9800993d683dc04ea27bee12b54b70c9168..42c6e9148e71d6b5fe16dc810ac643efe43b8ce7 100644
|
| --- a/src/x64/lithium-codegen-x64.cc
|
| +++ b/src/x64/lithium-codegen-x64.cc
|
| @@ -4606,6 +4606,21 @@ void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
|
| if (instr->needs_check()) {
|
| Condition is_smi = __ CheckSmi(input);
|
| DeoptimizeIf(NegateCondition(is_smi), instr->environment());
|
| + } else if (instr->hydrogen()->value()->IsLoadKeyed()) {
|
| + HLoadKeyed* load = HLoadKeyed::cast(instr->hydrogen()->value());
|
| + if (load->UsesMustHandleHole()) {
|
| + Condition cc = masm()->CheckSmi(input);
|
| + if (load->hole_mode() == ALLOW_RETURN_HOLE) {
|
| + Label done;
|
| + __ j(cc, &done);
|
| + __ xor_(input, input);
|
| + __ bind(&done);
|
| + } else {
|
| + DeoptimizeIf(NegateCondition(cc), instr->environment());
|
| + }
|
| + } else {
|
| + __ AssertSmi(input);
|
| + }
|
| } else {
|
| __ AssertSmi(input);
|
| }
|
|
|