]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/contrib/openzfs/module/zfs/vdev_draid_rand.c
MFV 7b495a2a7abf (zlib): Correct incorrect inputs provided to the CRC
[FreeBSD/FreeBSD.git] / sys / contrib / openzfs / module / zfs / vdev_draid_rand.c
1 /*
2  * Xorshift Pseudo Random Number Generator based on work by David Blackman
3  * and Sebastiano Vigna (vigna@acm.org).
4  *
5  *   "Further scramblings of Marsaglia's xorshift generators"
6  *   http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf
7  *   http://prng.di.unimi.it/xoroshiro128plusplus.c
8  *
9  * To the extent possible under law, the author has dedicated all copyright
10  * and related and neighboring rights to this software to the public domain
11  * worldwide. This software is distributed without any warranty.
12  *
13  * See <http://creativecommons.org/publicdomain/zero/1.0/>.
14  *
15  * This is xoroshiro128++ 1.0, one of our all-purpose, rock-solid,
16  * small-state generators. It is extremely (sub-ns) fast and it passes all
17  * tests we are aware of, but its state space is large enough only for
18  * mild parallelism.
19  */
20
21 #include <sys/vdev_draid.h>
22
23 static inline uint64_t rotl(const uint64_t x, int k)
24 {
25         return (x << k) | (x >> (64 - k));
26 }
27
28 uint64_t
29 vdev_draid_rand(uint64_t *s)
30 {
31         const uint64_t s0 = s[0];
32         uint64_t s1 = s[1];
33         const uint64_t result = rotl(s0 + s1, 17) + s0;
34
35         s1 ^= s0;
36         s[0] = rotl(s0, 49) ^ s1 ^ (s1 << 21); // a, b
37         s[1] = rotl(s1, 28); // c
38
39         return (result);
40 }