| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 9e1fd34af3347c4ffbfe6fb4df1496094859a8fb..2b3929d470d49a43b1e5015f2b336e3d6d2ab681 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -3303,6 +3303,48 @@ void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) {
|
| + Register object_reg = ToRegister(instr->object());
|
| + Register new_map_reg = ToRegister(instr->new_map_reg());
|
| +
|
| + Handle<Map> from_map = instr->original_map();
|
| + Handle<Map> to_map = instr->transitioned_map();
|
| + ElementsKind from_kind = from_map->elements_kind();
|
| + ElementsKind to_kind = to_map->elements_kind();
|
| +
|
| + Label not_applicable;
|
| + __ cmp(FieldOperand(object_reg, HeapObject::kMapOffset), from_map);
|
| + __ j(not_equal, ¬_applicable);
|
| + __ mov(new_map_reg, to_map);
|
| + if (from_kind == FAST_SMI_ONLY_ELEMENTS && to_kind == FAST_ELEMENTS) {
|
| + Register object_reg = ToRegister(instr->object());
|
| + __ mov(FieldOperand(object_reg, HeapObject::kMapOffset), new_map_reg);
|
| + // Write barrier.
|
| + ASSERT_NE(instr->temp_reg(), NULL);
|
| + __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg,
|
| + ToRegister(instr->temp_reg()), kDontSaveFPRegs);
|
| + } else if (from_kind == FAST_SMI_ONLY_ELEMENTS &&
|
| + to_kind == FAST_DOUBLE_ELEMENTS) {
|
| + Register fixed_object_reg = ToRegister(instr->temp_reg());
|
| + ASSERT(fixed_object_reg.is(edx));
|
| + ASSERT(new_map_reg.is(ebx));
|
| + __ mov(fixed_object_reg, object_reg);
|
| + CallCode(isolate()->builtins()->TransitionElementsSmiToDouble(),
|
| + RelocInfo::CODE_TARGET, instr);
|
| + } else if (from_kind == FAST_DOUBLE_ELEMENTS && to_kind == FAST_ELEMENTS) {
|
| + Register fixed_object_reg = ToRegister(instr->temp_reg());
|
| + ASSERT(fixed_object_reg.is(edx));
|
| + ASSERT(new_map_reg.is(ebx));
|
| + __ mov(fixed_object_reg, object_reg);
|
| + CallCode(isolate()->builtins()->TransitionElementsDoubleToObject(),
|
| + RelocInfo::CODE_TARGET, instr);
|
| + } else {
|
| + UNREACHABLE();
|
| + }
|
| + __ bind(¬_applicable);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoStringCharCodeAt(LStringCharCodeAt* instr) {
|
| class DeferredStringCharCodeAt: public LDeferredCode {
|
| public:
|
|
|