aboutsummaryrefslogtreecommitdiff
path: root/test/codegen/mathbits.go
diff options
context:
space:
mode:
authorKeith Randall <khr@google.com>2018-10-23 14:05:38 -0700
committerKeith Randall <khr@golang.org>2018-10-25 19:47:00 +0000
commit899f3a2892b0a6e06a2e5f54c0a196d15944b99e (patch)
treeb7111d4b4af1564c5ec64267569a4a7584ef4137 /test/codegen/mathbits.go
parentf6b554fec75ff1a36c6204755db8c1f638255b64 (diff)
downloadgo-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 'test/codegen/mathbits.go')
-rw-r--r--test/codegen/mathbits.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/test/codegen/mathbits.go b/test/codegen/mathbits.go
index c21de19707..9a89c5f6b0 100644
--- a/test/codegen/mathbits.go
+++ b/test/codegen/mathbits.go
@@ -327,6 +327,66 @@ func IterateBits8(n uint8) int {
}
// --------------- //
+// bits.Add* //
+// --------------- //
+
+func Add(x, y, ci uint) (r, co uint) {
+ // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
+ return bits.Add(x, y, ci)
+}
+
+func AddC(x, ci uint) (r, co uint) {
+ // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
+ return bits.Add(x, 7, ci)
+}
+
+func AddZ(x, y uint) (r, co uint) {
+ // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
+ return bits.Add(x, y, 0)
+}
+
+func AddR(x, y, ci uint) uint {
+ // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
+ r, _ := bits.Add(x, y, ci)
+ return r
+}
+func AddM(p, q, r *[3]uint) {
+ var c uint
+ r[0], c = bits.Add(p[0], q[0], c)
+ // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
+ r[1], c = bits.Add(p[1], q[1], c)
+ r[2], c = bits.Add(p[2], q[2], c)
+}
+
+func Add64(x, y, ci uint64) (r, co uint64) {
+ // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
+ return bits.Add64(x, y, ci)
+}
+
+func Add64C(x, ci uint64) (r, co uint64) {
+ // amd64:"NEGL","ADCQ","SBBQ","NEGQ"
+ return bits.Add64(x, 7, ci)
+}
+
+func Add64Z(x, y uint64) (r, co uint64) {
+ // amd64:"ADDQ","SBBQ","NEGQ",-"NEGL",-"ADCQ"
+ return bits.Add64(x, y, 0)
+}
+
+func Add64R(x, y, ci uint64) uint64 {
+ // amd64:"NEGL","ADCQ",-"SBBQ",-"NEGQ"
+ r, _ := bits.Add64(x, y, ci)
+ return r
+}
+func Add64M(p, q, r *[3]uint64) {
+ var c uint64
+ r[0], c = bits.Add64(p[0], q[0], c)
+ // amd64:"ADCQ",-"NEGL",-"SBBQ",-"NEGQ"
+ r[1], c = bits.Add64(p[1], q[1], c)
+ r[2], c = bits.Add64(p[2], q[2], c)
+}
+
+// --------------- //
// bits.Mul* //
// --------------- //