]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: always mask shift amount regardless of architecture
authorMichael Munday <mike.munday@ibm.com>
Sun, 31 Mar 2019 14:23:07 +0000 (15:23 +0100)
committerMichael Munday <mike.munday@ibm.com>
Sun, 31 Mar 2019 15:45:58 +0000 (15:45 +0000)
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>
src/runtime/map.go

index 1282a1219348e13ffcbe710c0e130d66f849c59e..d2ff19336ff7413d938ac83ad78c54a04f8ec350 100644 (file)
@@ -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.