| Index: src/mips/lithium-codegen-mips.cc
|
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc
|
| index aba7516fa2650b6cfdc840b548a39467781c7724..e7460e84b075273b5be8ec710d79425ea12b8db8 100644
|
| --- a/src/mips/lithium-codegen-mips.cc
|
| +++ b/src/mips/lithium-codegen-mips.cc
|
| @@ -2180,10 +2180,17 @@ void LCodeGen::DoStoreGlobalGeneric(LStoreGlobalGeneric* instr) {
|
| void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
|
| Register context = ToRegister(instr->context());
|
| Register result = ToRegister(instr->result());
|
| + Register scratch = scratch0();
|
| +
|
| __ lw(result, ContextOperand(context, instr->slot_index()));
|
| if (instr->hydrogen()->RequiresHoleCheck()) {
|
| __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
| - DeoptimizeIf(eq, instr->environment(), result, Operand(at));
|
| + if (instr->hydrogen()->DeoptimizesOnHole()) {
|
| + DeoptimizeIf(eq, instr->environment(), result, Operand(at));
|
| + } else {
|
| + __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex);
|
| + __ movz(result, scratch, at);
|
| + }
|
| }
|
| }
|
|
|
| @@ -2191,13 +2198,22 @@ void LCodeGen::DoLoadContextSlot(LLoadContextSlot* instr) {
|
| void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
| Register context = ToRegister(instr->context());
|
| Register value = ToRegister(instr->value());
|
| + Register scratch = scratch0();
|
| MemOperand target = ContextOperand(context, instr->slot_index());
|
| +
|
| + Label skip_assignment;
|
| +
|
| if (instr->hydrogen()->RequiresHoleCheck()) {
|
| - Register scratch = scratch0();
|
| __ lw(scratch, target);
|
| __ LoadRoot(at, Heap::kTheHoleValueRootIndex);
|
| - DeoptimizeIf(eq, instr->environment(), scratch, Operand(at));
|
| +
|
| + if (instr->hydrogen()->DeoptimizesOnHole()) {
|
| + DeoptimizeIf(eq, instr->environment(), scratch, Operand(at));
|
| + } else {
|
| + __ Branch(&skip_assignment, ne, scratch, Operand(at));
|
| + }
|
| }
|
| +
|
| __ sw(value, target);
|
| if (instr->hydrogen()->NeedsWriteBarrier()) {
|
| HType type = instr->hydrogen()->value()->type();
|
| @@ -2212,6 +2228,8 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
|
| EMIT_REMEMBERED_SET,
|
| check_needed);
|
| }
|
| +
|
| + __ bind(&skip_assignment);
|
| }
|
|
|
|
|
|
|