diff options
| author | Keith Randall <khr@google.com> | 2018-10-23 14:05:38 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2018-10-25 19:47:00 +0000 |
| commit | 899f3a2892b0a6e06a2e5f54c0a196d15944b99e (patch) | |
| tree | b7111d4b4af1564c5ec64267569a4a7584ef4137 /src/math | |
| parent | f6b554fec75ff1a36c6204755db8c1f638255b64 (diff) | |
| download | go-899f3a2892b0a6e06a2e5f54c0a196d15944b99e.tar.xz | |
cmd/compile: intrinsify math/bits.Add on amd64
name old time/op new time/op delta
Add-8 1.11ns ± 0% 1.18ns ± 0% +6.31% (p=0.029 n=4+4)
Add32-8 1.02ns ± 0% 1.02ns ± 1% ~ (p=0.333 n=4+5)
Add64-8 1.11ns ± 1% 1.17ns ± 0% +5.79% (p=0.008 n=5+5)
Add64multiple-8 4.35ns ± 1% 0.86ns ± 0% -80.22% (p=0.000 n=5+4)
The individual ops are a bit slower (but still very fast).
Using the ops in carry chains is very fast.
Update #28273
Change-Id: Id975f76df2b930abf0e412911d327b6c5b1befe5
Reviewed-on: https://go-review.googlesource.com/c/144257
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Diffstat (limited to 'src/math')
| -rw-r--r-- | src/math/bits/bits_test.go | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/src/math/bits/bits_test.go b/src/math/bits/bits_test.go index ede7c05d41..0bd52bee77 100644 --- a/src/math/bits/bits_test.go +++ b/src/math/bits/bits_test.go @@ -899,6 +899,21 @@ func BenchmarkAdd64(b *testing.B) { Output = int(z + c) } +func BenchmarkAdd64multiple(b *testing.B) { + var z0 = uint64(Input) + var z1 = uint64(Input) + var z2 = uint64(Input) + var z3 = uint64(Input) + for i := 0; i < b.N; i++ { + var c uint64 + z0, c = Add64(z0, uint64(i), c) + z1, c = Add64(z1, uint64(i), c) + z2, c = Add64(z2, uint64(i), c) + z3, _ = Add64(z3, uint64(i), c) + } + Output = int(z0 + z1 + z2 + z3) +} + func BenchmarkSub(b *testing.B) { var z, c uint for i := 0; i < b.N; i++ { @@ -923,6 +938,21 @@ func BenchmarkSub64(b *testing.B) { Output = int(z + c) } +func BenchmarkSub64multiple(b *testing.B) { + var z0 = uint64(Input) + var z1 = uint64(Input) + var z2 = uint64(Input) + var z3 = uint64(Input) + for i := 0; i < b.N; i++ { + var c uint64 + z0, c = Sub64(z0, uint64(i), c) + z1, c = Sub64(z1, uint64(i), c) + z2, c = Sub64(z2, uint64(i), c) + z3, _ = Sub64(z3, uint64(i), c) + } + Output = int(z0 + z1 + z2 + z3) +} + func BenchmarkMul(b *testing.B) { var hi, lo uint for i := 0; i < b.N; i++ { |
