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>
// 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.