Chromium Code Reviews| Index: src/ia32/lithium-codegen-ia32.cc |
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc |
| index ca093ec6512e6d0b4337d91efc8725270cb06286..f70c540f5adbf552641c69a62b78e0607efd6aa4 100644 |
| --- a/src/ia32/lithium-codegen-ia32.cc |
| +++ b/src/ia32/lithium-codegen-ia32.cc |
| @@ -3573,17 +3573,24 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
| Label not_applicable; |
| __ cmp(FieldOperand(object_reg, HeapObject::kMapOffset), from_map); |
|
Michael Starzinger
2012/06/06 09:41:17
Can we move this "__ cmp" down so that it is right
danno
2012/06/06 10:58:28
Done.
|
| - __ j(not_equal, ¬_applicable); |
| - __ mov(new_map_reg, to_map); |
| - if (IsSimpleMapChangeTransition(from_kind, to_kind)) { |
| + bool is_simple_map_transition = |
| + IsSimpleMapChangeTransition(from_kind, to_kind); |
| + Label::Distance branch_distance = |
| + is_simple_map_transition ? Label::kNear : Label::kFar; |
| + __ j(not_equal, ¬_applicable, branch_distance); |
| + if (is_simple_map_transition) { |
| Register object_reg = ToRegister(instr->object()); |
| - __ mov(FieldOperand(object_reg, HeapObject::kMapOffset), new_map_reg); |
| + Handle<Map> map = instr->hydrogen()->transitioned_map(); |
| + __ mov(FieldOperand(object_reg, HeapObject::kMapOffset), |
| + Immediate(map)); |
| // Write barrier. |
| ASSERT_NE(instr->temp_reg(), NULL); |
| - __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, |
| - ToRegister(instr->temp_reg()), kDontSaveFPRegs); |
| + __ RecordWriteForMap(object_reg, to_map, new_map_reg, |
| + ToRegister(instr->temp_reg()), |
| + kDontSaveFPRegs); |
| } else if (IsFastSmiElementsKind(from_kind) && |
| IsFastDoubleElementsKind(to_kind)) { |
| + __ mov(new_map_reg, to_map); |
| Register fixed_object_reg = ToRegister(instr->temp_reg()); |
| ASSERT(fixed_object_reg.is(edx)); |
| ASSERT(new_map_reg.is(ebx)); |
| @@ -3592,6 +3599,7 @@ void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
| RelocInfo::CODE_TARGET, instr); |
| } else if (IsFastDoubleElementsKind(from_kind) && |
| IsFastObjectElementsKind(to_kind)) { |
| + __ mov(new_map_reg, to_map); |
| Register fixed_object_reg = ToRegister(instr->temp_reg()); |
| ASSERT(fixed_object_reg.is(edx)); |
| ASSERT(new_map_reg.is(ebx)); |