Index: runtime/vm/intrinsifier_arm.cc |
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc |
index 1b29a2b4e1bbd5106fdceaec17a0045227f8121a..84ef39bb03e1ce0d7c797a99eec9137a2590fd03 100644 |
--- a/runtime/vm/intrinsifier_arm.cc |
+++ b/runtime/vm/intrinsifier_arm.cc |
@@ -1707,6 +1707,52 @@ void Intrinsifier::TwoByteString_equality(Assembler* assembler) { |
} |
+// On stack: user tag (+0). |
+void Intrinsifier::UserTag_makeCurrent(Assembler* assembler) { |
+ // R1: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ LoadImmediate(R1, reinterpret_cast<uword>(isolate)); |
+ // R0: UserTag. |
+ __ ldr(R0, Address(SP, + 0 * kWordSize)); |
+ // Set Isolate::current_tag_. |
+ __ str(R0, Address(R1, Isolate::current_tag_offset())); |
+ // R0: UserTag's tag. |
+ __ ldr(R0, FieldAddress(R0, UserTag::tag_offset())); |
+ // Set Isolate::user_tag_. |
+ __ str(R0, Address(R1, Isolate::user_tag_offset())); |
+ // Set return value. |
+ const int32_t raw_null = reinterpret_cast<int32_t>(Object::null()); |
+ __ LoadImmediate(R0, raw_null); |
+ __ Ret(); |
+} |
+ |
+ |
+void Intrinsifier::Profiler_getCurrentTag(Assembler* assembler) { |
+ // R1: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ LoadImmediate(R1, reinterpret_cast<uword>(isolate)); |
+ // Set return value to Isolate::current_tag_. |
+ __ ldr(R0, Address(R1, Isolate::current_tag_offset())); |
+ __ Ret(); |
+} |
+ |
+ |
+void Intrinsifier::Profiler_clearCurrentTag(Assembler* assembler) { |
+ // R1: Isolate. |
+ Isolate* isolate = Isolate::Current(); |
+ __ LoadImmediate(R1, reinterpret_cast<uword>(isolate)); |
+ // Set return value to Isolate::current_tag_. |
+ __ ldr(R0, Address(R1, Isolate::current_tag_offset())); |
+ // Clear Isolate::current_tag_. |
+ const int32_t raw_null = reinterpret_cast<int32_t>(UserTag::null()); |
+ __ LoadImmediate(R2, raw_null); |
+ __ str(R2, Address(R1, Isolate::current_tag_offset())); |
+ // Clear Isolate::user_tag_. |
+ __ eor(R2, R2, ShifterOperand(R2)); |
+ __ str(R2, Address(R1, Isolate::user_tag_offset())); |
+ __ Ret(); |
+} |
+ |
} // namespace dart |
#endif // defined TARGET_ARCH_ARM |