+ uint32_t last;
+
+ last = util_rand_state[0] - util_rand_rot(util_rand_state[1], 27);
+ util_rand_state[0] = util_rand_state[1] ^ util_rand_rot(util_rand_state[2], 17);
+ util_rand_state[1] = util_rand_state[2] + util_rand_state[3];
+ util_rand_state[2] = util_rand_state[3] + last;
+ util_rand_state[3] = util_rand_state[0] + last;
+
+ return util_rand_state[3];
+}
+
+#undef util_rand_rot
+
+void util_seed(uint32_t value) {
+ size_t i;
+
+ util_rand_state[0] = 0xF1EA5EED;
+ util_rand_state[1] = value;
+ util_rand_state[2] = value;
+ util_rand_state[3] = value;
+
+ for (i = 0; i < 20; ++i)
+ (void)util_rand();