forked from ocaml-wasm/wasm_of_ocaml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
prng.js
68 lines (67 loc) · 1.61 KB
/
prng.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//Provides: caml_lxm_next
//Requires: caml_int64_shift_left
//Requires: caml_int64_shift_right_unsigned
//Requires: caml_int64_or
//Requires: caml_int64_xor
//Requires: caml_int64_add
//Requires: caml_int64_mul
//Requires: caml_ba_get_1
//Requires: caml_ba_set_1
//Requires: caml_int64_of_string
//Requires: caml_new_string
function caml_lxm_next(v) {
function shift_l(x, k){
return caml_int64_shift_left(x,k);
}
function shift_r(x, k){
return caml_int64_shift_right_unsigned(x,k);
}
function or(a, b){
return caml_int64_or(a,b);
}
function xor(a, b){
return caml_int64_xor(a,b);
}
function add(a, b){
return caml_int64_add(a,b);
}
function mul(a, b){
return caml_int64_mul(a,b);
}
function rotl(x, k) {
return or(shift_l(x,k),shift_r (x, 64 - k));
}
function get(a, i) {
return caml_ba_get_1(a, i);
}
function set(a, i, x) {
return caml_ba_set_1(a, i, x);
}
var M = caml_int64_of_string(caml_new_string("0xd1342543de82ef95"));
var daba = caml_int64_of_string(caml_new_string("0xdaba0b6eb09322e3"));
var z, q0, q1;
var st = v;
var a = get(st,0);
var s = get(st,1);
var x0 = get(st,2);
var x1 = get(st,3);
/* Combining operation */
z = add(s, x0);
/* Mixing function */
z = mul(xor(z,shift_r(z,32)), daba);
z = mul(xor(z,shift_r(z,32)), daba);
z = xor(z,shift_r(z,32));
/* LCG update */
set(st, 1, add (mul(s,M), a));
/* XBG update */
var q0 = x0
var q1 = x1
q1 = xor(q1,q0);
q0 = rotl(q0, 24);
q0 = xor(xor(q0, q1), (shift_l(q1,16)));
q1 = rotl(q1, 37);
set(st, 2, q0);
set(st, 3, q1);
/* Return result */
return z;
}