From adc429d4edced32592a1ddfcc98d7bbdee0764c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20P=C3=A9pin?= Date: Wed, 6 May 2020 15:11:45 +0200 Subject: [PATCH] Remove duplicate code --- src/splitmix/dune | 8 +++++++- src/splitmix/reference.c | 16 ++++++++++++---- src/splitmix/reference.h | 4 +++- src/splitmix/stubs.c | 7 ++++--- src/xoshiro/dune | 9 ++++++++- src/xoshiro/reference.c | 10 ++-------- 6 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/splitmix/dune b/src/splitmix/dune index 62a2772..fbd8277 100644 --- a/src/splitmix/dune +++ b/src/splitmix/dune @@ -1,9 +1,15 @@ (library (name splitmix) - (foreign_stubs (language c) (names reference stubs)) + (foreign_archives splitmix) + (foreign_stubs (language c) (names stubs)) (libraries makeRandom) (modules :standard \ Tests)) +(foreign_library + (archive_name splitmix) + (language c) + (names reference)) + (test (name tests) (modules Tests) diff --git a/src/splitmix/reference.c b/src/splitmix/reference.c index d653006..f9897ff 100644 --- a/src/splitmix/reference.c +++ b/src/splitmix/reference.c @@ -2,12 +2,20 @@ #include -uint64_t sm64_state; /* The state can be seeded with any value. */ - -uint64_t sm64_next() { - uint64_t z = (sm64_state += 0x9e3779b97f4a7c15); +uint64_t sm64_next_stateless(uint64_t* s) { + uint64_t z = (*s += 0x9e3779b97f4a7c15); z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; z = (z ^ (z >> 27)) * 0x94d049bb133111eb; return z ^ (z >> 31); } +static uint64_t state; /* The state can be seeded with any value. */ + +void sm64_seed(uint64_t seed) { + state = seed; +} + +uint64_t sm64_next() { + return sm64_next_stateless(&state); +} + diff --git a/src/splitmix/reference.h b/src/splitmix/reference.h index aef2394..0c8e72f 100644 --- a/src/splitmix/reference.h +++ b/src/splitmix/reference.h @@ -3,7 +3,9 @@ #include -uint64_t sm64_state; +uint64_t sm64_next_stateless(uint64_t*); + +void sm64_seed(uint64_t); uint64_t sm64_next(); #endif diff --git a/src/splitmix/stubs.c b/src/splitmix/stubs.c index daf31ed..b5e5595 100644 --- a/src/splitmix/stubs.c +++ b/src/splitmix/stubs.c @@ -1,15 +1,16 @@ +#include +#include "reference.h" + #define CAML_NAME_SPACE #include #include #include -#include -#include "reference.h" CAMLprim value caml_sm64_seed(value seed) { CAMLparam1(seed); int64_t x = Int64_val(seed); // reinterpret x as an unsigned integer - sm64_state = *(uint64_t*)(&x); + sm64_seed(*(uint64_t*)(&x)); CAMLreturn(Val_unit); } diff --git a/src/xoshiro/dune b/src/xoshiro/dune index ceca707..ef6506c 100644 --- a/src/xoshiro/dune +++ b/src/xoshiro/dune @@ -1,3 +1,10 @@ (library (name xoshiro) - (foreign_stubs (language c) (names stubs reference))) + (foreign_archives xoshiro) + (foreign_stubs (language c) (names stubs))) + +(foreign_library + (archive_name xoshiro) + (language c) + (flags -lsplitmix) + (names reference)) diff --git a/src/xoshiro/reference.c b/src/xoshiro/reference.c index dc03d63..0d0984f 100644 --- a/src/xoshiro/reference.c +++ b/src/xoshiro/reference.c @@ -1,6 +1,7 @@ // Reference: http://prng.di.unimi.it/xoshiro256plusplus.c #include +#include "../splitmix/reference.h" static inline uint64_t rotl(const uint64_t x, int k) { return (x << k) | (x >> (64 - k)); @@ -30,16 +31,9 @@ uint64_t x256pp_next(void) { return result; } -static uint64_t splitmix64(uint64_t* s) { - uint64_t z = (*s += 0x9e3779b97f4a7c15); - z = (z ^ (z >> 30)) * 0xbf58476d1ce4e5b9; - z = (z ^ (z >> 27)) * 0x94d049bb133111eb; - return z ^ (z >> 31); -} - void x256pp_seed(uint64_t seed) { uint64_t s = seed; for (int i = 0; i < 4; i++) - x256pp_state[i] = splitmix64(&s); + x256pp_state[i] = sm64_next_stateless(&s); }