compiler/ lib/ examples/ std/ arch/ rv64/ tests/ abi.sizes.rad 3.4 KiB aggregate.return.rad 4.0 KiB arith.assignment.rad 580 B arith.basic.rad 176 B arith.modulo.rad 96 B arith.subword.rad 3.8 KiB arith.sum.rad 177 B arith.w64.rad 4.1 KiB array.assign.rad 221 B array.bounds.check.rad 321 B array.index.assign.rad 367 B array.index.rad 249 B array.length.rad 262 B array.math.rad 1.2 KiB array.nested.assign.rad 319 B array.nested.rad 325 B array.record.elements.rad 1.7 KiB array.repeat.edge.rad 548 B array.repeat.rad 828 B array.return.rad 330 B array.slice.empty.rad 108 B array.slice.gen.end.rad 126 B array.slice.gen.index.rad 139 B array.slice.gen.open.rad 125 B array.slice.gen.start.end.rad 127 B array.slice.gen.start.rad 126 B array.slice.rad 759 B as.precedence.rad 212 B assert.basic.rad 387 B assert.fail.rad 138 B assert.false.rad 140 B assert.true.rad 100 B assign.mutable.rad 6.1 KiB assign.rad 129 B assign.shadow.mutable.rad 461 B binop.bitwise.rad 1.2 KiB binop.cmp.rad 426 B bool.comparison.array.rad 688 B bool.comparison.nested.gen.rad 1.0 KiB bool.comparison.opt.rad 905 B bool.comparison.record.gen.rad 1.0 KiB bool.comparison.record.rad 1.1 KiB bool.comparison.slice.gen.rad 157 B bool.comparison.slice.rad 4.1 KiB bool.comparison.slice.record.gen.rad 2.0 KiB bool.comparison.slice.union.gen.rad 2.5 KiB bool.comparison.union.ctor.rad 690 B bool.comparison.union.gen.rad 1.2 KiB bool.comparison.union.record.gen.rad 1.5 KiB bool.comparison.union.simple.gen.rad 281 B bool.operators.complex.rad 384 B bool.operators.rad 831 B bool.short.circuit.rad 2.3 KiB bool.simple.rad 194 B bool.values.rad 772 B builtin.size.align.rad 1.3 KiB builtin.sliceof.mut.rad 606 B builtin.sliceof.rad 505 B call.arg.clobber.rad 717 B call.basic.rad 241 B call.clobber.rad 462 B cast.same.size.rad 1.0 KiB casting.numbers.rad 1.5 KiB char.literal.rad 165 B compound.assign.field.rad 285 B compound.assign.rad 1.1 KiB cond.assign.rad 723 B cond.expr.aggregate.rad 1.1 KiB cond.expr.rad 1.8 KiB cond.for.else.break.rad 326 B cond.for.indexed.rad 238 B cond.for.rad 165 B cond.for.range.indexed.rad 526 B cond.for.range.rad 171 B cond.for.unsigned.range.rad 644 B cond.forever.break.continue.rad 182 B cond.forever.break.rad 232 B cond.fused.rad 926 B cond.if.case.rad 2.2 KiB cond.if.else.min.rad 143 B cond.if.else.rad 225 B cond.if.elseif.rad 420 B cond.if.noelse.rad 120 B cond.if.rad 865 B cond.match.fallthrough.rad 369 B cond.match.guard.rad 1.4 KiB cond.match.guard.regalloc.rad 1.3 KiB cond.while.else.break.rad 282 B cond.while.rad 119 B const.array.copy.mutate.rad 386 B const.array.rad 195 B const.basic.rad 325 B const.char.rad 159 B const.fn.array.rad 664 B const.record.array.rad 1.2 KiB const.record.array.simple.rad 523 B const.record.ctor.rad 170 B const.record.fn.rad 353 B const.record.rad 182 B const.slice.param.rad 333 B const.union.payload.ctor.rad 349 B const.union.record.literal.rad 359 B data.array.rad 767 B data.bool.rad 216 B data.i16.rad 261 B data.i32.rad 281 B data.i8.rad 248 B data.record.rad 561 B data.simple.rad 436 B data.u16.rad 220 B data.u32.rad 240 B data.u8.rad 208 B data.union.rad 886 B debug.tag.rad 557 B edge.cases.2.rad 337 B edge.cases.3.rad 594 B edge.cases.4.rad 1.2 KiB edge.cases.5.rad 1.0 KiB edge.cases.6.rad 2.6 KiB edge.cases.7.addr.bug.rad 224 B edge.cases.8.bug.rad 508 B edge.cases.rad 223 B error.basic.rad 159 B error.catch.rad 1.6 KiB error.division.zero.rad 164 B error.modulo.zero.rad 162 B error.multi.basic.rad 672 B error.multi.catch.rad 772 B error.multi.catch.typed.binding.rad 791 B error.multi.catch.typed.catchall.rad 1.0 KiB error.multi.catch.typed.rad 1.1 KiB error.multi.propagate.multi.rad 953 B error.multi.propagate.rad 825 B error.multi.try.optional.rad 507 B error.slice.bounds.rad 219 B error.try.bang.success.rad 370 B error.try.catch.binding.rad 2.0 KiB error.try.optional.rad 1.8 KiB error.try.rad 4.0 KiB fn.block.scope.rad 508 B fn.callback.nested.rad 1.2 KiB fn.default.rad 131 B fn.local.rad 140 B fn.recursion.2.rad 239 B fn.void.rad 150 B for.else.continue.rad 1.1 KiB frame.large.rad 567 B if-let-mut.rad 1.1 KiB iflet.shadow.leak.rad 317 B integer.bitwise.basic.rad 693 B integer.overflow.rad 1.8 KiB large.blit.store.rad 2.1 KiB let.guard.rad 1.9 KiB literal.w64.rad 1.7 KiB loc.addr.offset.bug.rad 410 B loc.addr.opt.to.opt.rad 433 B loc.addr.optional.assign.rad 408 B loc.addr.record.assign.rad 443 B loop.complex.flow.rad 1007 B loop.sealblock.rad 911 B match.array.rad 3.4 KiB match.char.rad 1.6 KiB match.multi.seal.rad 987 B match.multi.survive.rad 1.6 KiB match.mutref.push.rad 1.0 KiB match.mutref.union.rad 662 B match.nested.call.rad 1.7 KiB match.nested.deep.rad 2.2 KiB match.nested.deref.rad 3.7 KiB match.nested.guard.rad 1.6 KiB match.nested.iflet.guard.rad 1.6 KiB match.nested.iflet.rad 1.4 KiB match.nested.letelse.rad 813 B match.nested.letelse.union.rad 1.3 KiB match.nested.literal.rad 3.1 KiB match.nested.multi.rad 2.4 KiB match.nested.pattern.rad 5.2 KiB match.nested.record.rad 2.0 KiB match.nested.union.rad 2.3 KiB match.nested.whilelet.rad 2.4 KiB match.string.rad 1.8 KiB match.value.copy.rad 2.0 KiB match.void.then.or.rad 1.6 KiB memzero.result.bug.rad 806 B memzero.union.bug.rad 576 B mutref.loop.bug.rad 1.8 KiB opt.assignment.bug.rad 1.3 KiB opt.bug.test.rad 1.4 KiB opt.if.let.complex.rad 6.2 KiB opt.if.let.guard.rad 809 B opt.if.let.rad 956 B opt.nil.check.rad 1.5 KiB opt.record.eq.rad 842 B opt.record.rad 655 B opt.return.array.rad 289 B opt.return.nested.rad 797 B opt.return.record.rad 344 B opt.slice.npo.rad 2.8 KiB opt.type.rad 200 B opt.while.let.complex.rad 404 B panic.rad 111 B placeholder.basic.rad 133 B placeholder.comprehensive.rad 562 B pointer.copy.edge.case.rad 1.3 KiB pointer.slice.index.rad 269 B pointer.slice.store.rad 881 B prog.ackermann.rad 5.0 KiB prog.bignum.rad 9.4 KiB prog.binsearch.rad 2.4 KiB prog.bubblesort.rad 2.0 KiB prog.cordic.rad 6.9 KiB prog.crc32.rad 2.7 KiB prog.dijkstra.rad 7.7 KiB prog.eval.rad 6.2 KiB prog.hanoi.rad 3.8 KiB prog.huffman.rad 9.3 KiB prog.hybridsort.rad 3.0 KiB prog.linkedlist.rad 5.8 KiB prog.lzw.rad 6.7 KiB prog.matmul.rad 2.9 KiB prog.mersenne.rad 5.2 KiB prog.nqueens.rad 3.4 KiB prog.rbtree.rad 8.2 KiB prog.regex.rad 10.2 KiB prog.sha256.rad 7.0 KiB prog.sieve.rad 2.8 KiB prog.symtab.rad 10.1 KiB prog.tokenizer.rad 13.8 KiB prog.vm.rad 17.4 KiB ptr.assign.rad 137 B ptr.deref.rad 622 B ptr.eq.rad 966 B ptr.mutate.rad 244 B ptr.opaque.rad 1.4 KiB record.access.rad 285 B record.alignment.rad 179 B record.array.elements.rad 1.7 KiB record.copy.rad 2.0 KiB record.field.assign.rad 184 B record.nested.calls.2.rad 612 B record.nested.calls.3.rad 734 B record.param.lit.rad 353 B record.ptr.access.rad 227 B record.ptr.mutate.rad 243 B record.shorthand.rad 1.5 KiB record.unlabeled.rad 407 B ref.if.bug.rad 519 B ref.immut.loop.bug.rad 670 B ref.mut.ptr.rad 261 B regalloc.callee.save.rad 1.5 KiB regalloc.spill.reuse.rad 473 B reserve.loop.rad 392 B result.void.success.rad 716 B slice.alloc.loop.rad 788 B slice.append.rad 3.3 KiB slice.cap.rad 941 B slice.delete.rad 971 B slice.of.rad 460 B slice.subslice.rad 1.4 KiB spill.blockarg.clobber.rad 3.5 KiB spill.loop.rad 1.6 KiB stack.local.corrupt.rad 320 B static.array.mutate.rad 387 B static.basic.rad 327 B static.fn.array.rad 628 B static.record.array.rad 503 B static.slice.index.assign.rad 408 B static.slice.offset.rad 668 B string.basic.rad 149 B string.escape.rad 349 B string.index.rad 116 B switch.blockargs.clobber.rad 1.3 KiB trait.aggregate.ret.rad 1.5 KiB trait.array.optional.rad 1.7 KiB trait.basic.rad 565 B trait.control.flow.rad 1.1 KiB trait.fn.param.rad 1.6 KiB trait.multiple.methods.rad 1.2 KiB trait.multiple.traits.rad 1.2 KiB trait.multiple.types.rad 1.3 KiB trait.supertrait.rad 2.5 KiB trait.throws.rad 1.0 KiB trait.writer.rad 2.6 KiB type.unify.rad 4.5 KiB undefined.rad 417 B union-tag.rad 911 B union.bitfield.rad 1.2 KiB union.discriminant.cast.rad 389 B union.edge.case.2.rad 679 B union.edge.case.3.rad 608 B union.mixed.assign.rad 977 B union.payload.mutref.rad 1.4 KiB union.payload.rad 580 B union.record.forward.rad 1.3 KiB union.void.match.rad 403 B union.void.rad 824 B unsigned.compare.rad 1.9 KiB var.align.rad 1013 B var.infer.rad 549 B decode.rad 14.6 KiB emit.rad 24.4 KiB encode.rad 19.9 KiB isel.rad 41.1 KiB printer.rad 13.0 KiB tests.rad 15.7 KiB rv64.rad 13.0 KiB collections/ lang/ sys/ arch.rad 65 B collections.rad 36 B fmt.rad 3.8 KiB intrinsics.rad 206 B io.rad 1.2 KiB lang.rad 222 B mem.rad 2.2 KiB sys.rad 167 B testing.rad 2.4 KiB tests.rad 11.6 KiB vec.rad 3.1 KiB std.rad 231 B scripts/ seed/ test/ vim/ .gitignore 353 B .gitsigners 112 B LICENSE 1.1 KiB Makefile 3.1 KiB README 2.5 KiB std.lib 987 B std.lib.test 252 B
lib/std/arch/rv64/tests/prog.mersenne.rad 5.2 KiB raw
1
//! Mersenne Twister PRNG with statistical testing.
2
3
const N: u32 = 624;
4
const M: u32 = 397;
5
const MATRIX_A: u32 = 0x9908B0DF;
6
const UPPER_MASK: u32 = 0x80000000;
7
const LOWER_MASK: u32 = 0x7FFFFFFF;
8
9
record MtState {
10
    mt: *mut [u32],
11
    mti: u32,
12
}
13
14
fn mtInit(s: *mut MtState, seed: u32) {
15
    s.mt[0] = seed;
16
    let mut i: u32 = 1;
17
    while i < N {
18
        let prev: u32 = s.mt[i - 1];
19
        let xored: u32 = prev ^ (prev >> 30);
20
21
        let lo: u32 = xored & 0xFFFF;
22
        let hi: u32 = xored >> 16;
23
        let c: u32 = 1812433253;
24
        let clo: u32 = c & 0xFFFF;
25
        let chi: u32 = c >> 16;
26
27
        let ll: u32 = clo * lo;
28
        let lh: u32 = clo * hi;
29
        let hl: u32 = chi * lo;
30
31
        let result: u32 = ll + ((lh + hl) << 16) + i;
32
        s.mt[i] = result;
33
        i += 1;
34
    }
35
    s.mti = N;
36
}
37
38
fn generateNumbers(s: *mut MtState) {
39
    let mut i: u32 = 0;
40
41
    while i < N - M {
42
        let y: u32 = (s.mt[i] & UPPER_MASK) | (s.mt[i + 1] & LOWER_MASK);
43
        let mut mag: u32 = 0;
44
        if y & 1 == 1 {
45
            mag = MATRIX_A;
46
        }
47
        s.mt[i] = s.mt[i + M] ^ (y >> 1) ^ mag;
48
        i += 1;
49
    }
50
51
    while i < N - 1 {
52
        let y: u32 = (s.mt[i] & UPPER_MASK) | (s.mt[i + 1] & LOWER_MASK);
53
        let mut mag: u32 = 0;
54
        if y & 1 == 1 {
55
            mag = MATRIX_A;
56
        }
57
        s.mt[i] = s.mt[i + M - N] ^ (y >> 1) ^ mag;
58
        i += 1;
59
    }
60
61
    let y: u32 = (s.mt[N - 1] & UPPER_MASK) | (s.mt[0] & LOWER_MASK);
62
    let mut mag: u32 = 0;
63
    if y & 1 == 1 {
64
        mag = MATRIX_A;
65
    }
66
    s.mt[N - 1] = s.mt[M - 1] ^ (y >> 1) ^ mag;
67
68
    s.mti = 0;
69
}
70
71
fn mtNext(s: *mut MtState) -> u32 {
72
    if s.mti >= N {
73
        generateNumbers(s);
74
    }
75
76
    let mut y: u32 = s.mt[s.mti];
77
    s.mti += 1;
78
79
    y ^= (y >> 11);
80
    y ^= ((y << 7) & 0x9D2C5680);
81
    y ^= ((y << 15) & 0xEFC60000);
82
    y ^= (y >> 18);
83
84
    return y;
85
}
86
87
fn testKnownSequence(s: *mut MtState) -> i32 {
88
    mtInit(s, 1);
89
90
    let v0: u32 = mtNext(s);
91
    assert v0 == 1791095845;
92
93
    let v1: u32 = mtNext(s);
94
    assert v1 == 4282876139;
95
96
    let v2: u32 = mtNext(s);
97
    assert v2 == 3093770124;
98
99
    let v3: u32 = mtNext(s);
100
    assert v3 == 4005303368;
101
102
    let v4: u32 = mtNext(s);
103
    assert v4 == 491263;
104
105
    return 0;
106
}
107
108
fn testDeterminism(s: *mut MtState) -> i32 {
109
    mtInit(s, 42);
110
111
    let mut first: [u32; 10] = [0; 10];
112
    let mut i: u32 = 0;
113
    while i < 10 {
114
        first[i] = mtNext(s);
115
        i += 1;
116
    }
117
118
    mtInit(s, 42);
119
120
    i = 0;
121
    while i < 10 {
122
        let v: u32 = mtNext(s);
123
        if v != first[i] { return i as i32 + 1; }
124
        i += 1;
125
    }
126
127
    return 0;
128
}
129
130
fn testDifferentSeeds(s: *mut MtState) -> i32 {
131
    mtInit(s, 1);
132
    let a: u32 = mtNext(s);
133
134
    mtInit(s, 2);
135
    let b: u32 = mtNext(s);
136
137
    mtInit(s, 3);
138
    let c: u32 = mtNext(s);
139
140
    assert a != b;
141
    assert b != c;
142
    assert a != c;
143
144
    return 0;
145
}
146
147
fn testChiSquared(s: *mut MtState) -> i32 {
148
    mtInit(s, 12345);
149
150
    const NUM_BINS: u32 = 16;
151
    const NUM_SAMPLES: u32 = 1600;
152
    const EXPECTED: u32 = 100;
153
154
    let mut bins: [u32; 16] = [0; 16];
155
156
    let mut i: u32 = 0;
157
    while i < NUM_SAMPLES {
158
        let val: u32 = mtNext(s);
159
        let bin: u32 = val >> 28;
160
        bins[bin] += 1;
161
        i += 1;
162
    }
163
164
    let mut chi2Scaled: u32 = 0;
165
    let mut b: u32 = 0;
166
    while b < NUM_BINS {
167
        let obs: i32 = bins[b] as i32;
168
        let exp: i32 = EXPECTED as i32;
169
        let diff: i32 = obs - exp;
170
        chi2Scaled += (diff * diff) as u32;
171
        b += 1;
172
    }
173
174
    assert chi2Scaled <= 5000;
175
176
    b = 0;
177
    while b < NUM_BINS {
178
        assert bins[b] != 0;
179
        b += 1;
180
    }
181
182
    b = 0;
183
    while b < NUM_BINS {
184
        assert bins[b] <= NUM_SAMPLES / 2;
185
        b += 1;
186
    }
187
188
    return 0;
189
}
190
191
fn testRegeneration(s: *mut MtState) -> i32 {
192
    mtInit(s, 7);
193
194
    let mut last: u32 = 0;
195
    let mut i: u32 = 0;
196
    while i < 700 {
197
        last = mtNext(s);
198
        i += 1;
199
    }
200
201
    mtInit(s, 7);
202
    let mut last2: u32 = 0;
203
    i = 0;
204
    while i < 700 {
205
        last2 = mtNext(s);
206
        i += 1;
207
    }
208
209
    assert last == last2;
210
211
    let mut more: u32 = 0;
212
    i = 0;
213
    while i < 700 {
214
        more = mtNext(s);
215
        i += 1;
216
    }
217
    assert more != 0;
218
219
    return 0;
220
}
221
222
fn testBitCoverage(s: *mut MtState) -> i32 {
223
    mtInit(s, 999);
224
225
    let mut orAll: u32 = 0;
226
    let mut andAll: u32 = 0xFFFFFFFF;
227
228
    let mut i: u32 = 0;
229
    while i < 200 {
230
        let v: u32 = mtNext(s);
231
        orAll |= v;
232
        andAll &= v;
233
        i += 1;
234
    }
235
236
    assert orAll == 0xFFFFFFFF;
237
    assert andAll != 0xFFFFFFFF;
238
    assert andAll == 0;
239
240
    return 0;
241
}
242
243
@default fn main() -> i32 {
244
    let mut mt: [u32; 624] = [0; 624];
245
    let mut s: MtState = MtState {
246
        mt: &mut mt[..],
247
        mti: 625,
248
    };
249
250
    let r1: i32 = testKnownSequence(&mut s);
251
    if r1 != 0 { return 10 + r1; }
252
253
    let r2: i32 = testDeterminism(&mut s);
254
    if r2 != 0 { return 20 + r2; }
255
256
    let r3: i32 = testDifferentSeeds(&mut s);
257
    if r3 != 0 { return 30 + r3; }
258
259
    let r4: i32 = testChiSquared(&mut s);
260
    if r4 != 0 { return 40 + r4; }
261
262
    let r5: i32 = testRegeneration(&mut s);
263
    if r5 != 0 { return 50 + r5; }
264
265
    let r6: i32 = testBitCoverage(&mut s);
266
    if r6 != 0 { return 60 + r6; }
267
268
    return 0;
269
}