1
0
mirror of https://github.com/golang/go synced 2024-11-24 02:00:20 -07:00

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: Minux Ma <minux@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
Sokolov Yura 2017-02-12 13:18:22 +03:00 committed by Josh Bleecher Snyder
parent 15c62e8535
commit 663226d8e1
3 changed files with 4 additions and 4 deletions

View File

@ -877,7 +877,7 @@ func nextSampleNoFP() int32 {
rate = 0x3fffffff rate = 0x3fffffff
} }
if rate != 0 { if rate != 0 {
return int32(int(fastrand()) % (2 * rate)) return int32(fastrand() % uint32(2*rate))
} }
return 0 return 0
} }

View File

@ -270,7 +270,7 @@ func selectgoImpl(sel *hselect) (uintptr, uint16) {
pollslice := slice{unsafe.Pointer(sel.pollorder), int(sel.ncase), int(sel.ncase)} pollslice := slice{unsafe.Pointer(sel.pollorder), int(sel.ncase), int(sel.ncase)}
pollorder := *(*[]uint16)(unsafe.Pointer(&pollslice)) pollorder := *(*[]uint16)(unsafe.Pointer(&pollslice))
for i := 1; i < int(sel.ncase); i++ { for i := 1; i < int(sel.ncase); i++ {
j := int(fastrand()) % (i + 1) j := fastrand() % uint32(i+1)
pollorder[i] = pollorder[j] pollorder[i] = pollorder[j]
pollorder[j] = uint16(i) pollorder[j] = uint16(i)
} }

View File

@ -97,8 +97,8 @@ var hashLoad = loadFactor
func fastrand() uint32 { func fastrand() uint32 {
mp := getg().m mp := getg().m
fr := mp.fastrand fr := mp.fastrand
fr <<= 1 mx := uint32(int32(fr)>>31) & 0xa8888eef
fr ^= uint32(int32(fr)>>31) & 0x88888eef fr = fr<<1 ^ mx
mp.fastrand = fr mp.fastrand = fr
return fr return fr
} }