| From 9a3c2a0714420186ae8d5159d5416c6fa2009ad9 Mon Sep 17 00:00:00 2001 |
| From: Alexey Brodkin <abrodkin@synopsys.com> |
| Date: Mon, 18 Oct 2021 05:20:05 -0700 |
| Subject: [PATCH] Add ARCv2 ISA processors support to Zero |
| |
| This adds ARCv2 processors support in OpenJDK via |
| "Zero Assembly Project" (see https://openjdk.java.net/projects/zero). |
| |
| That' a purely interpretive mode, so likely not that fast |
| as JIT'ed version, but for starters it's much better than nothing. |
| |
| Once all the logistical problems are solved hopefully this |
| change will be accepted upstream. |
| |
| Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com> |
| --- |
| make/autoconf/libraries.m4 | 8 ++++++++ |
| make/autoconf/platform.m4 | 8 ++++++++ |
| src/hotspot/os/linux/os_linux.cpp | 8 +++++++- |
| 3 files changed, 23 insertions(+), 1 deletion(-) |
| |
| diff --git a/make/autoconf/libraries.m4 b/make/autoconf/libraries.m4 |
| index 5120918aed2..f7a99955874 100644 |
| --- a/make/autoconf/libraries.m4 |
| +++ b/make/autoconf/libraries.m4 |
| @@ -163,6 +163,14 @@ AC_DEFUN_ONCE([LIB_SETUP_LIBRARIES], |
| BASIC_JVM_LIBS="$BASIC_JVM_LIBS -lrt" |
| fi |
| |
| + # Libatomic library |
| + # 32-bit ARC needs fallback library for 8-byte atomic ops |
| + # Inspired by a fix for MIPS, see https://github.com/openjdk/jdk/commit/1b3aa3af |
| + if test "x$OPENJDK_TARGET_OS" = xlinux && |
| + (test "x$OPENJDK_TARGET_CPU" = xarc); then |
| + BASIC_JVM_LIBS="$BASIC_JVM_LIBS -latomic" |
| + fi |
| + |
| # perfstat lib |
| if test "x$OPENJDK_TARGET_OS" = xaix; then |
| BASIC_JVM_LIBS="$BASIC_JVM_LIBS -lperfstat" |
| diff --git a/make/autoconf/platform.m4 b/make/autoconf/platform.m4 |
| index c0f2446dbd7..dc416ece885 100644 |
| --- a/make/autoconf/platform.m4 |
| +++ b/make/autoconf/platform.m4 |
| @@ -54,6 +54,12 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_CPU], |
| VAR_CPU_BITS=64 |
| VAR_CPU_ENDIAN=little |
| ;; |
| + arc) |
| + VAR_CPU=arc |
| + VAR_CPU_ARCH=arc |
| + VAR_CPU_BITS=32 |
| + VAR_CPU_ENDIAN=little |
| + ;; |
| arm*) |
| VAR_CPU=arm |
| VAR_CPU_ARCH=arm |
| @@ -571,6 +577,8 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER], |
| HOTSPOT_$1_CPU_DEFINE=RISCV64 |
| |
| # The cpu defines below are for zero, we don't support them directly. |
| + elif test "x$OPENJDK_$1_CPU" = xarc; then |
| + HOTSPOT_$1_CPU_DEFINE=ARC |
| elif test "x$OPENJDK_$1_CPU" = xsparc; then |
| HOTSPOT_$1_CPU_DEFINE=SPARC |
| elif test "x$OPENJDK_$1_CPU" = xppc; then |
| diff --git a/src/hotspot/os/linux/os_linux.cpp b/src/hotspot/os/linux/os_linux.cpp |
| index b08caf4d5d3..2bf084895ba 100644 |
| --- a/src/hotspot/os/linux/os_linux.cpp |
| +++ b/src/hotspot/os/linux/os_linux.cpp |
| @@ -1653,6 +1653,9 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { |
| #ifndef EM_AARCH64 |
| #define EM_AARCH64 183 /* ARM AARCH64 */ |
| #endif |
| +#ifndef EM_ARC_COMPACT2 |
| + #define EM_ARC_COMPACT2 195 /* ARC ARCv2 ISA */ |
| +#endif |
| #ifndef EM_RISCV |
| #define EM_RISCV 243 /* RISC-V */ |
| #endif |
| @@ -1677,6 +1680,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { |
| {EM_SH, EM_SH, ELFCLASS32, ELFDATA2MSB, (char*)"SuperH BE"}, |
| #endif |
| {EM_ARM, EM_ARM, ELFCLASS32, ELFDATA2LSB, (char*)"ARM"}, |
| + {EM_ARC_COMPACT2, EM_ARC_COMPACT2, ELFCLASS32, ELFDATA2LSB, (char*)"ARC"}, |
| // we only support 64 bit z architecture |
| {EM_S390, EM_S390, ELFCLASS64, ELFDATA2MSB, (char*)"IBM System/390"}, |
| {EM_ALPHA, EM_ALPHA, ELFCLASS64, ELFDATA2LSB, (char*)"Alpha"}, |
| @@ -1709,6 +1713,8 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { |
| static Elf32_Half running_arch_code=EM_PPC; |
| #elif (defined AARCH64) |
| static Elf32_Half running_arch_code=EM_AARCH64; |
| +#elif (defined ARC) |
| + static Elf32_Half running_arch_code=EM_ARC_COMPACT2; |
| #elif (defined ARM) |
| static Elf32_Half running_arch_code=EM_ARM; |
| #elif (defined S390) |
| @@ -1731,7 +1737,7 @@ void * os::dll_load(const char *filename, char *ebuf, int ebuflen) { |
| static Elf32_Half running_arch_code=EM_LOONGARCH; |
| #else |
| #error Method os::dll_load requires that one of following is defined:\ |
| - AARCH64, ALPHA, ARM, AMD64, IA32, IA64, LOONGARCH64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, RISCV, S390, SH, __sparc |
| + AARCH64, ALPHA, ARC, ARM, AMD64, IA32, IA64, LOONGARCH64, M68K, MIPS, MIPSEL, PARISC, __powerpc__, __powerpc64__, RISCV, S390, SH, __sparc |
| #endif |
| |
| // Identify compatibility class for VM's architecture and library's architecture |
| -- |
| 2.16.2 |
| |