Index: runtime/vm/intrinsifier_ia32.cc |
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc |
index df92379a733e636022ab1d333ff4c304a8f5c671..11f93e69aff25c5fa07d4151acc6ea2157f87981 100644 |
--- a/runtime/vm/intrinsifier_ia32.cc |
+++ b/runtime/vm/intrinsifier_ia32.cc |
@@ -186,7 +186,8 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) { |
#define TYPED_ARRAY_ALLOCATION(type_name, cid, max_len, scale_factor) \ |
Label fall_through; \ |
const intptr_t kArrayLengthStackOffset = 1 * kWordSize; \ |
- __ MaybeTraceAllocation(cid, EDI, &fall_through, false); \ |
+ __ MaybeTraceAllocation(cid, EDI, &fall_through, false, \ |
+ /* inline_isolate = */ false); \ |
__ movl(EDI, Address(ESP, kArrayLengthStackOffset)); /* Array length. */ \ |
/* Check that length is a positive Smi. */ \ |
/* EDI: requested array length argument. */ \ |
@@ -209,9 +210,9 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) { |
const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1; \ |
__ leal(EDI, Address(EDI, scale_factor, fixed_size)); \ |
__ andl(EDI, Immediate(-kObjectAlignment)); \ |
- Heap* heap = Isolate::Current()->heap(); \ |
- Heap::Space space = heap->SpaceForAllocation(cid); \ |
- __ movl(EAX, Address::Absolute(heap->TopAddress(space))); \ |
+ Heap::Space space = Heap::SpaceForAllocation(cid); \ |
+ __ movl(ECX, Address(THR, Thread::heap_offset())); \ |
+ __ movl(EAX, Address(ECX, Heap::TopOffset(space))); \ |
__ movl(EBX, EAX); \ |
\ |
/* EDI: allocation size. */ \ |
@@ -222,14 +223,16 @@ void Intrinsifier::GrowableArray_add(Assembler* assembler) { |
/* EAX: potential new object start. */ \ |
/* EBX: potential next object start. */ \ |
/* EDI: allocation size. */ \ |
- __ cmpl(EBX, Address::Absolute(heap->EndAddress(space))); \ |
+ /* ECX: heap. */ \ |
+ __ cmpl(EBX, Address(ECX, Heap::EndOffset(space))); \ |
__ j(ABOVE_EQUAL, &fall_through); \ |
\ |
/* Successfully allocated the object(s), now update top to point to */ \ |
/* next object start and initialize the object. */ \ |
- __ movl(Address::Absolute(heap->TopAddress(space)), EBX); \ |
+ __ movl(Address(ECX, Heap::TopOffset(space)), EBX); \ |
__ addl(EAX, Immediate(kHeapObjectTag)); \ |
- __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister, space); \ |
+ __ UpdateAllocationStatsWithSize(cid, EDI, ECX, space, \ |
+ /* inline_isolate = */ false); \ |
\ |
/* Initialize the tags. */ \ |
/* EAX: new object start as a tagged pointer. */ \ |
@@ -588,7 +591,7 @@ void Intrinsifier::Integer_shl(Assembler* assembler) { |
&fall_through, |
Assembler::kNearJump, |
EAX, // Result register. |
- kNoRegister); |
+ ECX); // temp |
// EBX and EDI are not objects but integer values. |
__ movl(FieldAddress(EAX, Mint::value_offset()), EBX); |
__ movl(FieldAddress(EAX, Mint::value_offset() + kWordSize), EDI); |
@@ -1869,7 +1872,8 @@ static void TryAllocateOnebyteString(Assembler* assembler, |
Label* ok, |
Label* failure, |
Register length_reg) { |
- __ MaybeTraceAllocation(kOneByteStringCid, EAX, failure, false); |
+ __ MaybeTraceAllocation(kOneByteStringCid, EAX, failure, false, |
+ /* inline_isolate = */ false); |
if (length_reg != EDI) { |
__ movl(EDI, length_reg); |
} |
@@ -1880,11 +1884,10 @@ static void TryAllocateOnebyteString(Assembler* assembler, |
__ leal(EDI, Address(EDI, TIMES_1, fixed_size)); // EDI is untagged. |
__ andl(EDI, Immediate(-kObjectAlignment)); |
- Isolate* isolate = Isolate::Current(); |
- Heap* heap = isolate->heap(); |
const intptr_t cid = kOneByteStringCid; |
- Heap::Space space = heap->SpaceForAllocation(cid); |
- __ movl(EAX, Address::Absolute(heap->TopAddress(space))); |
+ Heap::Space space = Heap::SpaceForAllocation(cid); |
+ __ movl(ECX, Address(THR, Thread::heap_offset())); |
+ __ movl(EAX, Address(ECX, Heap::TopOffset(space))); |
__ movl(EBX, EAX); |
// EDI: allocation size. |
@@ -1895,15 +1898,17 @@ static void TryAllocateOnebyteString(Assembler* assembler, |
// EAX: potential new object start. |
// EBX: potential next object start. |
// EDI: allocation size. |
- __ cmpl(EBX, Address::Absolute(heap->EndAddress(space))); |
+ // ECX: heap. |
+ __ cmpl(EBX, Address(ECX, Heap::EndOffset(space))); |
__ j(ABOVE_EQUAL, &pop_and_fail); |
// Successfully allocated the object(s), now update top to point to |
// next object start and initialize the object. |
- __ movl(Address::Absolute(heap->TopAddress(space)), EBX); |
+ __ movl(Address(ECX, Heap::TopOffset(space)), EBX); |
__ addl(EAX, Immediate(kHeapObjectTag)); |
- __ UpdateAllocationStatsWithSize(cid, EDI, kNoRegister, space); |
+ __ UpdateAllocationStatsWithSize(cid, EDI, ECX, space, |
+ /* inline_isolate = */ false); |
// Initialize the tags. |
// EAX: new object start as a tagged pointer. |