Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 2768) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -6947,18 +6947,21 @@ |
Register scratch1, |
Register scratch2, |
Register result) { |
- // Allocate heap number in new space. |
- __ AllocateObjectInNewSpace(HeapNumber::kSize, |
- result, |
- scratch1, |
- scratch2, |
- need_gc, |
- false); |
- |
- // Set the map and tag the result. |
+ ExternalReference allocation_top = |
+ ExternalReference::new_space_allocation_top_address(); |
+ ExternalReference allocation_limit = |
+ ExternalReference::new_space_allocation_limit_address(); |
+ __ mov(Operand(scratch1), Immediate(allocation_top)); |
+ __ mov(result, Operand(scratch1, 0)); |
+ __ lea(scratch2, Operand(result, HeapNumber::kSize)); // scratch2: new top |
+ __ cmp(scratch2, Operand::StaticVariable(allocation_limit)); |
+ __ j(above, need_gc, not_taken); |
+ |
+ __ mov(Operand(scratch1, 0), scratch2); // store new top |
__ mov(Operand(result, HeapObject::kMapOffset), |
Immediate(Factory::heap_number_map())); |
- __ or_(Operand(result), Immediate(kHeapObjectTag)); |
+ // Tag old top and use as result. |
+ __ add(Operand(result), Immediate(kHeapObjectTag)); |
} |