protected static void implMultiply(long[] x, long[] y, long[] zz)
{
long f0 = x[0], f1 = x[1];
f1 = ((f0 >>> 57) ^ (f1 << 7)) & M57;
f0 &= M57;
long g0 = y[0], g1 = y[1];
g1 = ((g0 >>> 57) ^ (g1 << 7)) & M57;
g0 &= M57;
long[] H = new long[6];
implMulw(f0, g0, H, 0);
implMulw(f1, g1, H, 2);
implMulw(f0 ^ f1, g0 ^ g1, H, 4);
long r = H[1] ^ H[2];
long z0 = H[0],
z3 = H[3],
z1 = H[4] ^ z0 ^ r,
z2 = H[5] ^ z3 ^ r;
zz[0] = z0 ^ (z1 << 57);
zz[1] = (z1 >>> 7) ^ (z2 << 50);
zz[2] = (z2 >>> 14) ^ (z3 << 43);
zz[3] = (z3 >>> 21);
}