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_x86.cc b/compiler/optimizing/intrinsics_x86.cc
index 16457f5..5e55a1b 100644
--- a/compiler/optimizing/intrinsics_x86.cc
+++ b/compiler/optimizing/intrinsics_x86.cc
@@ -1692,15 +1692,25 @@
}
}
+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,
DataType::Type type,
bool is_volatile) {
- 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
@@ -1784,6 +1794,9 @@
void IntrinsicLocationsBuilderX86::VisitJdkUnsafeGetLongVolatile(HInvoke* invoke) {
CreateIntIntIntToIntLocations(allocator_, invoke, DataType::Type::kInt64, /*is_volatile=*/ true);
}
+void IntrinsicLocationsBuilderX86::VisitJdkUnsafeGetLongAcquire(HInvoke* invoke) {
+ CreateIntIntIntToIntLocations(allocator_, invoke, DataType::Type::kInt64, /*is_volatile=*/ true);
+}
void IntrinsicLocationsBuilderX86::VisitJdkUnsafeGetObject(HInvoke* invoke) {
CreateIntIntIntToIntLocations(
allocator_, invoke, DataType::Type::kReference, /*is_volatile=*/ false);
@@ -1792,6 +1805,10 @@
CreateIntIntIntToIntLocations(
allocator_, invoke, DataType::Type::kReference, /*is_volatile=*/ true);
}
+void IntrinsicLocationsBuilderX86::VisitJdkUnsafeGetObjectAcquire(HInvoke* invoke) {
+ CreateIntIntIntToIntLocations(
+ allocator_, invoke, DataType::Type::kReference, /*is_volatile=*/ true);
+}
void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGet(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kInt32, /*is_volatile=*/ false, codegen_);
@@ -1808,12 +1825,18 @@
void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGetLongVolatile(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGetLongAcquire(HInvoke* invoke) {
+ GenUnsafeGet(invoke, DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
+}
void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGetObject(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ false, codegen_);
}
void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGetObjectVolatile(HInvoke* invoke) {
GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorX86::VisitJdkUnsafeGetObjectAcquire(HInvoke* invoke) {
+ GenUnsafeGet(invoke, DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
+}
static void CreateIntIntIntIntToVoidPlusTempsLocations(ArenaAllocator* allocator,
DataType::Type type,
@@ -1892,6 +1915,10 @@
CreateIntIntIntIntToVoidPlusTempsLocations(
allocator_, DataType::Type::kReference, invoke, /*is_volatile=*/ true);
}
+void IntrinsicLocationsBuilderX86::VisitJdkUnsafePutObjectRelease(HInvoke* invoke) {
+ CreateIntIntIntIntToVoidPlusTempsLocations(
+ allocator_, DataType::Type::kReference, invoke, /*is_volatile=*/ true);
+}
void IntrinsicLocationsBuilderX86::VisitJdkUnsafePutLong(HInvoke* invoke) {
CreateIntIntIntIntToVoidPlusTempsLocations(
allocator_, DataType::Type::kInt64, invoke, /*is_volatile=*/ false);
@@ -1904,6 +1931,10 @@
CreateIntIntIntIntToVoidPlusTempsLocations(
allocator_, DataType::Type::kInt64, invoke, /*is_volatile=*/ true);
}
+void IntrinsicLocationsBuilderX86::VisitJdkUnsafePutLongRelease(HInvoke* invoke) {
+ CreateIntIntIntIntToVoidPlusTempsLocations(
+ allocator_, DataType::Type::kInt64, invoke, /*is_volatile=*/ true);
+}
// We don't care for ordered: it requires an AnyStore barrier, which is already given by the x86
// memory model.
@@ -2005,6 +2036,10 @@
GenUnsafePut(
invoke->GetLocations(), DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorX86::VisitJdkUnsafePutObjectRelease(HInvoke* invoke) {
+ GenUnsafePut(
+ invoke->GetLocations(), DataType::Type::kReference, /*is_volatile=*/ true, codegen_);
+}
void IntrinsicCodeGeneratorX86::VisitJdkUnsafePutLong(HInvoke* invoke) {
GenUnsafePut(invoke->GetLocations(), DataType::Type::kInt64, /*is_volatile=*/ false, codegen_);
}
@@ -2014,6 +2049,9 @@
void IntrinsicCodeGeneratorX86::VisitJdkUnsafePutLongVolatile(HInvoke* invoke) {
GenUnsafePut(invoke->GetLocations(), DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
}
+void IntrinsicCodeGeneratorX86::VisitJdkUnsafePutLongRelease(HInvoke* invoke) {
+ GenUnsafePut(invoke->GetLocations(), DataType::Type::kInt64, /*is_volatile=*/ true, codegen_);
+}
static void CreateIntIntIntIntIntToInt(ArenaAllocator* allocator,
DataType::Type type,
@@ -2088,6 +2126,10 @@
CreateIntIntIntIntIntToInt(allocator_, DataType::Type::kInt32, invoke);
}
+void IntrinsicLocationsBuilderX86::VisitJdkUnsafeCompareAndSetLong(HInvoke* invoke) {
+ CreateIntIntIntIntIntToInt(allocator_, DataType::Type::kInt64, invoke);
+}
+
static void GenPrimitiveLockedCmpxchg(DataType::Type type,
CodeGeneratorX86* codegen,
Location expected_value,
@@ -2344,6 +2386,10 @@
GenCAS(DataType::Type::kInt32, invoke, codegen_);
}
+void IntrinsicCodeGeneratorX86::VisitJdkUnsafeCompareAndSetLong(HInvoke* invoke) {
+ GenCAS(DataType::Type::kInt64, invoke, codegen_);
+}
+
void IntrinsicLocationsBuilderX86::VisitIntegerReverse(HInvoke* invoke) {
LocationSummary* locations =
@@ -4744,6 +4790,7 @@
UNIMPLEMENTED_INTRINSIC(X86, JdkUnsafeGetAndSetInt)
UNIMPLEMENTED_INTRINSIC(X86, JdkUnsafeGetAndSetLong)
UNIMPLEMENTED_INTRINSIC(X86, JdkUnsafeGetAndSetObject)
+UNIMPLEMENTED_INTRINSIC(X86, JdkUnsafeCompareAndSetObject)
UNREACHABLE_INTRINSICS(X86)