OpenJDK 11: Adding Unsafe new intrinsics for AtomicIntegerFieldUpdater
Adding native implementation for:
jdk.internal.misc.Unsafe.compareAndSetInt
Adding intrinsics for:
jdk.internal.misc.Unsafe.compareAndSetInt
jdk.internal.misc.Unsafe.getIntAcquire
jdk.internal.misc.Unsafe.putIntRelease
Test: m
Test: art/test/testrunner/testrunner.py -t 2235-JdkUnsafeTest
Bug: 188889082
Bug: 190791083
Change-Id: Iba4a66d29ad27e269a7be0d5d5c8397755040784
diff --git a/compiler/optimizing/intrinsics_arm_vixl.cc b/compiler/optimizing/intrinsics_arm_vixl.cc
index aaa03bd..d007c99 100644
--- a/compiler/optimizing/intrinsics_arm_vixl.cc
+++ b/compiler/optimizing/intrinsics_arm_vixl.cc
@@ -2910,6 +2910,15 @@
invoke, codegen_, DataType::Type::kInt32, std::memory_order_seq_cst, /*atomic=*/ true);
}
+void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafeGetAcquire(HInvoke* invoke) {
+ CreateUnsafeGetLocations(invoke, codegen_, DataType::Type::kInt32, /*atomic=*/ true);
+}
+
+void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeGetAcquire(HInvoke* invoke) {
+ GenUnsafeGet(
+ invoke, codegen_, DataType::Type::kInt32, std::memory_order_acquire, /*atomic=*/ true);
+}
+
void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafeGetLong(HInvoke* invoke) {
CreateUnsafeGetLocations(invoke, codegen_, DataType::Type::kInt64, /*atomic=*/ false);
}
@@ -3201,6 +3210,19 @@
/*atomic=*/ true,
codegen_);
}
+
+void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafePutRelease(HInvoke* invoke) {
+ CreateUnsafePutLocations(invoke, codegen_, DataType::Type::kInt32, /*atomic=*/ true);
+}
+
+void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafePutRelease(HInvoke* invoke) {
+ GenUnsafePut(invoke,
+ DataType::Type::kInt32,
+ std::memory_order_release,
+ /*atomic=*/ true,
+ codegen_);
+}
+
void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafePutObject(HInvoke* invoke) {
CreateUnsafePutLocations(invoke, codegen_, DataType::Type::kReference, /*atomic=*/ false);
}
@@ -3697,12 +3719,18 @@
CreateUnsafeCASLocations(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARMVIXL::VisitJdkUnsafeCompareAndSetInt(HInvoke* invoke) {
+ CreateUnsafeCASLocations(allocator_, invoke);
+}
void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeCASInt(HInvoke* invoke) {
GenUnsafeCas(invoke, DataType::Type::kInt32, codegen_);
}
void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeCASObject(HInvoke* invoke) {
GenUnsafeCas(invoke, DataType::Type::kReference, codegen_);
}
+void IntrinsicCodeGeneratorARMVIXL::VisitJdkUnsafeCompareAndSetInt(HInvoke* invoke) {
+ GenUnsafeCas(invoke, DataType::Type::kInt32, codegen_);
+}
enum class GetAndUpdateOp {
kSet,