]> Cypherpunks repositories - gostls13.git/commitdiff
math/big: write t*10 to multiply t by 10
authorRuss Cox <rsc@golang.org>
Tue, 24 May 2016 06:45:11 +0000 (02:45 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 24 May 2016 13:34:20 +0000 (13:34 +0000)
The compiler has caught up.
In fact the compiler is ahead; it knows about a magic multiply-by-5 instruction:

// compute '0' + byte(r - t*10) in AX
MOVQ t, AX
LEAQ (AX)(AX*4), AX
SHLQ $1, AX
MOVQ r, CX
SUBQ AX, CX
LEAL 48(CX), AX

For comparison, the shifty version compiles to:

// compute '0' + byte(r - t*10) in AX
MOVQ t, AX
MOVQ AX, CX
SHLQ $3, AX
MOVQ r, DX
SUBQ AX, DX
SUBQ CX, DX
SUBQ CX, DX
LEAL 48(DX), AX

Fixes #2671.

Change-Id: Ifbf23dbfeb19c0bb020fa44eb2f025943969fb6b
Reviewed-on: https://go-review.googlesource.com/23372
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/math/big/natconv.go

index e216bd288ccd2c4432d20518962c6b5a51c9a850..44547842c1ced2f86a225e17f59a35d5c4bd6f47 100644 (file)
@@ -391,7 +391,7 @@ func (q nat) convertWords(s []byte, b Word, ndigits int, bb Word, table []diviso
                                // this appears to be faster for BenchmarkString10000Base10
                                // and smaller strings (but a bit slower for larger ones)
                                t := r / 10
-                               s[i] = '0' + byte(r-t<<3-t-t) // TODO(gri) replace w/ t*10 once compiler produces better code
+                               s[i] = '0' + byte(r-t*10)
                                r = t
                        }
                }