Commit 663226d8 authored by Sokolov Yura's avatar Sokolov Yura Committed by Josh Bleecher Snyder

runtime: make fastrand to generate 32bit values

Extend period of fastrand from (1<<31)-1 to (1<<32)-1 by
choosing other polynom and reacting on high bit before shift.

Polynomial is taken at https://users.ece.cmu.edu/~koopman/lfsr/index.html
from 32.dat.gz . It is referred as F7711115 cause this list of
polynomials is for LFSR with shift to right (and fastrand uses shift to
left). (old polynomial is referred in 31.dat.gz as 7BB88888).

There were couple of places with conversation of fastrand to int, which
leads to negative values on 32bit platforms. They are fixed.

Change-Id: Ibee518a3f9103e0aea220ada494b3aec77babb72
Reviewed-on: https://go-review.googlesource.com/36875
Run-TryBot: Minux Ma <minux@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarMinux Ma <minux@golang.org>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
parent 15c62e85
......@@ -877,7 +877,7 @@ func nextSampleNoFP() int32 {
rate = 0x3fffffff
}
if rate != 0 {
return int32(int(fastrand()) % (2 * rate))
return int32(fastrand() % uint32(2*rate))
}
return 0
}
......
......@@ -270,7 +270,7 @@ func selectgoImpl(sel *hselect) (uintptr, uint16) {
pollslice := slice{unsafe.Pointer(sel.pollorder), int(sel.ncase), int(sel.ncase)}
pollorder := *(*[]uint16)(unsafe.Pointer(&pollslice))
for i := 1; i < int(sel.ncase); i++ {
j := int(fastrand()) % (i + 1)
j := fastrand() % uint32(i+1)
pollorder[i] = pollorder[j]
pollorder[j] = uint16(i)
}
......
......@@ -97,8 +97,8 @@ var hashLoad = loadFactor
func fastrand() uint32 {
mp := getg().m
fr := mp.fastrand
fr <<= 1
fr ^= uint32(int32(fr)>>31) & 0x88888eef
mx := uint32(int32(fr)>>31) & 0xa8888eef
fr = fr<<1 ^ mx
mp.fastrand = fr
return fr
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment