Update to aarch64-jdk8u162-b12 and aarch64-shenandoah-jdk8u162-b12
This commit is contained in:
parent
c30f1465ce
commit
4a7ca1fbfd
2
.gitignore
vendored
2
.gitignore
vendored
@ -106,3 +106,5 @@
|
||||
/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u161-b13.tar.xz
|
||||
/aarch64-port-jdk8u-aarch64-jdk8u161-b14.tar.xz
|
||||
/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u161-b14.tar.xz
|
||||
/aarch64-port-jdk8u-aarch64-jdk8u162-b12.tar.xz
|
||||
/aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u162-b12.tar.xz
|
||||
|
@ -1,472 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User mdoerr
|
||||
# Date 1507750779 -3600
|
||||
# Wed Oct 11 20:39:39 2017 +0100
|
||||
# Node ID 92f0dbe76a13992cc27188e0f68e4b1771c7004a
|
||||
# Parent 542c122b1d7d30c29189565248074aa28f21ae58
|
||||
8145913, PR3466, RH1498309: PPC64: add Montgomery multiply intrinsic
|
||||
Reviewed-by: aph, goetz
|
||||
|
||||
diff --git a/src/cpu/ppc/vm/assembler_ppc.hpp b/src/cpu/ppc/vm/assembler_ppc.hpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.hpp
|
||||
@@ -1180,6 +1180,8 @@
|
||||
inline void mullw_( Register d, Register a, Register b);
|
||||
inline void mulhw( Register d, Register a, Register b);
|
||||
inline void mulhw_( Register d, Register a, Register b);
|
||||
+ inline void mulhwu( Register d, Register a, Register b);
|
||||
+ inline void mulhwu_(Register d, Register a, Register b);
|
||||
inline void mulhd( Register d, Register a, Register b);
|
||||
inline void mulhd_( Register d, Register a, Register b);
|
||||
inline void mulhdu( Register d, Register a, Register b);
|
||||
diff --git a/src/cpu/ppc/vm/assembler_ppc.inline.hpp b/src/cpu/ppc/vm/assembler_ppc.inline.hpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/assembler_ppc.inline.hpp
|
||||
@@ -109,6 +109,8 @@
|
||||
inline void Assembler::mullw_( Register d, Register a, Register b) { emit_int32(MULLW_OPCODE | rt(d) | ra(a) | rb(b) | oe(0) | rc(1)); }
|
||||
inline void Assembler::mulhw( Register d, Register a, Register b) { emit_int32(MULHW_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); }
|
||||
inline void Assembler::mulhw_( Register d, Register a, Register b) { emit_int32(MULHW_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); }
|
||||
+inline void Assembler::mulhwu( Register d, Register a, Register b) { emit_int32(MULHWU_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); }
|
||||
+inline void Assembler::mulhwu_(Register d, Register a, Register b) { emit_int32(MULHWU_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); }
|
||||
inline void Assembler::mulhd( Register d, Register a, Register b) { emit_int32(MULHD_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); }
|
||||
inline void Assembler::mulhd_( Register d, Register a, Register b) { emit_int32(MULHD_OPCODE | rt(d) | ra(a) | rb(b) | rc(1)); }
|
||||
inline void Assembler::mulhdu( Register d, Register a, Register b) { emit_int32(MULHDU_OPCODE | rt(d) | ra(a) | rb(b) | rc(0)); }
|
||||
diff --git a/src/cpu/ppc/vm/c2_init_ppc.cpp b/src/cpu/ppc/vm/c2_init_ppc.cpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/c2_init_ppc.cpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/c2_init_ppc.cpp
|
||||
@@ -45,4 +45,10 @@
|
||||
FLAG_SET_ERGO(bool, InsertEndGroupPPC64, true);
|
||||
}
|
||||
}
|
||||
+
|
||||
+ if (OptimizeFill) {
|
||||
+ warning("OptimizeFill is not supported on this CPU.");
|
||||
+ FLAG_SET_DEFAULT(OptimizeFill, false);
|
||||
+ }
|
||||
+
|
||||
}
|
||||
diff --git a/src/cpu/ppc/vm/sharedRuntime_ppc.cpp b/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/sharedRuntime_ppc.cpp
|
||||
@@ -42,6 +42,8 @@
|
||||
#include "opto/runtime.hpp"
|
||||
#endif
|
||||
|
||||
+#include <alloca.h>
|
||||
+
|
||||
#define __ masm->
|
||||
|
||||
#ifdef PRODUCT
|
||||
@@ -3269,3 +3271,245 @@
|
||||
return RuntimeStub::new_runtime_stub(name, &buffer, frame_complete, frame_size_in_bytes/wordSize,
|
||||
oop_maps, true);
|
||||
}
|
||||
+
|
||||
+
|
||||
+//------------------------------Montgomery multiplication------------------------
|
||||
+//
|
||||
+
|
||||
+// Subtract 0:b from carry:a. Return carry.
|
||||
+static unsigned long
|
||||
+sub(unsigned long a[], unsigned long b[], unsigned long carry, long len) {
|
||||
+ long i = 0;
|
||||
+ unsigned long tmp, tmp2;
|
||||
+ __asm__ __volatile__ (
|
||||
+ "subfc %[tmp], %[tmp], %[tmp] \n" // pre-set CA
|
||||
+ "mtctr %[len] \n"
|
||||
+ "0: \n"
|
||||
+ "ldx %[tmp], %[i], %[a] \n"
|
||||
+ "ldx %[tmp2], %[i], %[b] \n"
|
||||
+ "subfe %[tmp], %[tmp2], %[tmp] \n" // subtract extended
|
||||
+ "stdx %[tmp], %[i], %[a] \n"
|
||||
+ "addi %[i], %[i], 8 \n"
|
||||
+ "bdnz 0b \n"
|
||||
+ "addme %[tmp], %[carry] \n" // carry + CA - 1
|
||||
+ : [i]"+b"(i), [tmp]"=&r"(tmp), [tmp2]"=&r"(tmp2)
|
||||
+ : [a]"r"(a), [b]"r"(b), [carry]"r"(carry), [len]"r"(len)
|
||||
+ : "ctr", "xer", "memory"
|
||||
+ );
|
||||
+ return tmp;
|
||||
+}
|
||||
+
|
||||
+// Multiply (unsigned) Long A by Long B, accumulating the double-
|
||||
+// length result into the accumulator formed of T0, T1, and T2.
|
||||
+inline void MACC(unsigned long A, unsigned long B, unsigned long &T0, unsigned long &T1, unsigned long &T2) {
|
||||
+ unsigned long hi, lo;
|
||||
+ __asm__ __volatile__ (
|
||||
+ "mulld %[lo], %[A], %[B] \n"
|
||||
+ "mulhdu %[hi], %[A], %[B] \n"
|
||||
+ "addc %[T0], %[T0], %[lo] \n"
|
||||
+ "adde %[T1], %[T1], %[hi] \n"
|
||||
+ "addze %[T2], %[T2] \n"
|
||||
+ : [hi]"=&r"(hi), [lo]"=&r"(lo), [T0]"+r"(T0), [T1]"+r"(T1), [T2]"+r"(T2)
|
||||
+ : [A]"r"(A), [B]"r"(B)
|
||||
+ : "xer"
|
||||
+ );
|
||||
+}
|
||||
+
|
||||
+// As above, but add twice the double-length result into the
|
||||
+// accumulator.
|
||||
+inline void MACC2(unsigned long A, unsigned long B, unsigned long &T0, unsigned long &T1, unsigned long &T2) {
|
||||
+ unsigned long hi, lo;
|
||||
+ __asm__ __volatile__ (
|
||||
+ "mulld %[lo], %[A], %[B] \n"
|
||||
+ "mulhdu %[hi], %[A], %[B] \n"
|
||||
+ "addc %[T0], %[T0], %[lo] \n"
|
||||
+ "adde %[T1], %[T1], %[hi] \n"
|
||||
+ "addze %[T2], %[T2] \n"
|
||||
+ "addc %[T0], %[T0], %[lo] \n"
|
||||
+ "adde %[T1], %[T1], %[hi] \n"
|
||||
+ "addze %[T2], %[T2] \n"
|
||||
+ : [hi]"=&r"(hi), [lo]"=&r"(lo), [T0]"+r"(T0), [T1]"+r"(T1), [T2]"+r"(T2)
|
||||
+ : [A]"r"(A), [B]"r"(B)
|
||||
+ : "xer"
|
||||
+ );
|
||||
+}
|
||||
+
|
||||
+// Fast Montgomery multiplication. The derivation of the algorithm is
|
||||
+// in "A Cryptographic Library for the Motorola DSP56000,
|
||||
+// Dusse and Kaliski, Proc. EUROCRYPT 90, pp. 230-237".
|
||||
+static void
|
||||
+montgomery_multiply(unsigned long a[], unsigned long b[], unsigned long n[],
|
||||
+ unsigned long m[], unsigned long inv, int len) {
|
||||
+ unsigned long t0 = 0, t1 = 0, t2 = 0; // Triple-precision accumulator
|
||||
+ int i;
|
||||
+
|
||||
+ assert(inv * n[0] == -1UL, "broken inverse in Montgomery multiply");
|
||||
+
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ int j;
|
||||
+ for (j = 0; j < i; j++) {
|
||||
+ MACC(a[j], b[i-j], t0, t1, t2);
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ MACC(a[i], b[0], t0, t1, t2);
|
||||
+ m[i] = t0 * inv;
|
||||
+ MACC(m[i], n[0], t0, t1, t2);
|
||||
+
|
||||
+ assert(t0 == 0, "broken Montgomery multiply");
|
||||
+
|
||||
+ t0 = t1; t1 = t2; t2 = 0;
|
||||
+ }
|
||||
+
|
||||
+ for (i = len; i < 2*len; i++) {
|
||||
+ int j;
|
||||
+ for (j = i-len+1; j < len; j++) {
|
||||
+ MACC(a[j], b[i-j], t0, t1, t2);
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ m[i-len] = t0;
|
||||
+ t0 = t1; t1 = t2; t2 = 0;
|
||||
+ }
|
||||
+
|
||||
+ while (t0) {
|
||||
+ t0 = sub(m, n, t0, len);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+// Fast Montgomery squaring. This uses asymptotically 25% fewer
|
||||
+// multiplies so it should be up to 25% faster than Montgomery
|
||||
+// multiplication. However, its loop control is more complex and it
|
||||
+// may actually run slower on some machines.
|
||||
+static void
|
||||
+montgomery_square(unsigned long a[], unsigned long n[],
|
||||
+ unsigned long m[], unsigned long inv, int len) {
|
||||
+ unsigned long t0 = 0, t1 = 0, t2 = 0; // Triple-precision accumulator
|
||||
+ int i;
|
||||
+
|
||||
+ assert(inv * n[0] == -1UL, "broken inverse in Montgomery multiply");
|
||||
+
|
||||
+ for (i = 0; i < len; i++) {
|
||||
+ int j;
|
||||
+ int end = (i+1)/2;
|
||||
+ for (j = 0; j < end; j++) {
|
||||
+ MACC2(a[j], a[i-j], t0, t1, t2);
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ if ((i & 1) == 0) {
|
||||
+ MACC(a[j], a[j], t0, t1, t2);
|
||||
+ }
|
||||
+ for (; j < i; j++) {
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ m[i] = t0 * inv;
|
||||
+ MACC(m[i], n[0], t0, t1, t2);
|
||||
+
|
||||
+ assert(t0 == 0, "broken Montgomery square");
|
||||
+
|
||||
+ t0 = t1; t1 = t2; t2 = 0;
|
||||
+ }
|
||||
+
|
||||
+ for (i = len; i < 2*len; i++) {
|
||||
+ int start = i-len+1;
|
||||
+ int end = start + (len - start)/2;
|
||||
+ int j;
|
||||
+ for (j = start; j < end; j++) {
|
||||
+ MACC2(a[j], a[i-j], t0, t1, t2);
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ if ((i & 1) == 0) {
|
||||
+ MACC(a[j], a[j], t0, t1, t2);
|
||||
+ }
|
||||
+ for (; j < len; j++) {
|
||||
+ MACC(m[j], n[i-j], t0, t1, t2);
|
||||
+ }
|
||||
+ m[i-len] = t0;
|
||||
+ t0 = t1; t1 = t2; t2 = 0;
|
||||
+ }
|
||||
+
|
||||
+ while (t0) {
|
||||
+ t0 = sub(m, n, t0, len);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+// The threshold at which squaring is advantageous was determined
|
||||
+// experimentally on an i7-3930K (Ivy Bridge) CPU @ 3.5GHz.
|
||||
+// Doesn't seem to be relevant for Power8 so we use the same value.
|
||||
+#define MONTGOMERY_SQUARING_THRESHOLD 64
|
||||
+
|
||||
+// Copy len longwords from s to d, word-swapping as we go. The
|
||||
+// destination array is reversed.
|
||||
+static void reverse_words(unsigned long *s, unsigned long *d, int len) {
|
||||
+ d += len;
|
||||
+ while(len-- > 0) {
|
||||
+ d--;
|
||||
+ unsigned long s_val = *s;
|
||||
+ // Swap words in a longword on little endian machines.
|
||||
+#ifdef VM_LITTLE_ENDIAN
|
||||
+ s_val = (s_val << 32) | (s_val >> 32);
|
||||
+#endif
|
||||
+ *d = s_val;
|
||||
+ s++;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void SharedRuntime::montgomery_multiply(jint *a_ints, jint *b_ints, jint *n_ints,
|
||||
+ jint len, jlong inv,
|
||||
+ jint *m_ints) {
|
||||
+ assert(len % 2 == 0, "array length in montgomery_multiply must be even");
|
||||
+ int longwords = len/2;
|
||||
+ assert(longwords > 0, "unsupported");
|
||||
+
|
||||
+ // Make very sure we don't use so much space that the stack might
|
||||
+ // overflow. 512 jints corresponds to an 16384-bit integer and
|
||||
+ // will use here a total of 8k bytes of stack space.
|
||||
+ int total_allocation = longwords * sizeof (unsigned long) * 4;
|
||||
+ guarantee(total_allocation <= 8192, "must be");
|
||||
+ unsigned long *scratch = (unsigned long *)alloca(total_allocation);
|
||||
+
|
||||
+ // Local scratch arrays
|
||||
+ unsigned long
|
||||
+ *a = scratch + 0 * longwords,
|
||||
+ *b = scratch + 1 * longwords,
|
||||
+ *n = scratch + 2 * longwords,
|
||||
+ *m = scratch + 3 * longwords;
|
||||
+
|
||||
+ reverse_words((unsigned long *)a_ints, a, longwords);
|
||||
+ reverse_words((unsigned long *)b_ints, b, longwords);
|
||||
+ reverse_words((unsigned long *)n_ints, n, longwords);
|
||||
+
|
||||
+ ::montgomery_multiply(a, b, n, m, (unsigned long)inv, longwords);
|
||||
+
|
||||
+ reverse_words(m, (unsigned long *)m_ints, longwords);
|
||||
+}
|
||||
+
|
||||
+void SharedRuntime::montgomery_square(jint *a_ints, jint *n_ints,
|
||||
+ jint len, jlong inv,
|
||||
+ jint *m_ints) {
|
||||
+ assert(len % 2 == 0, "array length in montgomery_square must be even");
|
||||
+ int longwords = len/2;
|
||||
+ assert(longwords > 0, "unsupported");
|
||||
+
|
||||
+ // Make very sure we don't use so much space that the stack might
|
||||
+ // overflow. 512 jints corresponds to an 16384-bit integer and
|
||||
+ // will use here a total of 6k bytes of stack space.
|
||||
+ int total_allocation = longwords * sizeof (unsigned long) * 3;
|
||||
+ guarantee(total_allocation <= 8192, "must be");
|
||||
+ unsigned long *scratch = (unsigned long *)alloca(total_allocation);
|
||||
+
|
||||
+ // Local scratch arrays
|
||||
+ unsigned long
|
||||
+ *a = scratch + 0 * longwords,
|
||||
+ *n = scratch + 1 * longwords,
|
||||
+ *m = scratch + 2 * longwords;
|
||||
+
|
||||
+ reverse_words((unsigned long *)a_ints, a, longwords);
|
||||
+ reverse_words((unsigned long *)n_ints, n, longwords);
|
||||
+
|
||||
+ if (len >= MONTGOMERY_SQUARING_THRESHOLD) {
|
||||
+ ::montgomery_square(a, n, m, (unsigned long)inv, longwords);
|
||||
+ } else {
|
||||
+ ::montgomery_multiply(a, a, n, m, (unsigned long)inv, longwords);
|
||||
+ }
|
||||
+
|
||||
+ reverse_words(m, (unsigned long *)m_ints, longwords);
|
||||
+}
|
||||
diff --git a/src/cpu/ppc/vm/stubGenerator_ppc.cpp b/src/cpu/ppc/vm/stubGenerator_ppc.cpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/stubGenerator_ppc.cpp
|
||||
@@ -2518,6 +2518,15 @@
|
||||
generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry,
|
||||
&StubRoutines::_safefetchN_fault_pc,
|
||||
&StubRoutines::_safefetchN_continuation_pc);
|
||||
+
|
||||
+ if (UseMontgomeryMultiplyIntrinsic) {
|
||||
+ StubRoutines::_montgomeryMultiply
|
||||
+ = CAST_FROM_FN_PTR(address, SharedRuntime::montgomery_multiply);
|
||||
+ }
|
||||
+ if (UseMontgomerySquareIntrinsic) {
|
||||
+ StubRoutines::_montgomerySquare
|
||||
+ = CAST_FROM_FN_PTR(address, SharedRuntime::montgomery_square);
|
||||
+ }
|
||||
|
||||
if (UseAESIntrinsics) {
|
||||
StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock();
|
||||
diff --git a/src/cpu/ppc/vm/templateInterpreter_ppc.cpp b/src/cpu/ppc/vm/templateInterpreter_ppc.cpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/templateInterpreter_ppc.cpp
|
||||
@@ -265,7 +265,7 @@
|
||||
__ cmpdi(CCR0, Rmdo, 0);
|
||||
__ beq(CCR0, no_mdo);
|
||||
|
||||
- // Increment backedge counter in the MDO.
|
||||
+ // Increment invocation counter in the MDO.
|
||||
const int mdo_bc_offs = in_bytes(MethodData::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset());
|
||||
__ lwz(Rscratch2, mdo_bc_offs, Rmdo);
|
||||
__ addi(Rscratch2, Rscratch2, increment);
|
||||
@@ -277,12 +277,12 @@
|
||||
}
|
||||
|
||||
// Increment counter in MethodCounters*.
|
||||
- const int mo_bc_offs = in_bytes(MethodCounters::backedge_counter_offset()) + in_bytes(InvocationCounter::counter_offset());
|
||||
+ const int mo_ic_offs = in_bytes(MethodCounters::invocation_counter_offset()) + in_bytes(InvocationCounter::counter_offset());
|
||||
__ bind(no_mdo);
|
||||
__ get_method_counters(R19_method, R3_counters, done);
|
||||
- __ lwz(Rscratch2, mo_bc_offs, R3_counters);
|
||||
+ __ lwz(Rscratch2, mo_ic_offs, R3_counters);
|
||||
__ addi(Rscratch2, Rscratch2, increment);
|
||||
- __ stw(Rscratch2, mo_bc_offs, R3_counters);
|
||||
+ __ stw(Rscratch2, mo_ic_offs, R3_counters);
|
||||
__ load_const_optimized(Rscratch1, mask, R0);
|
||||
__ and_(Rscratch1, Rscratch2, Rscratch1);
|
||||
__ beq(CCR0, *overflow);
|
||||
diff --git a/src/cpu/ppc/vm/vm_version_ppc.cpp b/src/cpu/ppc/vm/vm_version_ppc.cpp
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/vm_version_ppc.cpp
|
||||
@@ -201,6 +201,12 @@
|
||||
FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
|
||||
}
|
||||
|
||||
+ if (FLAG_IS_DEFAULT(UseMontgomeryMultiplyIntrinsic)) {
|
||||
+ UseMontgomeryMultiplyIntrinsic = true;
|
||||
+ }
|
||||
+ if (FLAG_IS_DEFAULT(UseMontgomerySquareIntrinsic)) {
|
||||
+ UseMontgomerySquareIntrinsic = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
void VM_Version::print_features() {
|
||||
diff --git a/src/share/vm/opto/library_call.cpp b/src/share/vm/opto/library_call.cpp
|
||||
--- openjdk/hotspot/src/share/vm/opto/library_call.cpp
|
||||
+++ openjdk/hotspot/src/share/vm/opto/library_call.cpp
|
||||
@@ -6205,11 +6205,21 @@
|
||||
Node* n_start = array_element_address(n, intcon(0), n_elem);
|
||||
Node* m_start = array_element_address(m, intcon(0), m_elem);
|
||||
|
||||
- Node* call = make_runtime_call(RC_LEAF,
|
||||
- OptoRuntime::montgomeryMultiply_Type(),
|
||||
- stubAddr, stubName, TypePtr::BOTTOM,
|
||||
- a_start, b_start, n_start, len, inv, top(),
|
||||
- m_start);
|
||||
+ Node* call = NULL;
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ Node* len_I2L = ConvI2L(len);
|
||||
+ call = make_runtime_call(RC_LEAF,
|
||||
+ OptoRuntime::montgomeryMultiply_Type(),
|
||||
+ stubAddr, stubName, TypePtr::BOTTOM,
|
||||
+ a_start, b_start, n_start, len_I2L XTOP, inv,
|
||||
+ top(), m_start);
|
||||
+ } else {
|
||||
+ call = make_runtime_call(RC_LEAF,
|
||||
+ OptoRuntime::montgomeryMultiply_Type(),
|
||||
+ stubAddr, stubName, TypePtr::BOTTOM,
|
||||
+ a_start, b_start, n_start, len, inv, top(),
|
||||
+ m_start);
|
||||
+ }
|
||||
set_result(m);
|
||||
}
|
||||
|
||||
@@ -6263,11 +6273,22 @@
|
||||
Node* n_start = array_element_address(n, intcon(0), n_elem);
|
||||
Node* m_start = array_element_address(m, intcon(0), m_elem);
|
||||
|
||||
- Node* call = make_runtime_call(RC_LEAF,
|
||||
- OptoRuntime::montgomerySquare_Type(),
|
||||
- stubAddr, stubName, TypePtr::BOTTOM,
|
||||
- a_start, n_start, len, inv, top(),
|
||||
- m_start);
|
||||
+ Node* call = NULL;
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ Node* len_I2L = ConvI2L(len);
|
||||
+ call = make_runtime_call(RC_LEAF,
|
||||
+ OptoRuntime::montgomerySquare_Type(),
|
||||
+ stubAddr, stubName, TypePtr::BOTTOM,
|
||||
+ a_start, n_start, len_I2L XTOP, inv, top(),
|
||||
+ m_start);
|
||||
+ } else {
|
||||
+ call = make_runtime_call(RC_LEAF,
|
||||
+ OptoRuntime::montgomerySquare_Type(),
|
||||
+ stubAddr, stubName, TypePtr::BOTTOM,
|
||||
+ a_start, n_start, len, inv, top(),
|
||||
+ m_start);
|
||||
+ }
|
||||
+
|
||||
set_result(m);
|
||||
}
|
||||
|
||||
diff --git a/src/share/vm/opto/runtime.cpp b/src/share/vm/opto/runtime.cpp
|
||||
--- openjdk/hotspot/src/share/vm/opto/runtime.cpp
|
||||
+++ openjdk/hotspot/src/share/vm/opto/runtime.cpp
|
||||
@@ -1031,12 +1031,20 @@
|
||||
// create input type (domain)
|
||||
int num_args = 7;
|
||||
int argcnt = num_args;
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ argcnt++; // additional placeholder
|
||||
+ }
|
||||
const Type** fields = TypeTuple::fields(argcnt);
|
||||
int argp = TypeFunc::Parms;
|
||||
fields[argp++] = TypePtr::NOTNULL; // a
|
||||
fields[argp++] = TypePtr::NOTNULL; // b
|
||||
fields[argp++] = TypePtr::NOTNULL; // n
|
||||
- fields[argp++] = TypeInt::INT; // len
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ fields[argp++] = TypeLong::LONG; // len
|
||||
+ fields[argp++] = TypeLong::HALF; // placeholder
|
||||
+ } else {
|
||||
+ fields[argp++] = TypeInt::INT; // len
|
||||
+ }
|
||||
fields[argp++] = TypeLong::LONG; // inv
|
||||
fields[argp++] = Type::HALF;
|
||||
fields[argp++] = TypePtr::NOTNULL; // result
|
||||
@@ -1055,11 +1063,19 @@
|
||||
// create input type (domain)
|
||||
int num_args = 6;
|
||||
int argcnt = num_args;
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ argcnt++; // additional placeholder
|
||||
+ }
|
||||
const Type** fields = TypeTuple::fields(argcnt);
|
||||
int argp = TypeFunc::Parms;
|
||||
fields[argp++] = TypePtr::NOTNULL; // a
|
||||
fields[argp++] = TypePtr::NOTNULL; // n
|
||||
- fields[argp++] = TypeInt::INT; // len
|
||||
+ if (CCallingConventionRequiresIntsAsLongs) {
|
||||
+ fields[argp++] = TypeLong::LONG; // len
|
||||
+ fields[argp++] = TypeLong::HALF; // placeholder
|
||||
+ } else {
|
||||
+ fields[argp++] = TypeInt::INT; // len
|
||||
+ }
|
||||
fields[argp++] = TypeLong::LONG; // inv
|
||||
fields[argp++] = Type::HALF;
|
||||
fields[argp++] = TypePtr::NOTNULL; // result
|
@ -1,31 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User goetz
|
||||
# Date 1477563748 -7200
|
||||
# Thu Oct 27 12:22:28 2016 +0200
|
||||
# Node ID 9b9d9e11c04d5e5f64829d34752e5c94b1c7d911
|
||||
# Parent 92f0dbe76a13992cc27188e0f68e4b1771c7004a
|
||||
8168318, PR3466, RH1498320: PPC64: Use cmpldi instead of li/cmpld
|
||||
Reviewed-by: goetz
|
||||
Contributed-by: igor.nunes@eldorado.org.br
|
||||
|
||||
diff --git a/src/cpu/ppc/vm/ppc.ad b/src/cpu/ppc/vm/ppc.ad
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
@@ -10571,6 +10571,17 @@
|
||||
ins_pipe(pipe_class_compare);
|
||||
%}
|
||||
|
||||
+instruct cmpP_reg_null(flagsReg crx, iRegP_N2P src1, immP_0or1 src2) %{
|
||||
+ match(Set crx (CmpP src1 src2));
|
||||
+ format %{ "CMPLDI $crx, $src1, $src2 \t// ptr" %}
|
||||
+ size(4);
|
||||
+ ins_encode %{
|
||||
+ // TODO: PPC port $archOpcode(ppc64Opcode_cmpl);
|
||||
+ __ cmpldi($crx$$CondRegister, $src1$$Register, (int)((short)($src2$$constant & 0xFFFF)));
|
||||
+ %}
|
||||
+ ins_pipe(pipe_class_compare);
|
||||
+%}
|
||||
+
|
||||
// Used in postalloc expand.
|
||||
instruct cmpP_reg_imm16(flagsReg crx, iRegPsrc src1, immL16 src2) %{
|
||||
// This match rule prevents reordering of node before a safepoint.
|
@ -1,33 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User mdoerr
|
||||
# Date 1480079712 7200
|
||||
# Fri Nov 25 11:15:12 2016 -0200
|
||||
# Node ID 3c499a0ba92b1affb3f473c6502e374f4785aba9
|
||||
# Parent 9b9d9e11c04d5e5f64829d34752e5c94b1c7d911
|
||||
8170328, PR3466, RH1498321: PPC64: Use andis instead of lis/and
|
||||
Reviewed-by: goetz, mdoerr
|
||||
Contributed-by: Igor Nunes <igor.nunes@eldorado.org.br>
|
||||
|
||||
diff --git a/src/cpu/ppc/vm/ppc.ad b/src/cpu/ppc/vm/ppc.ad
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
@@ -8889,6 +8889,19 @@
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
+// Left shifted Immediate And
|
||||
+instruct andI_reg_immIhi16(iRegIdst dst, iRegIsrc src1, immIhi16 src2, flagsRegCR0 cr0) %{
|
||||
+ match(Set dst (AndI src1 src2));
|
||||
+ effect(KILL cr0);
|
||||
+ format %{ "ANDIS $dst, $src1, $src2.hi" %}
|
||||
+ size(4);
|
||||
+ ins_encode %{
|
||||
+ // TODO: PPC port $archOpcode(ppc64Opcode_andis_);
|
||||
+ __ andis_($dst$$Register, $src1$$Register, (int)((unsigned short)(($src2$$constant & 0xFFFF0000) >> 16)));
|
||||
+ %}
|
||||
+ ins_pipe(pipe_class_default);
|
||||
+%}
|
||||
+
|
||||
// Immediate And
|
||||
instruct andI_reg_uimm16(iRegIdst dst, iRegIsrc src1, uimmI16 src2, flagsRegCR0 cr0) %{
|
||||
match(Set dst (AndI src1 src2));
|
@ -1,115 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User zgu
|
||||
# Date 1496236768 14400
|
||||
# Wed May 31 09:19:28 2017 -0400
|
||||
# Node ID 8330ff7914ec54c46fd19300221f72d774423405
|
||||
# Parent 55a34e4962e10c822affe8f89273a87e84cade92
|
||||
8181055: PPC64: "mbind: Invalid argument" still seen after 8175813
|
||||
Summary: Use numa_interleave_memory v2 api when available
|
||||
Reviewed-by: dholmes, shade
|
||||
|
||||
diff -r 74c81011375b src/os/linux/vm/os_linux.cpp
|
||||
--- openjdk/hotspot/src/os/linux/vm/os_linux.cpp Wed May 17 17:52:34 2017 -0400
|
||||
+++ openjdk/hotspot/src/os/linux/vm/os_linux.cpp Wed May 31 12:27:00 2017 -0400
|
||||
@@ -2819,11 +2819,8 @@
|
||||
extern "C" JNIEXPORT void numa_error(char *where) { }
|
||||
extern "C" JNIEXPORT int fork1() { return fork(); }
|
||||
|
||||
-
|
||||
-// If we are running with libnuma version > 2, then we should
|
||||
-// be trying to use symbols with versions 1.1
|
||||
-// If we are running with earlier version, which did not have symbol versions,
|
||||
-// we should use the base version.
|
||||
+// Handle request to load libnuma symbol version 1.1 (API v1). If it fails
|
||||
+// load symbol from base version instead.
|
||||
void* os::Linux::libnuma_dlsym(void* handle, const char *name) {
|
||||
void *f = dlvsym(handle, name, "libnuma_1.1");
|
||||
if (f == NULL) {
|
||||
@@ -2832,6 +2829,12 @@
|
||||
return f;
|
||||
}
|
||||
|
||||
+// Handle request to load libnuma symbol version 1.2 (API v2) only.
|
||||
+// Return NULL if the symbol is not defined in this particular version.
|
||||
+void* os::Linux::libnuma_v2_dlsym(void* handle, const char* name) {
|
||||
+ return dlvsym(handle, name, "libnuma_1.2");
|
||||
+}
|
||||
+
|
||||
bool os::Linux::libnuma_init() {
|
||||
// sched_getcpu() should be in libc.
|
||||
set_sched_getcpu(CAST_TO_FN_PTR(sched_getcpu_func_t,
|
||||
@@ -2856,6 +2859,8 @@
|
||||
libnuma_dlsym(handle, "numa_tonode_memory")));
|
||||
set_numa_interleave_memory(CAST_TO_FN_PTR(numa_interleave_memory_func_t,
|
||||
libnuma_dlsym(handle, "numa_interleave_memory")));
|
||||
+ set_numa_interleave_memory_v2(CAST_TO_FN_PTR(numa_interleave_memory_v2_func_t,
|
||||
+ libnuma_v2_dlsym(handle, "numa_interleave_memory")));
|
||||
set_numa_set_bind_policy(CAST_TO_FN_PTR(numa_set_bind_policy_func_t,
|
||||
libnuma_dlsym(handle, "numa_set_bind_policy")));
|
||||
set_numa_bitmask_isbitset(CAST_TO_FN_PTR(numa_bitmask_isbitset_func_t,
|
||||
@@ -2975,6 +2980,7 @@
|
||||
os::Linux::numa_available_func_t os::Linux::_numa_available;
|
||||
os::Linux::numa_tonode_memory_func_t os::Linux::_numa_tonode_memory;
|
||||
os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory;
|
||||
+os::Linux::numa_interleave_memory_v2_func_t os::Linux::_numa_interleave_memory_v2;
|
||||
os::Linux::numa_set_bind_policy_func_t os::Linux::_numa_set_bind_policy;
|
||||
os::Linux::numa_bitmask_isbitset_func_t os::Linux::_numa_bitmask_isbitset;
|
||||
os::Linux::numa_distance_func_t os::Linux::_numa_distance;
|
||||
diff -r 74c81011375b src/os/linux/vm/os_linux.hpp
|
||||
--- openjdk/hotspot/src/os/linux/vm/os_linux.hpp Wed May 17 17:52:34 2017 -0400
|
||||
+++ openjdk/hotspot/src/os/linux/vm/os_linux.hpp Wed May 31 12:27:00 2017 -0400
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
- * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
+ * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -190,6 +190,9 @@
|
||||
static void libpthread_init();
|
||||
static bool libnuma_init();
|
||||
static void* libnuma_dlsym(void* handle, const char* name);
|
||||
+ // libnuma v2 (libnuma_1.2) symbols
|
||||
+ static void* libnuma_v2_dlsym(void* handle, const char* name);
|
||||
+
|
||||
// Minimum stack size a thread can be created with (allowing
|
||||
// the VM to completely create the thread and enter user code)
|
||||
static size_t min_stack_allowed;
|
||||
@@ -250,6 +253,8 @@
|
||||
typedef int (*numa_available_func_t)(void);
|
||||
typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node);
|
||||
typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask);
|
||||
+ typedef void (*numa_interleave_memory_v2_func_t)(void *start, size_t size, struct bitmask* mask);
|
||||
+
|
||||
typedef void (*numa_set_bind_policy_func_t)(int policy);
|
||||
typedef int (*numa_bitmask_isbitset_func_t)(struct bitmask *bmp, unsigned int n);
|
||||
typedef int (*numa_distance_func_t)(int node1, int node2);
|
||||
@@ -261,6 +266,7 @@
|
||||
static numa_available_func_t _numa_available;
|
||||
static numa_tonode_memory_func_t _numa_tonode_memory;
|
||||
static numa_interleave_memory_func_t _numa_interleave_memory;
|
||||
+ static numa_interleave_memory_v2_func_t _numa_interleave_memory_v2;
|
||||
static numa_set_bind_policy_func_t _numa_set_bind_policy;
|
||||
static numa_bitmask_isbitset_func_t _numa_bitmask_isbitset;
|
||||
static numa_distance_func_t _numa_distance;
|
||||
@@ -275,6 +281,7 @@
|
||||
static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
|
||||
static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; }
|
||||
static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; }
|
||||
+ static void set_numa_interleave_memory_v2(numa_interleave_memory_v2_func_t func) { _numa_interleave_memory_v2 = func; }
|
||||
static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; }
|
||||
static void set_numa_bitmask_isbitset(numa_bitmask_isbitset_func_t func) { _numa_bitmask_isbitset = func; }
|
||||
static void set_numa_distance(numa_distance_func_t func) { _numa_distance = func; }
|
||||
@@ -296,7 +303,10 @@
|
||||
return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
|
||||
}
|
||||
static void numa_interleave_memory(void *start, size_t size) {
|
||||
- if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {
|
||||
+ // Use v2 api if available
|
||||
+ if (_numa_interleave_memory_v2 != NULL && _numa_all_nodes_ptr != NULL) {
|
||||
+ _numa_interleave_memory_v2(start, size, _numa_all_nodes_ptr);
|
||||
+ } else if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) {
|
||||
_numa_interleave_memory(start, size, _numa_all_nodes);
|
||||
}
|
||||
}
|
||||
|
@ -1,92 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User stuefe
|
||||
# Date 1497865921 -7200
|
||||
# Mon Jun 19 11:52:01 2017 +0200
|
||||
# Node ID ca0c7b2783e0102468218589a062e7ac4736aae2
|
||||
# Parent 148a7d6c463ad1726bad8a9e8d5df191314d704b
|
||||
8181419, PR3413, RH1463144: Race in jdwp invoker handling may lead to crashes or invalid results
|
||||
Reviewed-by: sspitsyn, sgehwolf, clanger
|
||||
|
||||
diff --git a/src/share/back/invoker.c b/src/share/back/invoker.c
|
||||
--- openjdk/jdk/src/share/back/invoker.c
|
||||
+++ openjdk/jdk/src/share/back/invoker.c
|
||||
@@ -212,30 +212,6 @@
|
||||
}
|
||||
|
||||
/*
|
||||
- * Delete saved global references - if any - for:
|
||||
- * - a potentially thrown Exception
|
||||
- * - a returned refernce/array value
|
||||
- * See invoker_doInvoke() and invoke* methods where global references
|
||||
- * are being saved.
|
||||
- */
|
||||
-static void
|
||||
-deletePotentiallySavedGlobalRefs(JNIEnv *env, InvokeRequest *request)
|
||||
-{
|
||||
- /* Delete potentially saved return value */
|
||||
- if ((request->invokeType == INVOKE_CONSTRUCTOR) ||
|
||||
- (returnTypeTag(request->methodSignature) == JDWP_TAG(OBJECT)) ||
|
||||
- (returnTypeTag(request->methodSignature) == JDWP_TAG(ARRAY))) {
|
||||
- if (request->returnValue.l != NULL) {
|
||||
- tossGlobalRef(env, &(request->returnValue.l));
|
||||
- }
|
||||
- }
|
||||
- /* Delete potentially saved exception */
|
||||
- if (request->exception != NULL) {
|
||||
- tossGlobalRef(env, &(request->exception));
|
||||
- }
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
* Delete global argument references from the request which got put there before a
|
||||
* invoke request was carried out. See fillInvokeRequest().
|
||||
*/
|
||||
@@ -744,6 +720,7 @@
|
||||
jint id;
|
||||
InvokeRequest *request;
|
||||
jboolean detached;
|
||||
+ jboolean mustReleaseReturnValue = JNI_FALSE;
|
||||
|
||||
JDI_ASSERT(thread);
|
||||
|
||||
@@ -787,6 +764,13 @@
|
||||
id = request->id;
|
||||
exc = request->exception;
|
||||
returnValue = request->returnValue;
|
||||
+
|
||||
+ /* Release return value and exception references, but delay the release
|
||||
+ * until after the return packet was sent. */
|
||||
+ mustReleaseReturnValue = request->invokeType == INVOKE_CONSTRUCTOR ||
|
||||
+ returnTypeTag(request->methodSignature) == JDWP_TAG(OBJECT) ||
|
||||
+ returnTypeTag(request->methodSignature) == JDWP_TAG(ARRAY);
|
||||
+
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -801,6 +785,12 @@
|
||||
*/
|
||||
deleteGlobalArgumentRefs(env, request);
|
||||
|
||||
+ /* From now on, do not access the request structure anymore
|
||||
+ * for this request id, because once we give up the invokerLock it may
|
||||
+ * be immediately reused by a new invoke request.
|
||||
+ */
|
||||
+ request = NULL;
|
||||
+
|
||||
/*
|
||||
* Give up the lock before I/O operation
|
||||
*/
|
||||
@@ -821,7 +811,12 @@
|
||||
*/
|
||||
eventHandler_lock(); // for proper lock order
|
||||
debugMonitorEnter(invokerLock);
|
||||
- deletePotentiallySavedGlobalRefs(env, request);
|
||||
+ if (mustReleaseReturnValue && returnValue.l != NULL) {
|
||||
+ tossGlobalRef(env, &returnValue.l);
|
||||
+ }
|
||||
+ if (exc != NULL) {
|
||||
+ tossGlobalRef(env, &exc);
|
||||
+ }
|
||||
debugMonitorExit(invokerLock);
|
||||
eventHandler_unlock();
|
||||
}
|
@ -1,66 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User mdoerr
|
||||
# Date 1507752266 -3600
|
||||
# Wed Oct 11 21:04:26 2017 +0100
|
||||
# Node ID 5c00d5cd7677aec3549afe02e4f9de8dc7b20bef
|
||||
# Parent 3c499a0ba92b1affb3f473c6502e374f4785aba9
|
||||
8181810, PR3466, RH1498319: PPC64: Leverage extrdi for bitfield extract
|
||||
Reviewed-by: mdoerr, simonis
|
||||
Contributed-by: Matthew Brandyberry <mbrandy@linux.vnet.ibm.com>
|
||||
|
||||
diff --git a/src/cpu/ppc/vm/ppc.ad b/src/cpu/ppc/vm/ppc.ad
|
||||
--- openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
+++ openjdk/hotspot/src/cpu/ppc/vm/ppc.ad
|
||||
@@ -1,6 +1,6 @@
|
||||
//
|
||||
// Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
|
||||
-// Copyright 2012, 2014 SAP AG. All rights reserved.
|
||||
+// Copyright (c) 2012, 2017 SAP SE. All rights reserved.
|
||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
//
|
||||
// This code is free software; you can redistribute it and/or modify it
|
||||
@@ -8610,6 +8610,44 @@
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
+// Bitfield Extract: URShiftI + AndI
|
||||
+instruct andI_urShiftI_regI_immI_immIpow2minus1(iRegIdst dst, iRegIsrc src1, immI src2, immIpow2minus1 src3) %{
|
||||
+ match(Set dst (AndI (URShiftI src1 src2) src3));
|
||||
+
|
||||
+ format %{ "EXTRDI $dst, $src1, shift=$src2, mask=$src3 \t// int bitfield extract" %}
|
||||
+ size(4);
|
||||
+ ins_encode %{
|
||||
+ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
|
||||
+ int rshift = ($src2$$constant) & 0x1f;
|
||||
+ int length = log2_long(((jlong) $src3$$constant) + 1);
|
||||
+ if (rshift + length > 32) {
|
||||
+ // if necessary, adjust mask to omit rotated bits.
|
||||
+ length = 32 - rshift;
|
||||
+ }
|
||||
+ __ extrdi($dst$$Register, $src1$$Register, length, 64 - (rshift + length));
|
||||
+ %}
|
||||
+ ins_pipe(pipe_class_default);
|
||||
+%}
|
||||
+
|
||||
+// Bitfield Extract: URShiftL + AndL
|
||||
+instruct andL_urShiftL_regL_immI_immLpow2minus1(iRegLdst dst, iRegLsrc src1, immI src2, immLpow2minus1 src3) %{
|
||||
+ match(Set dst (AndL (URShiftL src1 src2) src3));
|
||||
+
|
||||
+ format %{ "EXTRDI $dst, $src1, shift=$src2, mask=$src3 \t// long bitfield extract" %}
|
||||
+ size(4);
|
||||
+ ins_encode %{
|
||||
+ // TODO: PPC port $archOpcode(ppc64Opcode_rldicl);
|
||||
+ int rshift = ($src2$$constant) & 0x3f;
|
||||
+ int length = log2_long(((jlong) $src3$$constant) + 1);
|
||||
+ if (rshift + length > 64) {
|
||||
+ // if necessary, adjust mask to omit rotated bits.
|
||||
+ length = 64 - rshift;
|
||||
+ }
|
||||
+ __ extrdi($dst$$Register, $src1$$Register, length, 64 - (rshift + length));
|
||||
+ %}
|
||||
+ ins_pipe(pipe_class_default);
|
||||
+%}
|
||||
+
|
||||
instruct sxtI_reg(iRegIdst dst, iRegIsrc src) %{
|
||||
match(Set dst (ConvL2I (ConvI2L src)));
|
||||
|
@ -1,23 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User adinn
|
||||
# Date 1516891647 0
|
||||
# Thu Jan 25 14:47:27 2018 +0000
|
||||
# Node ID e321560ac819c05274c59f46f5cc28ccfd4b38ec
|
||||
# Parent 77baeab90732e7cfb6eb1b754a768a197bca1ab5
|
||||
8195859: AArch64: vtableStubs gtest fails after 8174962
|
||||
Summary: gtest vtableStubs introduced by 8174962 fails on AArch64 with an invalid insn encoding
|
||||
Reviewed-by: duke
|
||||
|
||||
diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
@@ -1049,7 +1049,8 @@
|
||||
ldr(method_result, Address(method_result, vtable_offset_in_bytes));
|
||||
} else {
|
||||
vtable_offset_in_bytes += vtable_index.as_constant() * wordSize;
|
||||
- ldr(method_result, Address(recv_klass, vtable_offset_in_bytes));
|
||||
+ ldr(method_result,
|
||||
+ form_address(rscratch1, recv_klass, vtable_offset_in_bytes));
|
||||
}
|
||||
}
|
||||
|
@ -1,61 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User adinn
|
||||
# Date 1516881392 0
|
||||
# Thu Jan 25 11:56:32 2018 +0000
|
||||
# Node ID 51d97ee431ff04f126c436b25dc75de7e0d2d4dd
|
||||
# Parent 2da4a52715d837b639edcfe37c66e5428c023abd
|
||||
8196136: AArch64: Correct register use in patch for JDK-8195685
|
||||
Summary: itable stubs must not use java argument registers as scratch registers
|
||||
Reviewed-by: aph
|
||||
|
||||
diff --git a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp
|
||||
--- a/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp
|
||||
+++ b/src/cpu/aarch64/vm/vtableStubs_aarch64.cpp
|
||||
@@ -64,8 +64,8 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
|
||||
#ifndef PRODUCT
|
||||
if (CountCompiledCalls) {
|
||||
- __ lea(r19, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
|
||||
- __ incrementw(Address(r19));
|
||||
+ __ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
|
||||
+ __ incrementw(Address(r16));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -74,13 +74,13 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
|
||||
// get receiver klass
|
||||
address npe_addr = __ pc();
|
||||
- __ load_klass(r19, j_rarg0);
|
||||
+ __ load_klass(r16, j_rarg0);
|
||||
|
||||
#ifndef PRODUCT
|
||||
if (DebugVtables) {
|
||||
Label L;
|
||||
// check offset vs vtable length
|
||||
- __ ldrw(rscratch1, Address(r19, InstanceKlass::vtable_length_offset() * wordSize));
|
||||
+ __ ldrw(rscratch1, Address(r16, InstanceKlass::vtable_length_offset() * wordSize));
|
||||
__ cmpw(rscratch1, vtable_index * vtableEntry::size());
|
||||
__ br(Assembler::GT, L);
|
||||
__ enter();
|
||||
@@ -92,7 +92,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
}
|
||||
#endif // PRODUCT
|
||||
|
||||
- __ lookup_virtual_method(r19, vtable_index, rmethod);
|
||||
+ __ lookup_virtual_method(r16, vtable_index, rmethod);
|
||||
|
||||
if (DebugVtables) {
|
||||
Label L;
|
||||
@@ -145,9 +145,9 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
// rscratch2: CompiledICHolder
|
||||
// j_rarg0: Receiver
|
||||
|
||||
- // Most registers are in use; we'll use r0, rmethod, r10, r11
|
||||
+ // Most registers are in use; we'll use r16, rmethod, r10, r11
|
||||
const Register recv_klass_reg = r10;
|
||||
- const Register holder_klass_reg = r0; // declaring interface klass (DECC)
|
||||
+ const Register holder_klass_reg = r16; // declaring interface klass (DECC)
|
||||
const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
|
||||
const Register temp_reg = r11;
|
||||
const Register icholder_reg = rscratch2;
|
@ -1,22 +0,0 @@
|
||||
# HG changeset patch
|
||||
# User adinn
|
||||
# Date 1516984701 0
|
||||
# Fri Jan 26 16:38:21 2018 +0000
|
||||
# Node ID 2c35f60ad26425a6d1dd1071e8a5adde79154fe3
|
||||
# Parent e2a7856edfbaccebd36bf02674e39b1a53867241
|
||||
8196221: AArch64: Mistake in committed patch for JDK-8195859
|
||||
Summary: The wrong patch was committed for JDK-8195859
|
||||
Reviewed-by: duke
|
||||
|
||||
diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
|
||||
@@ -1050,7 +1050,7 @@
|
||||
} else {
|
||||
vtable_offset_in_bytes += vtable_index.as_constant() * wordSize;
|
||||
ldr(method_result,
|
||||
- form_address(rscratch1, recv_klass, vtable_offset_in_bytes));
|
||||
+ form_address(rscratch1, recv_klass, vtable_offset_in_bytes, 0));
|
||||
}
|
||||
}
|
||||
|
@ -204,7 +204,7 @@
|
||||
# note, following three variables are sedded from update_sources if used correctly. Hardcode them rather there.
|
||||
%global project aarch64-port
|
||||
%global repo jdk8u
|
||||
%global revision aarch64-jdk8u161-b14
|
||||
%global revision aarch64-jdk8u162-b12
|
||||
# eg # jdk8u60-b27 -> jdk8u60 or # aarch64-jdk8u60-b27 -> aarch64-jdk8u60 (dont forget spec escape % by %%)
|
||||
%global whole_update %(VERSION=%{revision}; echo ${VERSION%%-*})
|
||||
# eg jdk8u60 -> 60 or aarch64-jdk8u60 -> 60
|
||||
@ -937,7 +937,7 @@ Obsoletes: java-1.7.0-openjdk-accessibility%{?1}
|
||||
|
||||
Name: java-%{javaver}-%{origin}
|
||||
Version: %{javaver}.%{updatever}
|
||||
Release: 9.%{buildver}%{?dist}
|
||||
Release: 1.%{buildver}%{?dist}
|
||||
# java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons,
|
||||
# and this change was brought into RHEL-4. java-1.5.0-ibm packages
|
||||
# also included the epoch in their virtual provides. This created a
|
||||
@ -963,7 +963,7 @@ URL: http://openjdk.java.net/
|
||||
Source0: %{project}-%{repo}-%{revision}.tar.xz
|
||||
|
||||
# Shenandoah HotSpot
|
||||
Source1: aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u161-b14.tar.xz
|
||||
Source1: aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u162-b12.tar.xz
|
||||
|
||||
# Custom README for -src subpackage
|
||||
Source2: README.src
|
||||
@ -1077,33 +1077,6 @@ Patch526: 6260348-pr3066.patch
|
||||
# 8061305, PR3335, RH1423421: Javadoc crashes when method name ends with "Property"
|
||||
Patch538: 8061305-pr3335-rh1423421.patch
|
||||
|
||||
# Patches upstream and appearing in 8u162
|
||||
# 8181055, PR3394, RH1448880: PPC64: "mbind: Invalid argument" still seen after 8175813
|
||||
Patch551: 8181055-pr3394-rh1448880.patch
|
||||
# 8181419, PR3413, RH1463144: Race in jdwp invoker handling may lead to crashes or invalid results
|
||||
Patch553: 8181419-pr3413-rh1463144.patch
|
||||
# 8145913, PR3466, RH1498309: PPC64: add Montgomery multiply intrinsic
|
||||
Patch556: 8145913-pr3466-rh1498309.patch
|
||||
# 8168318, PR3466, RH1498320: PPC64: Use cmpldi instead of li/cmpld
|
||||
Patch557: 8168318-pr3466-rh1498320.patch
|
||||
# 8170328, PR3466, RH1498321: PPC64: Use andis instead of lis/and
|
||||
Patch558: 8170328-pr3466-rh1498321.patch
|
||||
# 8181810, PR3466, RH1498319: PPC64: Leverage extrdi for bitfield extract
|
||||
Patch559: 8181810-pr3466-rh1498319.patch
|
||||
|
||||
# Aarch64 build fixes after January 2018 CPU
|
||||
#
|
||||
# JDK-8195685 AArch64 cannot build with JDK-8174962 (already included in source tarball)
|
||||
# JDK-8196136 AArch64: Correct register use in patch for JDK-8195685
|
||||
# JDK-8195859 AArch64: vtableStubs gtest fails after 8174962
|
||||
# JDK-8196221 AArch64: Mistake in committed patch for JDK-8195859
|
||||
Patch570: JDK-8196136-correct-register-use-8195685.patch
|
||||
Patch571: JDK-8195859-vtableStubs-gtest-fails-after-8174962.patch
|
||||
Patch572: JDK-8196221-mistake-in-8195859.patch
|
||||
|
||||
Patch573: rhbz_1540242.patch
|
||||
Patch574: rhbz_1540242_2.patch
|
||||
|
||||
# Patches ineligible for 8u
|
||||
# 8043805: Allow using a system-installed libjpeg
|
||||
Patch201: system-libjpeg.patch
|
||||
@ -1503,29 +1476,11 @@ sh %{SOURCE12}
|
||||
%patch526
|
||||
%patch528
|
||||
%patch538
|
||||
%patch551
|
||||
%patch553
|
||||
%patch560
|
||||
pushd openjdk/jdk
|
||||
%patch561 -p1
|
||||
popd
|
||||
|
||||
# PPC64 updates
|
||||
%patch556
|
||||
%patch557
|
||||
%patch558
|
||||
%patch559
|
||||
|
||||
pushd openjdk/hotspot
|
||||
# Aarch64 build fixes after January 2018 CPU
|
||||
%patch570 -p1
|
||||
%patch571 -p1
|
||||
%patch572 -p1
|
||||
|
||||
# Zero/AArch64 fix for RHBZ#1540242
|
||||
%patch573 -p1
|
||||
%patch574 -p1
|
||||
popd
|
||||
|
||||
# RPM-only fixes
|
||||
%patch525
|
||||
@ -2158,6 +2113,13 @@ require "copy_jdk_configs.lua"
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Wed Mar 21 2018 Andrew Hughes <gnu.andrew@redhat.com> - 1:1.8.0.162-1.b12
|
||||
- Update to aarch64-jdk8u162-b12 and aarch64-shenandoah-jdk8u162-b12.
|
||||
- Remove upstreamed patches for 8181055/PR3394/RH1448880,
|
||||
- 8181419/PR3413/RH1463144, 8145913/PR3466/RH1498309,
|
||||
- 8168318/PR3466/RH1498320, 8170328/PR3466/RR1498321 and
|
||||
- 8181810/PR3466/RH1498319.
|
||||
|
||||
* Wed Mar 07 2018 Adam Williamson <awilliam@redhat.com> - 1:1.8.0.161-9.b14
|
||||
- Rebuild to fix GCC 8 mis-compilation
|
||||
See https://da.gd/YJVwk ("GCC 8 ABI change on x86_64")
|
||||
|
@ -1,22 +0,0 @@
|
||||
diff --git a/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
--- a/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
+++ b/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
@@ -698,6 +698,7 @@
|
||||
|
||||
extern "C" {
|
||||
int SpinPause() {
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
void _Copy_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
|
||||
diff --git a/src/os_cpu/linux_zero/vm/os_linux_zero.cpp b/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
|
||||
--- a/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
|
||||
+++ b/src/os_cpu/linux_zero/vm/os_linux_zero.cpp
|
||||
@@ -408,6 +408,7 @@
|
||||
|
||||
extern "C" {
|
||||
int SpinPause() {
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
|
@ -1,59 +0,0 @@
|
||||
diff --git a/src/cpu/aarch64/vm/assembler_aarch64.hpp b/src/cpu/aarch64/vm/assembler_aarch64.hpp
|
||||
--- a/src/cpu/aarch64/vm/assembler_aarch64.hpp
|
||||
+++ b/src/cpu/aarch64/vm/assembler_aarch64.hpp
|
||||
@@ -2529,6 +2529,8 @@
|
||||
virtual RegisterOrConstant delayed_value_impl(intptr_t* delayed_value_addr,
|
||||
Register tmp,
|
||||
int offset) {
|
||||
+ ShouldNotCallThis();
|
||||
+ return RegisterOrConstant();
|
||||
}
|
||||
|
||||
// Stack overflow checking
|
||||
diff --git a/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp b/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
|
||||
--- a/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
|
||||
+++ b/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
|
||||
@@ -209,6 +209,7 @@
|
||||
|
||||
Address LIR_Assembler::as_Address_hi(LIR_Address* addr) {
|
||||
ShouldNotReachHere();
|
||||
+ return Address();
|
||||
}
|
||||
|
||||
Address LIR_Assembler::as_Address(LIR_Address* addr) {
|
||||
diff --git a/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp b/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||||
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||||
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.hpp
|
||||
@@ -434,8 +434,8 @@
|
||||
void mov(Register dst, Address a);
|
||||
|
||||
public:
|
||||
- int push(RegSet regs, Register stack) { if (regs.bits()) push(regs.bits(), stack); }
|
||||
- int pop(RegSet regs, Register stack) { if (regs.bits()) pop(regs.bits(), stack); }
|
||||
+ void push(RegSet regs, Register stack) { if (regs.bits()) push(regs.bits(), stack); }
|
||||
+ void pop(RegSet regs, Register stack) { if (regs.bits()) pop(regs.bits(), stack); }
|
||||
|
||||
// Push and pop everything that might be clobbered by a native
|
||||
// runtime call except rscratch1 and rscratch2. (They are always
|
||||
diff --git a/src/cpu/aarch64/vm/nativeInst_aarch64.hpp b/src/cpu/aarch64/vm/nativeInst_aarch64.hpp
|
||||
--- a/src/cpu/aarch64/vm/nativeInst_aarch64.hpp
|
||||
+++ b/src/cpu/aarch64/vm/nativeInst_aarch64.hpp
|
||||
@@ -220,6 +220,7 @@
|
||||
else if (is_ldr_literal_at(instruction_address()))
|
||||
return(addr_at(4));
|
||||
assert(false, "Unknown instruction in NativeMovConstReg");
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
intptr_t data() const;
|
||||
diff --git a/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp b/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
--- a/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
+++ b/src/os_cpu/linux_aarch64/vm/os_linux_aarch64.cpp
|
||||
@@ -472,6 +472,7 @@
|
||||
err.report_and_die();
|
||||
|
||||
ShouldNotReachHere();
|
||||
+ return true; // Mute compiler
|
||||
}
|
||||
|
||||
void os::Linux::init_thread_fpu_state(void) {
|
4
sources
4
sources
@ -1,3 +1,3 @@
|
||||
SHA512 (systemtap-tapset-3.6.0pre02.tar.xz) = d59858bbe9e927bdf47711e3c71c88f93567596aea3e1736b33b436a7a2cb38af25a9b4b4224ca513454b3f2d0371d14e753176c1810d9745a7e4af8edae7fb8
|
||||
SHA512 (aarch64-port-jdk8u-aarch64-jdk8u161-b14.tar.xz) = f60836acdf2a38961e1f8299b4c5274f0201a0e365c37f107e8793640f691e6fef9a03daa0172aa192eddab6db86e9ea904aa0da2abd4d5a75aa147af59d715e
|
||||
SHA512 (aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u161-b14.tar.xz) = da15dbe6c02233d5c172cf862090f335e499fde97dd3a93cd15d6011b7f27864b1af3c58d3677bcf2aef763c3ca60bc97c2223990133ec4d073e5a93fb969053
|
||||
SHA512 (aarch64-port-jdk8u-aarch64-jdk8u162-b12.tar.xz) = 5bb05e931a57c25c627fa0b588b74ab89e050e6d0a0b7073ba1d65aa3a3ee9f5d5e62e1fbfe3da55a472ecb3dad9cec3a6faf73b5d95b59bcefa2246caddcab3
|
||||
SHA512 (aarch64-port-jdk8u-shenandoah-aarch64-shenandoah-jdk8u162-b12.tar.xz) = 833a4516fc3b68fedb78feddd272d7f52e9af90aeebc3eb95aa4a86d69b4540e14ad73fdd913b7201c9663c2f136cfe3ec2e2d3b8d39cf1e99ec1c7711079740
|
||||
|
@ -31,7 +31,7 @@ if [ "x$REPO_NAME" = "x" ] ; then
|
||||
REPO_NAME="jdk8u"
|
||||
fi
|
||||
if [ "x$VERSION" = "x" ] ; then
|
||||
VERSION="aarch64-jdk8u151-b12"
|
||||
VERSION="aarch64-jdk8u162-b12"
|
||||
fi
|
||||
|
||||
if [ "x$COMPRESSION" = "x" ] ; then
|
||||
@ -109,7 +109,7 @@ if [ "x$VERSION" = "xtip" ] ; then
|
||||
VERSION="tip"
|
||||
else
|
||||
#hardcoding version for anything else except tip
|
||||
VERSION="aarch64-shenandoah-jdk8u151-b12"
|
||||
VERSION="aarch64-shenandoah-jdk8u162-b12"
|
||||
fi
|
||||
MAIN_REPO_NAME=$REPO_NAME
|
||||
REPO_NAME=jdk8u-shenandoah
|
||||
|
Loading…
Reference in New Issue
Block a user