Adding get/put and compare-and-set methods to Unsafe
As they are needed for the update of java.util.concurrent to
11+28, the native implementation and intrinsics for the following methods have
been added to jdk.internal.misc.Unsafe:
jdk.internal.misc.Unsafe.compareAndSetLong
jdk.internal.misc.Unsafe.compareAndSetObject
jdk.internal.misc.Unsafe.getLongAcquire
jdk.internal.misc.Unsafe.putLongRelease
jdk.internal.misc.Unsafe.getObjectAcquire
jdk.internal.misc.Unsafe.putObjectRelease
Test: m
Test: art/test/testrunner/testrunner.py -t 2235-JdkUnsafeTest
Bug: 188889082
Bug: 190791083
Change-Id: Iacd39ea1750c92a828d99241bff6b609acadb025
diff --git a/compiler/optimizing/intrinsics_arm64.cc b/compiler/optimizing/intrinsics_arm64.cc
index 3c4260f..e8a0924 100644
--- a/compiler/optimizing/intrinsics_arm64.cc
+++ b/compiler/optimizing/intrinsics_arm64.cc
@@ -739,12 +739,22 @@
}
}
+static bool UnsafeGetIntrinsicOnCallList(Intrinsics intrinsic) {
+ switch (intrinsic) {
+ case Intrinsics::kUnsafeGetObject:
+ case Intrinsics::kUnsafeGetObjectVolatile:
+ case Intrinsics::kJdkUnsafeGetObject:
+ case Intrinsics::kJdkUnsafeGetObjectVolatile:
+ case Intrinsics::kJdkUnsafeGetObjectAcquire:
+ return true;
+ default:
+ break;
+ }
+ return false;
+}
+
static void CreateIntIntIntToIntLocations(ArenaAllocator* allocator, HInvoke* invoke) {
- bool can_call = kEmitCompilerReadBarrier &&
- (invoke->GetIntrinsic() == Intrinsics::kUnsafeGetObject ||
- invoke->GetIntrinsic() == Intrinsics::kUnsafeGetObjectVolatile ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObject ||
- invoke->GetIntrinsic() == Intrinsics::kJdkUnsafeGetObjectVolatile);
+ bool can_call = kEmitCompilerReadBarrier && UnsafeGetIntrinsicOnCallList(invoke->GetIntrinsic());
LocationSummary* locations =
new (allocator) LocationSummary(invoke,
can_call
@@ -798,12 +808,18 @@
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeGetLongVolatile(HInvoke* invoke) {
CreateIntIntIntToIntLocations(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeGetLongAcquire(HInvoke* invoke) {
+ CreateIntIntIntToIntLocations(allocator_, invoke);
+}
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeGetObject(HInvoke* invoke) {
CreateIntIntIntToIntLocations(allocator_, invoke);
}
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeGetObjectVolatile(HInvoke* invoke) {
CreateIntIntIntToIntLocations(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeGetObjectAcquire(HInvoke* invoke) {
+ CreateIntIntIntToIntLocations(allocator_, invoke);
+}
void IntrinsicCodeGeneratorARM64::VisitUnsafeGet(HInvoke* invoke) {
VisitJdkUnsafeGet(invoke);
@@ -839,12 +855,18 @@
void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeGetLongVolatile(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeGetLongAcquire(HInvoke* invoke) {
+ GenUnsafeGet(invoke, DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
+}
void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeGetObject(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ false, codegen_);
}
void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeGetObjectVolatile(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeGetObjectAcquire(HInvoke* invoke) {
+ GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
+}
static void CreateIntIntIntIntToVoid(ArenaAllocator* allocator, HInvoke* invoke) {
LocationSummary* locations =
@@ -904,6 +926,9 @@
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafePutObjectVolatile(HInvoke* invoke) {
CreateIntIntIntIntToVoid(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARM64::VisitJdkUnsafePutObjectRelease(HInvoke* invoke) {
+ CreateIntIntIntIntToVoid(allocator_, invoke);
+}
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafePutLong(HInvoke* invoke) {
CreateIntIntIntIntToVoid(allocator_, invoke);
}
@@ -913,6 +938,9 @@
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafePutLongVolatile(HInvoke* invoke) {
CreateIntIntIntIntToVoid(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARM64::VisitJdkUnsafePutLongRelease(HInvoke* invoke) {
+ CreateIntIntIntIntToVoid(allocator_, invoke);
+}
static void GenUnsafePut(HInvoke* invoke,
DataType::Type type,
@@ -1031,6 +1059,13 @@
/*is_ordered=*/ false,
codegen_);
}
+void IntrinsicCodeGeneratorARM64::VisitJdkUnsafePutObjectRelease(HInvoke* invoke) {
+ GenUnsafePut(invoke,
+ DataType::Type::kReference,
+ /*is_volatile=*/ true,
+ /*is_ordered=*/ false,
+ codegen_);
+}
void IntrinsicCodeGeneratorARM64::VisitJdkUnsafePutLong(HInvoke* invoke) {
GenUnsafePut(invoke,
DataType::Type::kInt64,
@@ -1052,6 +1087,13 @@
/*is_ordered=*/ false,
codegen_);
}
+void IntrinsicCodeGeneratorARM64::VisitJdkUnsafePutLongRelease(HInvoke* invoke) {
+ GenUnsafePut(invoke,
+ DataType::Type::kInt64,
+ /*is_volatile=*/ true,
+ /*is_ordered=*/ false,
+ codegen_);
+}
static void CreateUnsafeCASLocations(ArenaAllocator* allocator, HInvoke* invoke) {
bool can_call = kEmitCompilerReadBarrier &&
@@ -1497,6 +1539,9 @@
void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeCompareAndSetInt(HInvoke* invoke) {
CreateUnsafeCASLocations(allocator_, invoke);
}
+void IntrinsicLocationsBuilderARM64::VisitJdkUnsafeCompareAndSetLong(HInvoke* invoke) {
+ CreateUnsafeCASLocations(allocator_, invoke);
+}
void IntrinsicCodeGeneratorARM64::VisitUnsafeCASInt(HInvoke* invoke) {
VisitJdkUnsafeCASInt(invoke);
@@ -1520,6 +1565,9 @@
void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeCompareAndSetInt(HInvoke* invoke) {
GenUnsafeCas(invoke, DataType::Type::kInt32, codegen_);
}
+void IntrinsicCodeGeneratorARM64::VisitJdkUnsafeCompareAndSetLong(HInvoke* invoke) {
+ GenUnsafeCas(invoke, DataType::Type::kInt64, codegen_);
+}
enum class GetAndUpdateOp {
kSet,
@@ -5575,6 +5623,7 @@
UNIMPLEMENTED_INTRINSIC(ARM64, JdkUnsafeGetAndSetInt)
UNIMPLEMENTED_INTRINSIC(ARM64, JdkUnsafeGetAndSetLong)
UNIMPLEMENTED_INTRINSIC(ARM64, JdkUnsafeGetAndSetObject)
+UNIMPLEMENTED_INTRINSIC(ARM64, JdkUnsafeCompareAndSetObject)
UNREACHABLE_INTRINSICS(ARM64)