in commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/L128X256Mix.java [163:208]
public long next() {
// LXM generate.
// Old state is used for the output allowing parallel pipelining
// on processors that support multiple concurrent instructions.
long s0 = x0;
final long sh = lsh;
// Mix
final long z = LXMSupport.lea64(sh + s0);
// LCG update
// The LCG is, in effect, "s = m * s + a" where m = ((1LL << 64) + ML)
final long sl = lsl;
final long al = lal;
final long u = ML * sl;
// High half
lsh = ML * sh + LXMSupport.unsignedMultiplyHigh(ML, sl) + sl + lah +
// Carry propagation
LXMSupport.unsignedAddHigh(u, al);
// Low half
lsl = u + al;
// XBG update
long s1 = x1;
long s2 = x2;
long s3 = x3;
final long t = s1 << 17;
s2 ^= s0;
s3 ^= s1;
s1 ^= s2;
s0 ^= s3;
s2 ^= t;
s3 = Long.rotateLeft(s3, 45);
x0 = s0;
x1 = s1;
x2 = s2;
x3 = s3;
return z;
}