From 3c30abbab7970967f72a56999d82db1737a8ff52 Mon Sep 17 00:00:00 2001 From: Reka Kovacs Date: Mon, 30 Aug 2021 14:50:02 +0200 Subject: [PATCH] Backport 88ee973334e6a155719bd2486da73567d59a7f1e --- make/autoconf/hotspot.m4 | 5 +++-- .../cpu/aarch64/jvmciCodeInstaller_aarch64.cpp | 1 + .../AArch64HotSpotJVMCIBackendFactory.java | 6 +++++- .../aarch64/AArch64HotSpotRegisterConfig.java | 18 ++++++++++++++---- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/make/autoconf/hotspot.m4 b/make/autoconf/hotspot.m4 index a4c700e2c34..3aaa099738e 100644 --- a/make/autoconf/hotspot.m4 +++ b/make/autoconf/hotspot.m4 @@ -413,7 +413,7 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES], # Only enable jvmci on x86_64, sparcv9 and aarch64 if test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \ test "x$OPENJDK_TARGET_CPU" = "xsparcv9" || \ - test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-aarch64" ; then + test "x$OPENJDK_TARGET_CPU" = "xaarch64" ; then AC_MSG_RESULT([yes]) JVM_FEATURES_jvmci="jvmci" INCLUDE_JVMCI="true" @@ -444,10 +444,11 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES], JVM_FEATURES_graal="graal" INCLUDE_GRAAL="true" else - # By default enable graal build on x64 or where AOT is available. + # By default enable graal build on x64/aarch64 or where AOT is available. # graal build requires jvmci. if test "x$JVM_FEATURES_jvmci" = "xjvmci" && \ (test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \ + test "x$OPENJDK_TARGET_CPU" = "xaarch64" || \ test "x$ENABLE_AOT" = "xtrue") ; then AC_MSG_RESULT([yes]) JVM_FEATURES_graal="graal" diff --git a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp index e477ca52ee2..0b928f2eec0 100644 --- a/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp +++ b/src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp @@ -21,6 +21,7 @@ * questions. */ +#include "precompiled.hpp" #include "asm/macroAssembler.hpp" #include "jvmci/jvmciCodeInstaller.hpp" #include "jvmci/jvmciRuntime.hpp" diff --git a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java index f9eb5fa39ff..d804b527b94 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotJVMCIBackendFactory.java @@ -128,7 +128,11 @@ protected HotSpotConstantReflectionProvider createConstantReflection(HotSpotJVMC } protected RegisterConfig createRegisterConfig(AArch64HotSpotVMConfig config, TargetDescription target) { - return new AArch64HotSpotRegisterConfig(target, config.useCompressedOops); + // ARMv8 defines r18 as being available to the platform ABI. Windows + // and Darwin use it for such. Linux doesn't assign it and thus r18 can + // be used as an additional register. + boolean canUsePlatformRegister = config.linuxOs; + return new AArch64HotSpotRegisterConfig(target, config.useCompressedOops, canUsePlatformRegister); } protected HotSpotCodeCacheProvider createCodeCache(HotSpotJVMCIRuntime runtime, TargetDescription target, RegisterConfig regConfig) { diff --git a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java index 5a9cadc9128..56f744a93fb 100644 --- a/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java +++ b/src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot.aarch64/src/jdk/vm/ci/hotspot/aarch64/AArch64HotSpotRegisterConfig.java @@ -34,6 +34,7 @@ import static jdk.vm.ci.aarch64.AArch64.rscratch1; import static jdk.vm.ci.aarch64.AArch64.rscratch2; import static jdk.vm.ci.aarch64.AArch64.r12; +import static jdk.vm.ci.aarch64.AArch64.r18; import static jdk.vm.ci.aarch64.AArch64.r27; import static jdk.vm.ci.aarch64.AArch64.r28; import static jdk.vm.ci.aarch64.AArch64.r29; @@ -122,6 +123,12 @@ public RegisterAttributes[] getAttributesMap() { */ public static final Register metaspaceMethodRegister = r12; + /** + * The platform ABI can use r18 to carry inter-procedural state (e.g. thread + * context). If not defined as such by the platform ABI, it can be used as + * additional temporary register. + */ + public static final Register platformRegister = r18; public static final Register heapBaseRegister = r27; public static final Register threadRegister = r28; public static final Register fp = r29; @@ -129,9 +136,9 @@ public RegisterAttributes[] getAttributesMap() { private static final RegisterArray reservedRegisters = new RegisterArray(rscratch1, rscratch2, threadRegister, fp, lr, r31, zr, sp); - private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase) { + private static RegisterArray initAllocatable(Architecture arch, boolean reserveForHeapBase, boolean canUsePlatformRegister) { RegisterArray allRegisters = arch.getAvailableValueRegisters(); - Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0)]; + Register[] registers = new Register[allRegisters.size() - reservedRegisters.size() - (reserveForHeapBase ? 1 : 0) - (!canUsePlatformRegister ? 1 : 0)]; List reservedRegistersList = reservedRegisters.asList(); int idx = 0; @@ -140,6 +147,9 @@ private static RegisterArray initAllocatable(Architecture arch, boolean reserveF // skip reserved registers continue; } + if (!canUsePlatformRegister && reg.equals(platformRegister)) { + continue; + } assert !(reg.equals(threadRegister) || reg.equals(fp) || reg.equals(lr) || reg.equals(r31) || reg.equals(zr) || reg.equals(sp)); if (reserveForHeapBase && reg.equals(heapBaseRegister)) { // skip heap base register @@ -153,8 +163,8 @@ private static RegisterArray initAllocatable(Architecture arch, boolean reserveF return new RegisterArray(registers); } - public AArch64HotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops) { - this(target, initAllocatable(target.arch, useCompressedOops)); + public AArch64HotSpotRegisterConfig(TargetDescription target, boolean useCompressedOops, boolean canUsePlatformRegister) { + this(target, initAllocatable(target.arch, useCompressedOops, canUsePlatformRegister)); assert callerSaved.size() >= allocatable.size(); }