From: Sokolov Yura Date: Sun, 12 Feb 2017 10:18:22 +0000 (+0300) Subject: runtime: make fastrand to generate 32bit values X-Git-Tag: go1.9beta1~1585 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=663226d8e130470c1a627c64cf489261ebb6da08;p=gostls13.git 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 TryBot-Result: Gobot Gobot Reviewed-by: Minux Ma Reviewed-by: Keith Randall --- diff --git a/src/runtime/malloc.go b/src/runtime/malloc.go index 11c49f6657..25ae261bb2 100644 --- a/src/runtime/malloc.go +++ b/src/runtime/malloc.go @@ -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 } diff --git a/src/runtime/select.go b/src/runtime/select.go index 0d846b1470..4a744a1967 100644 --- a/src/runtime/select.go +++ b/src/runtime/select.go @@ -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) } diff --git a/src/runtime/stubs.go b/src/runtime/stubs.go index 101c8cfd10..e839c59d55 100644 --- a/src/runtime/stubs.go +++ b/src/runtime/stubs.go @@ -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 }