Chromium Code Reviews| Index: src/ia32/codegen-ia32.cc |
| diff --git a/src/ia32/codegen-ia32.cc b/src/ia32/codegen-ia32.cc |
| index e5ca02c4731d3797d1a7551d8e4ea1ea5e4202da..eab103205c582047e9e457e299e9e5aec8e57c35 100644 |
| --- a/src/ia32/codegen-ia32.cc |
| +++ b/src/ia32/codegen-ia32.cc |
| @@ -1,4 +1,4 @@ |
| -// Copyright 2011 the V8 project authors. All rights reserved. |
| +// Copyright 2012 the V8 project authors. All rights reserved. |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are |
| // met: |
| @@ -301,11 +301,17 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
| // -- edx : receiver |
| // -- esp[0] : return address |
| // ----------------------------------- |
| - Label loop, entry, convert_hole, gc_required; |
| + Label loop, entry, convert_hole, gc_required, only_change_map; |
| + |
| + // Check for empty arrays, which only require a map transition and no changes |
| + // to the backing store. |
| + __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| + __ cmp(edi, Immediate(masm->isolate()->factory()->empty_fixed_array())); |
| + __ j(equal, &only_change_map); |
| + |
| __ push(eax); |
| __ push(ebx); |
| - __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| __ mov(edi, FieldOperand(edi, FixedArray::kLengthOffset)); |
| // Allocate new FixedDoubleArray. |
| @@ -399,6 +405,11 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
| __ pop(ebx); |
| __ pop(eax); |
| + |
| + // Restore esi. |
| + __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| + |
| + __ bind(&only_change_map); |
| // eax: value |
| // ebx: target map |
| // Set transitioned map. |
| @@ -410,8 +421,6 @@ void ElementsTransitionGenerator::GenerateSmiOnlyToDouble( |
| kDontSaveFPRegs, |
| EMIT_REMEMBERED_SET, |
|
Vyacheslav Egorov (Chromium)
2012/02/09 16:29:19
map can not be in new space.
We only need an inc
danno
2012/02/10 12:25:34
Done.
|
| OMIT_SMI_CHECK); |
| - // Restore esi. |
| - __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| } |
| @@ -424,12 +433,18 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
| // -- edx : receiver |
| // -- esp[0] : return address |
| // ----------------------------------- |
| - Label loop, entry, convert_hole, gc_required; |
| + Label loop, entry, convert_hole, gc_required, only_change_map, success; |
| + |
| + // Check for empty arrays, which only require a map transition and no changes |
| + // to the backing store. |
| + __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| + __ cmp(edi, Immediate(masm->isolate()->factory()->empty_fixed_array())); |
| + __ j(equal, &only_change_map); |
| + |
| __ push(eax); |
| __ push(edx); |
| __ push(ebx); |
| - __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| __ mov(ebx, FieldOperand(edi, FixedDoubleArray::kLengthOffset)); |
| // Allocate new FixedArray. |
| @@ -446,6 +461,20 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
| __ jmp(&entry); |
| + // ebx: target map |
| + // edx: receiver |
| + // Set transitioned map. |
| + __ bind(&only_change_map); |
| + __ mov(FieldOperand(edx, HeapObject::kMapOffset), ebx); |
| + __ RecordWriteField(edx, |
| + HeapObject::kMapOffset, |
| + ebx, |
| + edi, |
| + kDontSaveFPRegs, |
| + EMIT_REMEMBERED_SET, |
|
Vyacheslav Egorov (Chromium)
2012/02/09 16:29:19
ditto
danno
2012/02/10 12:25:34
Done.
|
| + OMIT_SMI_CHECK); |
| + __ jmp(&success); |
| + |
| // Call into runtime if GC is required. |
| __ bind(&gc_required); |
| __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| @@ -522,6 +551,8 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( |
| // Restore registers. |
| __ pop(eax); |
| __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); |
| + |
| + __ bind(&success); |
| } |