diff options
Diffstat (limited to 'usr/klibc/jrand48.c')
-rw-r--r-- | usr/klibc/jrand48.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/usr/klibc/jrand48.c b/usr/klibc/jrand48.c new file mode 100644 index 0000000..8e2b3ac --- /dev/null +++ b/usr/klibc/jrand48.c @@ -0,0 +1,24 @@ +/* + * jrand48.c + */ + +#include <stdlib.h> +#include <stdint.h> + +long jrand48(unsigned short xsubi[3]) +{ + uint64_t x; + + /* The xsubi[] array is littleendian by spec */ + x = (uint64_t) (uint16_t) xsubi[0] + + ((uint64_t) (uint16_t) xsubi[1] << 16) + + ((uint64_t) (uint16_t) xsubi[2] << 32); + + x = (0x5deece66dULL * x) + 0xb; + + xsubi[0] = (unsigned short)(uint16_t) x; + xsubi[1] = (unsigned short)(uint16_t) (x >> 16); + xsubi[2] = (unsigned short)(uint16_t) (x >> 32); + + return (long)(int32_t) (x >> 16); +} |