Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
318a481
8333743: Change .jcheck/conf branches property to match valid branches
GoeLin Jul 29, 2026
9f924d4
8382471: Improve Resource Resolving
Aug 7, 2026
b01f43a
8384708: Enhance HTTP Connections
Aug 7, 2026
a301d29
8386205: Enhance TLS server
Aug 7, 2026
c35a8d5
8389947: [17u] Remove designator DEFAULT_PROMOTED_VERSION_PRE=ea for …
RealCLanger Aug 7, 2026
5973788
8350589: Investigate cleaner implementation of AArch64 ML-DSA intrins…
GoeLin Aug 12, 2026
b94803b
8381937: Make exceptions in Java_sun_security_mscapi_CKeyPairGenerato…
MBaesken Aug 13, 2026
c086553
8349721: Add aarch64 intrinsics for ML-KEM
GoeLin Aug 13, 2026
af1a0e7
8353478: Update crypto microbenchmarks to cover ML-DSA, ML-KEM, and H…
GoeLin Aug 15, 2026
fdc98f9
8347606: Optimize Java implementation of ML-DSA
GoeLin Aug 15, 2026
ace89ab
8347608: Optimize Java implementation of ML-KEM
GoeLin Aug 15, 2026
5ef54a0
8361125: Fix typo in onTradAbsence
GoeLin Aug 15, 2026
ece9352
8390325: [17u] test/jdk/sun/security/x509/GeneralName/DNSNameTest.jav…
rm-gh-8 Aug 17, 2026
dead9fb
7067310: 3 tests from closed/javax/sound/sampled caused BSOD on win 7…
rm-gh-8 Aug 17, 2026
0244403
8389492: [21u] java/io/Serializable/records/ProhibitedMethods.java fa…
rm-gh-8 Aug 17, 2026
3c5e495
8378506: [macOS] Window content not updated when rendering to multipl…
rm-gh-8 Aug 17, 2026
90d5304
8354305: SHAKE128 and SHAKE256 MessageDigest algorithms
rm-gh-8 Aug 18, 2026
5aa86b5
8356051: Update SignatureUtil.java with the new KnownOIDs
rm-gh-8 Aug 18, 2026
352633b
Merge
GoeLin Aug 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .jcheck/conf
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ warning=issuestitle,binary

[repository]
tags=(?:jdk-(?:[1-9]([0-9]*)(?:\.(?:0|[1-9][0-9]*)){0,4})(?:\+(?:(?:[0-9]+))|(?:-ga)))|(?:jdk[4-9](?:u\d{1,3})?-(?:(?:b\d{2,3})|(?:ga)))|(?:hs\d\d(?:\.\d{1,2})?-b\d\d)
branches=
branches=.*

[census]
version=0
Expand Down
1 change: 1 addition & 0 deletions src/hotspot/cpu/aarch64/register_aarch64.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,4 @@ const char* PRegisterImpl::name() const {
};
return is_valid() ? names[encoding()] : "noreg";
}

131 changes: 131 additions & 0 deletions src/hotspot/cpu/aarch64/register_aarch64.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -430,4 +430,135 @@ inline Register as_Register(FloatRegister reg) {
return as_Register(reg->encoding());
}

// AArch64 Vector Register Sequence management support
//
// VSeq implements an indexable (by operator[]) vector register
// sequence starting from a fixed base register and with a fixed delta
// (defaulted to 1, but sometimes 0 or 2) e.g. VSeq<4>(16) will return
// registers v16, ... v19 for indices 0, ... 3.
//
// Generator methods may iterate across sets of VSeq<4> to schedule an
// operation 4 times using distinct input and output registers,
// profiting from 4-way instruction parallelism.
//
// A VSeq<2> can be used to specify registers loaded with special
// constants e.g. <v30, v31> --> <MONT_Q, MONT_Q_INV_MOD_R>.
//
// A VSeq with base n and delta 0 can be used to generate code that
// combines values in another VSeq with the constant in register vn.
//
// A VSeq with base n and delta 2 can be used to select an odd or even
// indexed set of registers.
//
// Methods which accept arguments of type VSeq<8>, may split their
// inputs into front and back halves or odd and even halves (see
// convenience methods below).

// helper macro for computing register masks
#define VS_MASK_BIT(base, delta, i) (1 << (base + delta * i))

template<int N> class VSeq {
static_assert(N >= 2, "vector sequence length must be greater than 1");
private:
int _base; // index of first register in sequence
int _delta; // increment to derive successive indices
public:
VSeq(FloatRegister base_reg, int delta = 1) : VSeq(base_reg->encoding(), delta) { }
VSeq(int base, int delta = 1) : _base(base), _delta(delta) {
assert (_base >= 0 && _base <= 31, "invalid base register");
assert ((_base + (N - 1) * _delta) >= 0, "register range underflow");
assert ((_base + (N - 1) * _delta) < 32, "register range overflow");
}
// indexed access to sequence
FloatRegister operator [](int i) const {
assert (0 <= i && i < N, "index out of bounds");
return as_FloatRegister(_base + i * _delta);
}
int mask() const {
int m = 0;
for (int i = 0; i < N; i++) {
m |= VS_MASK_BIT(_base, _delta, i);
}
return m;
}
int base() const { return _base; }
int delta() const { return _delta; }
bool is_constant() const { return _delta == 0; }
};

// methods for use in asserts to check VSeq inputs and outputs are
// either disjoint or equal

template<int N, int M> bool vs_disjoint(const VSeq<N>& n, const VSeq<M>& m) { return (n.mask() & m.mask()) == 0; }
template<int N> bool vs_same(const VSeq<N>& n, const VSeq<N>& m) { return n.mask() == m.mask(); }

// method for use in asserts to check whether registers appearing in
// an output sequence will be written before they are read from an
// input sequence.

template<int N> bool vs_write_before_read(const VSeq<N>& vout, const VSeq<N>& vin) {
int b_in = vin.base();
int d_in = vin.delta();
int b_out = vout.base();
int d_out = vout.delta();
int bit_in = 1 << b_in;
int bit_out = 1 << b_out;
int mask_read = vin.mask(); // all pending reads
int mask_write = 0; // no writes as yet


for (int i = 0; i < N - 1; i++) {
// check whether a pending read clashes with a write
if ((mask_write & mask_read) != 0) {
return true;
}
// remove the pending input (so long as this is a constant
// sequence)
if (d_in != 0) {
mask_read ^= VS_MASK_BIT(b_in, d_in, i);
}
// record the next write
mask_write |= VS_MASK_BIT(b_out, d_out, i);
}
// no write before read
return false;
}

// convenience methods for splitting 8-way or 4-way vector register
// sequences in half -- needed because vector operations can normally
// benefit from 4-way instruction parallelism or, occasionally, 2-way
// parallelism

template<int N>
VSeq<N/2> vs_front(const VSeq<N>& v) {
static_assert(N > 0 && ((N & 1) == 0), "sequence length must be even");
return VSeq<N/2>(v.base(), v.delta());
}

template<int N>
VSeq<N/2> vs_back(const VSeq<N>& v) {
static_assert(N > 0 && ((N & 1) == 0), "sequence length must be even");
return VSeq<N/2>(v.base() + N / 2 * v.delta(), v.delta());
}

template<int N>
VSeq<N/2> vs_even(const VSeq<N>& v) {
static_assert(N > 0 && ((N & 1) == 0), "sequence length must be even");
return VSeq<N/2>(v.base(), v.delta() * 2);
}

template<int N>
VSeq<N/2> vs_odd(const VSeq<N>& v) {
static_assert(N > 0 && ((N & 1) == 0), "sequence length must be even");
return VSeq<N/2>(v.base() + v.delta(), v.delta() * 2);
}

// convenience method to construct a vector register sequence that
// indexes its elements in reverse order to the original

template<int N>
VSeq<N> vs_reverse(const VSeq<N>& v) {
return VSeq<N>(v.base() + (N - 1) * v.delta(), -v.delta());
}

#endif // CPU_AARCH64_REGISTER_AARCH64_HPP
Loading
Loading