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:
parent
15c62e8535
commit
663226d8e1
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user