aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/runtime1.go
diff options
context:
space:
mode:
authorEmmanuel T Odeke <emmanuel@orijtech.com>2018-09-10 01:05:09 -0600
committerEmmanuel Odeke <emm.odeke@gmail.com>2018-09-12 17:24:59 +0000
commit178a609fed5fba5abaeead485f7b2795b8c4ea3c (patch)
tree13193c044aa8d0389611582cb1a4fe3f6276bcdc /src/runtime/runtime1.go
parenta0fad982b17b8c49c8567867160dee9f021cf1ba (diff)
downloadgo-178a609fed5fba5abaeead485f7b2795b8c4ea3c.tar.xz
runtime: convert initial timediv quotient increments to bitsets
At the very beginning of timediv, inside a for loop, we reduce the base value by at most (1<<31)-1, while incrementing the quotient result by 1<<uint(bit). However, since the quotient value was 0 to begin with, we are essentially just doing bitsets. This change is in the hot path of various concurrency and scheduling operations that require sleeping, waiting on mutexes and futexes etc. On the following OSes: * Dragonfly * FreeBSD * Linux * NetBSD * OpenBSD * Plan9 * Windows and paired with architectures that provide the BTS instruction, this change shaves off a couple of nanoseconds per invocation of timediv. Fixes #27529 Change-Id: Ia2fea5022c1109e02d86d1f962a3b0bd70967aa6 Reviewed-on: https://go-review.googlesource.com/134231 Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/runtime1.go')
-rw-r--r--src/runtime/runtime1.go4
1 files changed, 3 insertions, 1 deletions
diff --git a/src/runtime/runtime1.go b/src/runtime/runtime1.go
index d5f78baded..85a9ba2521 100644
--- a/src/runtime/runtime1.go
+++ b/src/runtime/runtime1.go
@@ -416,7 +416,9 @@ func timediv(v int64, div int32, rem *int32) int32 {
for bit := 30; bit >= 0; bit-- {
if v >= int64(div)<<uint(bit) {
v = v - (int64(div) << uint(bit))
- res += 1 << uint(bit)
+ // Before this for loop, res was 0, thus all these
+ // power of 2 increments are now just bitsets.
+ res |= 1 << uint(bit)
}
}
if v >= int64(div) {