]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: convert initial timediv quotient increments to bitsets
authorEmmanuel T Odeke <emmanuel@orijtech.com>
Mon, 10 Sep 2018 07:05:09 +0000 (01:05 -0600)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Wed, 12 Sep 2018 17:24:59 +0000 (17:24 +0000)
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>
src/runtime/runtime1.go

index d5f78badedad6ec0dd7c3eb25df4f086e2b18676..85a9ba252197a305fb4918c6457303b8b5476b3c 100644 (file)
@@ -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) {