mirror of https://github.com/golang/go.git
runtime: always mask shift amount regardless of architecture
Currently the shift amount is only masked on x86. Change it so it is masked on all architectures. In the worst case we generate a couple of extra instructions to perform the masking and in the best case we can elide overflow checks. This particular shift could also be replaced with a rotate instruction during optimization which would remove both the masking instructions and overflow checks on all architectures. Fixes #31165. Change-Id: I16b7a8800b4ba8813dc83735dfc59564e661d3b4 Reviewed-on: https://go-review.googlesource.com/c/go/+/170122 Run-TryBot: Michael Munday <mike.munday@ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
e6ad619ad6
commit
7b62e984d9
|
|
@ -181,10 +181,8 @@ type hiter struct {
|
|||
|
||||
// bucketShift returns 1<<b, optimized for code generation.
|
||||
func bucketShift(b uint8) uintptr {
|
||||
if sys.GoarchAmd64|sys.GoarchAmd64p32|sys.Goarch386 != 0 {
|
||||
b &= sys.PtrSize*8 - 1 // help x86 archs remove shift overflow checks
|
||||
}
|
||||
return uintptr(1) << b
|
||||
// Masking the shift amount allows overflow checks to be elided.
|
||||
return uintptr(1) << (b & (sys.PtrSize*8 - 1))
|
||||
}
|
||||
|
||||
// bucketMask returns 1<<b - 1, optimized for code generation.
|
||||
|
|
|
|||
Loading…
Reference in New Issue