Skip to content

Commit 2a81842

Browse files
committed
tests: update prng.inc
1 parent 8501f53 commit 2a81842

5 files changed

Lines changed: 53 additions & 49 deletions

File tree

tests/functional/addr/random.asm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ dfill:
9191
lw r5, 0xf000
9292
floop:
9393
rd r5+r3
94-
lj rand
94+
lj urand
9595
awt r3, 2
9696
cw r3, 0x1000
9797
jl floop
@@ -190,7 +190,7 @@ loop:
190190

191191
; next address
192192
awt r3, 1
193-
lj rand
193+
lj urand
194194
awt r3, 1
195195
cw r3, 0x1000
196196
jls loop

tests/functional/cchar/flop8-poll-write-positioned.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ gen_randoms:
195195
lw r6, write_positions
196196
.loop:
197197

198-
lj rand
198+
lj urand
199199
rw r1, r6+1
200200

201201
awt r6, 2

tests/functional/iotester/mem-rw-loop.asm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ mask_ch:.word IMASK_ALL_CH
3030
reconfigure_mem:
3131
.res 1
3232

33-
lj rand ; [r1, r2] = random
33+
lj urand ; [r1, r2] = random
3434

3535
.page14:
3636
lw r3, 14\MEM_PAGE | 0\MEM_SEGMENT ; logical address specification
@@ -57,7 +57,7 @@ reconfigure_mem:
5757
randomize:
5858
.res 1
5959

60-
lj rand
60+
lj urand
6161

6262
nr r1, 0x0fff ; r1 = random offset
6363
rw r1, offset
@@ -83,7 +83,7 @@ randomize:
8383
rnd_fill:
8484
.res 1
8585

86-
lj rand ; r1 = initial random
86+
lj urand ; r1 = initial random
8787

8888
lw r5, 0xe000 - 1
8989
aw r5, [offset]

tests/functional/multix/winch-transmit-basic.asm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ fill: ; fill write buffer with random data
180180
lw r4, wrbuf
181181
lw r3, SSIZE/2
182182
fill_loop:
183-
lj rand
183+
lj urand
184184
rd r4
185185
awt r4, 2
186186
drb r3, fill_loop

tests/include/prng.inc

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ im_tm: .word IMASK_GROUP_H
2828
im_0: .word 0
2929
otimv: .res 1
3030
ostck: .res 1
31-
cseed: .dword 1
3231
prngseed:
3332
.res 1
3433
lwt r1, 0
@@ -53,7 +52,7 @@ rngloop:
5352
jes prngseed_fin
5453
ujs rngloop
5554
prngseed_fin:
56-
rd cseed
55+
rd urand.seed
5756
im im_0
5857
lw r4, [otimv]
5958
rw r4, INTV_TIMER
@@ -62,57 +61,62 @@ prngseed_fin:
6261
uj [prngseed]
6362

6463
; ------------------------------------------------------------------------
65-
; Park-Miller-Carta Pseudo-Random Number Generator implementation for MERA-400
66-
; out: [r1, r2] - random 32-bit number
67-
; temp: r3
68-
.const constapmc 16807
69-
lo: .res 2
70-
hi: .res 2
71-
tmp_r3: .res 1
64+
; Park-Miller-Carta pseudo-random number generator implementation for MERA-400
65+
;
66+
; RETURN: [r1, r2] - random 31-bit number
67+
urand: .res 1
68+
lw r1, [.seed+1]
69+
sxu r1 ; set X if low seed is negative
70+
71+
; lo = cpmc * (seed & 0xFFFF)
72+
lw r2, .cpmc
73+
mw .seed+1
74+
; correct for signed multiply if low seed was negative
75+
brc ?X
76+
ad .ufix
77+
rd .lo
78+
79+
; hi = cpmc * (seed >> 16)
80+
lw r2, .cpmc
81+
mw .seed
82+
rd .hi
7283

73-
rand: .res 1
74-
rw r3, tmp_r3
75-
; lo = self.constapmc * (self.seed & 0xFFFF)
76-
lw r2, constapmc
77-
mw cseed+1
78-
rd lo
79-
; hi = self.constapmc * (self.seed >> 16)
80-
lw r2, constapmc
81-
mw cseed
82-
rd hi
8384
; lo += (hi & 0x7FFF) << 16
84-
lw r1, [hi+1]
85-
er r1, 1\0
85+
lw r1, [.hi+1]
86+
nr r1, 0x7fff
8687
lwt r2, 0
87-
ad lo
88-
rd lo
88+
ad .lo
89+
rd .lo
90+
8991
; lo += hi >> 15
90-
lwt r1, 0
91-
lw r2, [hi]
92-
lw r3, [hi+1]
93-
slz r3
92+
lw r2, [.hi]
93+
lw r1, [.hi+1] ; r1 just for temporary use here
94+
slz r1 ; just to set Y to .hi+1's MSB
9495
sly r2
95-
sly r1
96-
ad lo
97-
; lo = (lo & 0x7FFFFFFF) + (lo >> 31);
98-
sxu r1
99-
er r1, 1\0
100-
rd lo
10196
lwt r1, 0
102-
lwt r2, 0
103-
slx r2
104-
ad lo
105-
; self.seed = lo
106-
rd cseed
107-
; return lo
108-
lw r3, [tmp_r3]
109-
uj [rand]
97+
sly r1
98+
ad .lo
99+
100+
; if (lo > 0x7FFFFFFF) lo -= 0x7FFFFFFF
101+
blc ?M
102+
sd .fix
103+
.done:
104+
; seed = lo
105+
rd .seed
106+
uj [urand]
107+
108+
.const .cpmc 16807
109+
.seed: .dword 1
110+
.fix: .dword 0x7fffffff
111+
.ufix: .dword 0x10000 * .cpmc
112+
.lo: .res 2
113+
.hi: .res 2
110114

111115
; ------------------------------------------------------------------------
112116
; Seed the PRNG
113117
; in: [r1, r2] - seed
114118
seed: .res 1
115-
rd cseed
119+
rd urand.seed
116120
uj [seed]
117121

118122
prng_stack:

0 commit comments

Comments
 (0)