redrust/
mt19937_64.rs

1extern crate c2rust_bitfields;
2extern crate libc;
3extern crate core;
4static mut mt: [libc::c_ulonglong; 312] = [0; 312];
5static mut mti: libc::c_int = 312 as libc::c_int + 1 as libc::c_int;
6#[no_mangle]
7pub unsafe extern "C" fn init_genrand64(mut seed: libc::c_ulonglong) {
8    mt[0 as libc::c_int as usize] = seed;
9    mti = 1 as libc::c_int;
10    while mti < 312 as libc::c_int {
11        mt[mti
12            as usize] = (6364136223846793005 as libc::c_ulonglong)
13            .wrapping_mul(
14                mt[(mti - 1 as libc::c_int) as usize]
15                    ^ mt[(mti - 1 as libc::c_int) as usize] >> 62 as libc::c_int,
16            )
17            .wrapping_add(mti as libc::c_ulonglong);
18        mti += 1;
19    }
20}
21#[no_mangle]
22pub unsafe extern "C" fn init_by_array64(
23    mut init_key: *mut libc::c_ulonglong,
24    mut key_length: libc::c_ulonglong,
25) {
26    let mut i: libc::c_ulonglong = 0;
27    let mut j: libc::c_ulonglong = 0;
28    let mut k: libc::c_ulonglong = 0;
29    init_genrand64(19650218 as libc::c_ulonglong);
30    i = 1 as libc::c_int as libc::c_ulonglong;
31    j = 0 as libc::c_int as libc::c_ulonglong;
32    k = if 312 as libc::c_int as libc::c_ulonglong > key_length {
33        312 as libc::c_int as libc::c_ulonglong
34    } else {
35        key_length
36    };
37    while k != 0 {
38        mt[i
39            as usize] = (mt[i as usize]
40            ^ (mt[i.wrapping_sub(1 as libc::c_int as libc::c_ulonglong) as usize]
41                ^ mt[i.wrapping_sub(1 as libc::c_int as libc::c_ulonglong) as usize]
42                    >> 62 as libc::c_int)
43                .wrapping_mul(3935559000370003845 as libc::c_ulonglong))
44            .wrapping_add(*init_key.offset(j as isize))
45            .wrapping_add(j);
46        i = i.wrapping_add(1);
47        j = j.wrapping_add(1);
48        if i >= 312 as libc::c_int as libc::c_ulonglong {
49            mt[0 as libc::c_int
50                as usize] = mt[(312 as libc::c_int - 1 as libc::c_int) as usize];
51            i = 1 as libc::c_int as libc::c_ulonglong;
52        }
53        if j >= key_length {
54            j = 0 as libc::c_int as libc::c_ulonglong;
55        }
56        k = k.wrapping_sub(1);
57    }
58    k = (312 as libc::c_int - 1 as libc::c_int) as libc::c_ulonglong;
59    while k != 0 {
60        mt[i
61            as usize] = (mt[i as usize]
62            ^ (mt[i.wrapping_sub(1 as libc::c_int as libc::c_ulonglong) as usize]
63                ^ mt[i.wrapping_sub(1 as libc::c_int as libc::c_ulonglong) as usize]
64                    >> 62 as libc::c_int)
65                .wrapping_mul(2862933555777941757 as libc::c_ulonglong))
66            .wrapping_sub(i);
67        i = i.wrapping_add(1);
68        if i >= 312 as libc::c_int as libc::c_ulonglong {
69            mt[0 as libc::c_int
70                as usize] = mt[(312 as libc::c_int - 1 as libc::c_int) as usize];
71            i = 1 as libc::c_int as libc::c_ulonglong;
72        }
73        k = k.wrapping_sub(1);
74    }
75    mt[0 as libc::c_int as usize] = (1 as libc::c_ulonglong) << 63 as libc::c_int;
76}
77#[no_mangle]
78pub unsafe extern "C" fn genrand64_int64() -> libc::c_ulonglong {
79    let mut i: libc::c_int = 0;
80    let mut x: libc::c_ulonglong = 0;
81    static mut mag01: [libc::c_ulonglong; 2] = [
82        0 as libc::c_ulonglong,
83        0xb5026f5aa96619e9 as libc::c_ulonglong,
84    ];
85    if mti >= 312 as libc::c_int {
86        if mti == 312 as libc::c_int + 1 as libc::c_int {
87            init_genrand64(5489 as libc::c_ulonglong);
88        }
89        i = 0 as libc::c_int;
90        while i < 312 as libc::c_int - 156 as libc::c_int {
91            x = mt[i as usize] & 0xffffffff80000000 as libc::c_ulonglong
92                | mt[(i + 1 as libc::c_int) as usize] & 0x7fffffff as libc::c_ulonglong;
93            mt[i
94                as usize] = mt[(i + 156 as libc::c_int) as usize] ^ x >> 1 as libc::c_int
95                ^ mag01[(x & 1 as libc::c_ulonglong) as libc::c_int as usize];
96            i += 1;
97        }
98        while i < 312 as libc::c_int - 1 as libc::c_int {
99            x = mt[i as usize] & 0xffffffff80000000 as libc::c_ulonglong
100                | mt[(i + 1 as libc::c_int) as usize] & 0x7fffffff as libc::c_ulonglong;
101            mt[i
102                as usize] = mt[(i + (156 as libc::c_int - 312 as libc::c_int)) as usize]
103                ^ x >> 1 as libc::c_int
104                ^ mag01[(x & 1 as libc::c_ulonglong) as libc::c_int as usize];
105            i += 1;
106        }
107        x = mt[(312 as libc::c_int - 1 as libc::c_int) as usize]
108            & 0xffffffff80000000 as libc::c_ulonglong
109            | mt[0 as libc::c_int as usize] & 0x7fffffff as libc::c_ulonglong;
110        mt[(312 as libc::c_int - 1 as libc::c_int)
111            as usize] = mt[(156 as libc::c_int - 1 as libc::c_int) as usize]
112            ^ x >> 1 as libc::c_int
113            ^ mag01[(x & 1 as libc::c_ulonglong) as libc::c_int as usize];
114        mti = 0 as libc::c_int;
115    }
116    let fresh0 = mti;
117    mti = mti + 1;
118    x = mt[fresh0 as usize];
119    x ^= x >> 29 as libc::c_int & 0x5555555555555555 as libc::c_ulonglong;
120    x ^= x << 17 as libc::c_int & 0x71d67fffeda60000 as libc::c_ulonglong;
121    x ^= x << 37 as libc::c_int & 0xfff7eee000000000 as libc::c_ulonglong;
122    x ^= x >> 43 as libc::c_int;
123    return x;
124}
125#[no_mangle]
126pub unsafe extern "C" fn genrand64_int63() -> libc::c_longlong {
127    return (genrand64_int64() >> 1 as libc::c_int) as libc::c_longlong;
128}
129#[no_mangle]
130pub unsafe extern "C" fn genrand64_real1() -> libc::c_double {
131    return (genrand64_int64() >> 11 as libc::c_int) as libc::c_double
132        * (1.0f64 / 9007199254740991.0f64);
133}
134#[no_mangle]
135pub unsafe extern "C" fn genrand64_real2() -> libc::c_double {
136    return (genrand64_int64() >> 11 as libc::c_int) as libc::c_double
137        * (1.0f64 / 9007199254740992.0f64);
138}
139#[no_mangle]
140pub unsafe extern "C" fn genrand64_real3() -> libc::c_double {
141    return ((genrand64_int64() >> 12 as libc::c_int) as libc::c_double + 0.5f64)
142        * (1.0f64 / 4503599627370496.0f64);
143}