| Index: runtime/vm/intrinsifier_ia32.cc
|
| diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
|
| index c334b91a3ec80366bb01f7e6ed65db91d371d1dc..5777e84fb3740456c9b35bd973708e98f857a66a 100644
|
| --- a/runtime/vm/intrinsifier_ia32.cc
|
| +++ b/runtime/vm/intrinsifier_ia32.cc
|
| @@ -129,6 +129,7 @@ void Intrinsifier::List_Allocate(Assembler* assembler) {
|
| __ addl(EDI, Immediate(kWordSize));
|
| __ jmp(&init_loop, Assembler::kNearJump);
|
| __ Bind(&done);
|
| + __ BumpAllocationCount(kArrayCid, EBX);
|
| __ ret(); // returns the newly allocated object in EAX.
|
|
|
| __ Bind(&fall_through);
|
| @@ -303,6 +304,7 @@ void Intrinsifier::GrowableList_Allocate(Assembler* assembler) {
|
| // Set the length field in the growable array object to 0.
|
| __ movl(FieldAddress(EAX, GrowableObjectArray::length_offset()),
|
| Immediate(0));
|
| + __ BumpAllocationCount(kGrowableObjectArrayCid, EBX);
|
| __ ret(); // returns the newly allocated object in EAX.
|
|
|
| __ Bind(&fall_through);
|
| @@ -535,7 +537,7 @@ void Intrinsifier::GrowableList_add(Assembler* assembler) {
|
| __ addl(EDI, Immediate(kWordSize)); \
|
| __ jmp(&init_loop, Assembler::kNearJump); \
|
| __ Bind(&done); \
|
| - \
|
| + __ BumpAllocationCount(cid, EBX); \
|
| __ ret(); \
|
| __ Bind(&fall_through); \
|
|
|
| @@ -872,12 +874,15 @@ void Intrinsifier::Integer_shl(Assembler* assembler) {
|
| __ xorl(EDI, EDI);
|
| __ shld(EDI, EAX);
|
| // Result in EDI (high) and EBX (low).
|
| + __ pushl(EBX);
|
| const Class& mint_class = Class::Handle(
|
| Isolate::Current()->object_store()->mint_class());
|
| __ TryAllocate(mint_class,
|
| &fall_through,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX,
|
| + EBX); // Result register.
|
| + __ popl(EBX);
|
| // EBX and EDI are not objects but integer values.
|
| __ movl(FieldAddress(EAX, Mint::value_offset()), EBX);
|
| __ movl(FieldAddress(EAX, Mint::value_offset() + kWordSize), EDI);
|
| @@ -1198,7 +1203,8 @@ static void DoubleArithmeticOperations(Assembler* assembler, Token::Kind kind) {
|
| __ TryAllocate(double_class,
|
| &fall_through,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX, // Result register.
|
| + EBX);
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| @@ -1243,7 +1249,8 @@ void Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
|
| __ TryAllocate(double_class,
|
| &fall_through,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX, // Result register.
|
| + EBX);
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| @@ -1263,7 +1270,8 @@ void Intrinsifier::Double_fromInteger(Assembler* assembler) {
|
| __ TryAllocate(double_class,
|
| &fall_through,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX, // Result register.
|
| + EBX);
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&fall_through);
|
| @@ -1336,7 +1344,8 @@ void Intrinsifier::Math_sqrt(Assembler* assembler) {
|
| __ TryAllocate(double_class,
|
| &fall_through,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX, // Result register.
|
| + EBX);
|
| __ movsd(FieldAddress(EAX, Double::value_offset()), XMM0);
|
| __ ret();
|
| __ Bind(&is_smi);
|
| @@ -1372,7 +1381,8 @@ static void EmitTrigonometric(Assembler* assembler,
|
| __ TryAllocate(double_class,
|
| &alloc_failed,
|
| Assembler::kNearJump,
|
| - EAX); // Result register.
|
| + EAX, // Result register.
|
| + EBX);
|
| __ fstpl(FieldAddress(EAX, Double::value_offset()));
|
| __ ret();
|
|
|
| @@ -1660,6 +1670,7 @@ static void TryAllocateOnebyteString(Assembler* assembler,
|
| EDI);
|
| // Clear hash.
|
| __ movl(FieldAddress(EAX, String::hash_offset()), Immediate(0));
|
| + __ BumpAllocationCount(kOneByteStringCid, EBX);
|
| __ jmp(ok, Assembler::kNearJump);
|
|
|
| __ Bind(&pop_and_fail);
|
|
|