Index: runtime/vm/intrinsifier_ia32.cc |
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc |
index 6b4b5d281f0ad52fabeb1222f156ce9a27431e5c..cbf7d003844c87a3eacb985952be25fb0a433533 100644 |
--- a/runtime/vm/intrinsifier_ia32.cc |
+++ b/runtime/vm/intrinsifier_ia32.cc |
@@ -1739,6 +1739,62 @@ void Intrinsifier::TwoByteString_equality(Assembler* assembler) { |
StringEquality(assembler, kTwoByteStringCid); |
} |
+ |
+// On stack: user tag (+1), return-address (+0). |
+void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) { |
+ Isolate* isolate = Isolate::Current(); |
+ const Address current_tag_addr = |
+ Address::Absolute(reinterpret_cast<uword>(isolate) + |
+ Isolate::current_tag_offset()); |
+ const Address user_tag_addr = |
+ Address::Absolute(reinterpret_cast<uword>(isolate) + |
+ Isolate::user_tag_offset()); |
+ // EAX: UserTag. |
+ __ movl(EAX, Address(ESP, + 1 * kWordSize)); |
+ // Set Isolate::current_tag_. |
+ __ movl(current_tag_addr, EAX); |
+ // EAX: UserTag's tag. |
+ __ movl(EAX, FieldAddress(EAX, UserTag::tag_offset())); |
+ // Set Isolate::user_tag_. |
+ __ movl(user_tag_addr, EAX); |
+ // Set return value. |
+ const Immediate& raw_null = |
+ Immediate(reinterpret_cast<int32_t>(Object::null())); |
+ __ movl(EAX, raw_null); |
+ __ ret(); |
+} |
+ |
+ |
+void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) { |
+ Isolate* isolate = Isolate::Current(); |
+ const Address current_tag_addr = |
+ Address::Absolute(reinterpret_cast<uword>(isolate) + |
+ Isolate::current_tag_offset()); |
+ // Set return value to Isolate::current_tag_. |
+ __ movl(EAX, current_tag_addr); |
+ __ ret(); |
+} |
+ |
+ |
+void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) { |
+ Isolate* isolate = Isolate::Current(); |
+ const Address current_tag_addr = |
+ Address::Absolute(reinterpret_cast<uword>(isolate) + |
+ Isolate::current_tag_offset()); |
+ const Address user_tag_addr = |
+ Address::Absolute(reinterpret_cast<uword>(isolate) + |
+ Isolate::user_tag_offset()); |
+ // Set return value to Isolate::current_tag_. |
+ __ movl(EAX, current_tag_addr); |
+ // Clear Isolate::current_tag_. |
+ const Immediate& raw_null = |
+ Immediate(reinterpret_cast<int32_t>(UserTag::null())); |
+ __ movl(current_tag_addr, raw_null); |
+ // Clear Isolate::user_tag_. |
+ __ movl(user_tag_addr, Immediate(0)); |
+ __ ret(); |
+} |
+ |
#undef __ |
} // namespace dart |