Chromium Code Reviews| Index: src/arm/macro-assembler-arm.cc |
| diff --git a/src/arm/macro-assembler-arm.cc b/src/arm/macro-assembler-arm.cc |
| index 2265d03bd907532edbf280da92ba3bd9e2daef60..b8039b663ccded15f09ce4cf9cc7403b013596ba 100644 |
| --- a/src/arm/macro-assembler-arm.cc |
| +++ b/src/arm/macro-assembler-arm.cc |
| @@ -1564,12 +1564,12 @@ void MacroAssembler::LoadFromNumberDictionary(Label* miss, |
| } |
| -void MacroAssembler::AllocateInNewSpace(int object_size, |
| - Register result, |
| - Register scratch1, |
| - Register scratch2, |
| - Label* gc_required, |
| - AllocationFlags flags) { |
| +void MacroAssembler::Allocate(int object_size, |
| + Register result, |
| + Register scratch1, |
| + Register scratch2, |
| + Label* gc_required, |
| + AllocationFlags flags) { |
| if (!FLAG_inline_new) { |
| if (emit_debug_code()) { |
| // Trash the registers to simulate an allocation failure. |
| @@ -1597,21 +1597,22 @@ void MacroAssembler::AllocateInNewSpace(int object_size, |
| // The values must be adjacent in memory to allow the use of LDM. |
| // Also, assert that the registers are numbered such that the values |
| // are loaded in the correct order. |
| - ExternalReference new_space_allocation_top = |
| - ExternalReference::new_space_allocation_top_address(isolate()); |
| - ExternalReference new_space_allocation_limit = |
| - ExternalReference::new_space_allocation_limit_address(isolate()); |
| + ExternalReference allocation_top = |
| + AllocationUtils::GetAllocationTopReference(isolate(), flags); |
| + ExternalReference allocation_limit = |
| + AllocationUtils::GetAllocationLimitReference(isolate(), flags); |
| + |
| intptr_t top = |
| - reinterpret_cast<intptr_t>(new_space_allocation_top.address()); |
| + reinterpret_cast<intptr_t>(allocation_top.address()); |
| intptr_t limit = |
| - reinterpret_cast<intptr_t>(new_space_allocation_limit.address()); |
| + reinterpret_cast<intptr_t>(allocation_limit.address()); |
| ASSERT((limit - top) == kPointerSize); |
| ASSERT(result.code() < ip.code()); |
| // Set up allocation top address and object size registers. |
| Register topaddr = scratch1; |
| Register obj_size_reg = scratch2; |
| - mov(topaddr, Operand(new_space_allocation_top)); |
| + mov(topaddr, Operand(allocation_top)); |
| Operand obj_size_operand = Operand(object_size); |
| if (!obj_size_operand.is_single_instruction(this)) { |
| // We are about to steal IP, so we need to load this value first |
| @@ -1636,7 +1637,8 @@ void MacroAssembler::AllocateInNewSpace(int object_size, |
| ldr(ip, MemOperand(topaddr, limit - top)); |
| } |
| - if ((flags & DOUBLE_ALIGNMENT) != 0) { |
| + if (((flags & PRETENURE_OLD_POINTER_SPACE) == 0) && |
| + ((flags & DOUBLE_ALIGNMENT) != 0)) { |
|
danno
2013/03/13 09:08:32
Is this really right? Don't you want to ASSERT ins
Hannes Payer (out of office)
2013/03/14 08:18:51
Done.
|
| // Align the next allocation. Storing the filler map without checking top is |
| // always safe because the limit of the heap is always aligned. |
| ASSERT(kPointerAlignment * 2 == kDoubleAlignment); |
| @@ -1675,6 +1677,7 @@ void MacroAssembler::AllocateInNewSpace(Register object_size, |
| Register scratch2, |
| Label* gc_required, |
| AllocationFlags flags) { |
| + ASSERT((flags & PRETENURE_OLD_POINTER_SPACE) == 0); |
| if (!FLAG_inline_new) { |
| if (emit_debug_code()) { |
| // Trash the registers to simulate an allocation failure. |
| @@ -1858,12 +1861,8 @@ void MacroAssembler::AllocateTwoByteConsString(Register result, |
| Register scratch1, |
| Register scratch2, |
| Label* gc_required) { |
| - AllocateInNewSpace(ConsString::kSize, |
| - result, |
| - scratch1, |
| - scratch2, |
| - gc_required, |
| - TAG_OBJECT); |
| + Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, |
| + TAG_OBJECT); |
| InitializeNewString(result, |
| length, |
| @@ -1878,12 +1877,8 @@ void MacroAssembler::AllocateAsciiConsString(Register result, |
| Register scratch1, |
| Register scratch2, |
| Label* gc_required) { |
| - AllocateInNewSpace(ConsString::kSize, |
| - result, |
| - scratch1, |
| - scratch2, |
| - gc_required, |
| - TAG_OBJECT); |
| + Allocate(ConsString::kSize, result, scratch1, scratch2, gc_required, |
| + TAG_OBJECT); |
| InitializeNewString(result, |
| length, |
| @@ -1898,12 +1893,8 @@ void MacroAssembler::AllocateTwoByteSlicedString(Register result, |
| Register scratch1, |
| Register scratch2, |
| Label* gc_required) { |
| - AllocateInNewSpace(SlicedString::kSize, |
| - result, |
| - scratch1, |
| - scratch2, |
| - gc_required, |
| - TAG_OBJECT); |
| + Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, |
| + TAG_OBJECT); |
| InitializeNewString(result, |
| length, |
| @@ -1918,12 +1909,8 @@ void MacroAssembler::AllocateAsciiSlicedString(Register result, |
| Register scratch1, |
| Register scratch2, |
| Label* gc_required) { |
| - AllocateInNewSpace(SlicedString::kSize, |
| - result, |
| - scratch1, |
| - scratch2, |
| - gc_required, |
| - TAG_OBJECT); |
| + Allocate(SlicedString::kSize, result, scratch1, scratch2, gc_required, |
| + TAG_OBJECT); |
| InitializeNewString(result, |
| length, |
| @@ -3283,13 +3270,8 @@ void MacroAssembler::AllocateHeapNumber(Register result, |
| TaggingMode tagging_mode) { |
| // Allocate an object in the heap for the heap number and tag it as a heap |
| // object. |
| - AllocateInNewSpace(HeapNumber::kSize, |
| - result, |
| - scratch1, |
| - scratch2, |
| - gc_required, |
| - tagging_mode == TAG_RESULT ? TAG_OBJECT : |
| - NO_ALLOCATION_FLAGS); |
| + Allocate(HeapNumber::kSize, result, scratch1, scratch2, gc_required, |
| + tagging_mode == TAG_RESULT ? TAG_OBJECT : NO_ALLOCATION_FLAGS); |
| // Store heap number map in the allocated object. |
| AssertRegisterIsRoot(heap_number_map, Heap::kHeapNumberMapRootIndex); |