Index: runtime/vm/intrinsifier_ia32.cc |
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc |
index 6b4b5d281f0ad52fabeb1222f156ce9a27431e5c..db5cd358d687fdeb8137211d7d076fea507bf483 100644 |
--- a/runtime/vm/intrinsifier_ia32.cc |
+++ b/runtime/vm/intrinsifier_ia32.cc |
@@ -1739,6 +1739,53 @@ void Intrinsifier::TwoByteString_equality(Assembler* assembler) { |
StringEquality(assembler, kTwoByteStringCid); |
} |
+ |
+// On stack: user tag (+1), return-address (+0). |
+void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) { |
+ // EBX: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ leal(EBX, Address::Absolute(reinterpret_cast<uword>(isolate))); |
srdjan
2014/04/14 15:08:27
Couldn't you get the address of current_tag here d
zra
2014/04/14 15:31:29
At least on ARM and MIPS, I don't think it would s
Cutch
2014/04/15 14:36:43
Done on IA32.
|
+ // EAX: UserTag. |
+ __ movl(EAX, Address(ESP, + 1 * kWordSize)); |
+ // Set Isolate::current_tag_. |
+ __ movl(Address(EBX, Isolate::current_tag_offset()), EAX); |
+ // EAX: UserTag's tag. |
+ __ movl(EAX, FieldAddress(EAX, UserTag::tag_offset())); |
+ // Set Isolate::user_tag_. |
+ __ movl(Address(EBX, Isolate::user_tag_offset()), 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) { |
+ // EBX: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ leal(EBX, Address::Absolute(reinterpret_cast<uword>(isolate))); |
+ // Set return value to Isolate::current_tag_. |
+ __ movl(EAX, Address(EBX, Isolate::current_tag_offset())); |
+ __ ret(); |
+} |
+ |
+ |
+void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) { |
+ // EBX: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ leal(EBX, Address::Absolute(reinterpret_cast<uword>(isolate))); |
+ // Set return value to Isolate::current_tag_. |
+ __ movl(EAX, Address(EBX, Isolate::current_tag_offset())); |
+ // Clear Isolate::current_tag_. |
+ const Immediate& raw_null = |
+ Immediate(reinterpret_cast<int32_t>(UserTag::null())); |
+ __ movl(Address(EBX, Isolate::current_tag_offset()), raw_null); |
+ // Clear Isolate::user_tag_. |
+ __ movl(Address(EBX, Isolate::user_tag_offset()), Immediate(0)); |
+ __ ret(); |
+} |
+ |
#undef __ |
} // namespace dart |