Line data Source code
1 1 : /** 2 : * @file lib/random/xoroshiro.h 3 : * 4 : * @brief Xoroshiro RNG support functions 5 : * 6 : * Xoroshiro RNG support functions. 7 : * 8 : * SPDX-FileCopyrightText: 2008-2021 D. Blackman and S. Vigna <vigna@acm.org> 9 : * SPDX-License-Identifier: CC0-1.0 10 : */ 11 : #pragma once 12 : 13 : #include <stdint.h> 14 : 15 0 : #define rotl(x, k) (((x) << (k)) | ((x) >> (64 - (k)))) 16 : 17 0 : #define random_u64(rng_s) \ 18 : __extension__ ({ \ 19 : const uint64_t __res = rotl((rng_s)[1] * 5, 7) * 9; \ 20 : const uint64_t __t = (rng_s)[1] << 17; \ 21 : \ 22 : (rng_s)[2] ^= (rng_s)[0]; \ 23 : (rng_s)[3] ^= (rng_s)[1]; \ 24 : (rng_s)[1] ^= (rng_s)[2]; \ 25 : (rng_s)[0] ^= (rng_s)[3]; \ 26 : (rng_s)[2] ^= __t; \ 27 : (rng_s)[3] = rotl((rng_s)[3], 45); \ 28 : \ 29 : __res; \ 30 : }) 31 : 32 : // FIXME: this is a very poor way to seed the generator 33 0 : #define random_init(rng_s, llid, seed) \ 34 : __extension__ ({ \ 35 : (rng_s)[0] = (llid + 1) * UINT64_C(16232384076195101791) ^ seed;\ 36 : (rng_s)[1] = (llid + 1) * UINT64_C(13983006573105492179) ^ seed;\ 37 : (rng_s)[2] = (llid + 1) * UINT64_C(10204677566545858177) ^ seed;\ 38 : (rng_s)[3] = (llid + 1) * UINT64_C(14539058011249359317) ^ seed;\ 39 : unsigned __i = 1024; \ 40 : while (__i--) \ 41 : random_u64((rng_s)); \ 42 : }) 43 :