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); |