summaryrefslogtreecommitdiffstats
path: root/usr/klibc/jrand48.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/klibc/jrand48.c')
-rw-r--r--usr/klibc/jrand48.c24
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);
+}