MIPS: java.lang.Thread.interrupted() intrinsic
Test: Boot 32-/64-bit QEMU
Test: testrunner.py --target --optimizing --32 -t 050-sync-test
Test: testrunner.py --target --optimizing --64 -t 050-sync-test
Test: testrunner.py --target --optimizing --32 -t 988-method-trace
Test: testrunner.py --target --optimizing --64 -t 988-method-trace
Change-Id: Ic384a8e9af3b97ae85f5f04a4c114731e83244a6
diff --git a/compiler/optimizing/intrinsics_mips64.cc b/compiler/optimizing/intrinsics_mips64.cc
index 512fb68..f629134 100644
--- a/compiler/optimizing/intrinsics_mips64.cc
+++ b/compiler/optimizing/intrinsics_mips64.cc
@@ -2586,6 +2586,26 @@
}
}
+// static boolean java.lang.Thread.interrupted()
+void IntrinsicLocationsBuilderMIPS64::VisitThreadInterrupted(HInvoke* invoke) {
+ LocationSummary* locations =
+ new (allocator_) LocationSummary(invoke, LocationSummary::kNoCall, kIntrinsified);
+ locations->SetOut(Location::RequiresRegister());
+}
+
+void IntrinsicCodeGeneratorMIPS64::VisitThreadInterrupted(HInvoke* invoke) {
+ Mips64Assembler* assembler = GetAssembler();
+ GpuRegister out = invoke->GetLocations()->Out().AsRegister<GpuRegister>();
+ int32_t offset = Thread::InterruptedOffset<kMips64PointerSize>().Int32Value();
+ __ LoadFromOffset(kLoadWord, out, TR, offset);
+ Mips64Label done;
+ __ Beqzc(out, &done);
+ __ Sync(0);
+ __ StoreToOffset(kStoreWord, ZERO, TR, offset);
+ __ Sync(0);
+ __ Bind(&done);
+}
+
UNIMPLEMENTED_INTRINSIC(MIPS64, ReferenceGetReferent)
UNIMPLEMENTED_INTRINSIC(MIPS64, SystemArrayCopy)
@@ -2605,8 +2625,6 @@
UNIMPLEMENTED_INTRINSIC(MIPS64, UnsafeGetAndSetLong)
UNIMPLEMENTED_INTRINSIC(MIPS64, UnsafeGetAndSetObject)
-UNIMPLEMENTED_INTRINSIC(MIPS64, ThreadInterrupted)
-
UNREACHABLE_INTRINSICS(MIPS64)
#undef __