aboutsummaryrefslogtreecommitdiff
path: root/src/math/bits/bits.go
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2017-02-24 17:50:53 -0800
committerRobert Griesemer <gri@golang.org>2017-02-25 22:18:58 +0000
commite18adbf88d35bc200d2b1c07ccb8f55f551942a0 (patch)
tree8c1e1496c5444c1bed6f5832ebcb786bb5af7214 /src/math/bits/bits.go
parentbf584b15d6104661c272e2ab900c3d83d015b7d0 (diff)
downloadgo-e18adbf88d35bc200d2b1c07ccb8f55f551942a0.tar.xz
math/bits: faster Reverse8/16 functions using table lookups
Measured on 2.3 GHz Intel Core i7, running macOS 10.12.3: benchmark old ns/op new ns/op delta BenchmarkReverse8-8 1.70 0.99 -41.76% BenchmarkReverse16-8 2.24 1.32 -41.07% Fixes #19279. Change-Id: I398cf8a3513b7fa63c130efc7846a7c5353999d4 Reviewed-on: https://go-review.googlesource.com/37459 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/math/bits/bits.go')
-rw-r--r--src/math/bits/bits.go13
1 files changed, 4 insertions, 9 deletions
diff --git a/src/math/bits/bits.go b/src/math/bits/bits.go
index 4038e9bf01..03bcb1c354 100644
--- a/src/math/bits/bits.go
+++ b/src/math/bits/bits.go
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
+//go:generate go run make_tables.go
+
// Package bits implements bit counting and manipulation
// functions for the predeclared unsigned integer types.
package bits
@@ -232,19 +234,12 @@ func Reverse(x uint) uint {
// Reverse8 returns the value of x with its bits in reversed order.
func Reverse8(x uint8) uint8 {
- const m = 1<<8 - 1
- x = x>>1&(m0&m) | x&(m0&m)<<1
- x = x>>2&(m1&m) | x&(m1&m)<<2
- return x>>4 | x<<4
+ return rev8tab[x]
}
// Reverse16 returns the value of x with its bits in reversed order.
func Reverse16(x uint16) uint16 {
- const m = 1<<16 - 1
- x = x>>1&(m0&m) | x&(m0&m)<<1
- x = x>>2&(m1&m) | x&(m1&m)<<2
- x = x>>4&(m2&m) | x&(m2&m)<<4
- return x>>8 | x<<8
+ return uint16(rev8tab[x>>8]) | uint16(rev8tab[x&0xff])<<8
}
// Reverse32 returns the value of x with its bits in reversed order.