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 __