diff options
author | Alexandru Moșoi <brtzsnr@gmail.com> | 2016-03-24 22:46:37 +0100 |
---|---|---|
committer | Alexandru Moșoi <alexandru@mosoi.ro> | 2016-03-30 22:27:13 +0000 |
commit | d8f1f8d8568d680be0845379d477264fd09324c3 (patch) | |
tree | 92550c24f77aff25d7e6ee9e8a25e1302a8b86f7 /test/strength.go | |
parent | 1624a9c9e79c1c5dd9a4e69c359c98838c3eb6f8 (diff) | |
download | go-d8f1f8d8568d680be0845379d477264fd09324c3.tar.gz go-d8f1f8d8568d680be0845379d477264fd09324c3.zip |
cmd/compile: generalize strength reduction of mulq
* This is an improved version of an earlier patch.
* Verified with gcc up to 100.
* Limited to two instructions based on costs from
https://gmplib.org/~tege/x86-timing.pdf
Change-Id: Ib7c37de6fd8e0ba554459b15c7409508cbcf6728
Reviewed-on: https://go-review.googlesource.com/21103
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Alexandru Moșoi <alexandru@mosoi.ro>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'test/strength.go')
-rw-r--r-- | test/strength.go | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/test/strength.go b/test/strength.go new file mode 100644 index 0000000000..94d589c240 --- /dev/null +++ b/test/strength.go @@ -0,0 +1,45 @@ +// runoutput + +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Generate test of strength reduction for multiplications +// with contstants. Especially useful for amd64/386. + +package main + +import "fmt" + +func testMul(fact, bits int) string { + n := fmt.Sprintf("testMul_%d_%d", fact, bits) + fmt.Printf("func %s(s int%d) {\n", n, bits) + + want := 0 + for i := 0; i < 200; i++ { + fmt.Printf(` if want, got := int%d(%d), s*%d; want != got { + failed = true + fmt.Printf("got %d * %%d == %%d, wanted %d\n", s, got) + } +`, bits, want, i, i, want) + want += fact + } + + fmt.Printf("}\n") + return fmt.Sprintf("%s(%d)", n, fact) +} + +func main() { + fmt.Printf("package main\n") + fmt.Printf("import \"fmt\"\n") + fmt.Printf("var failed = false\n") + + f1 := testMul(17, 32) + f2 := testMul(131, 64) + + fmt.Printf("func main() {\n") + fmt.Println(f1) + fmt.Println(f2) + fmt.Printf("if failed {\n panic(\"multiplication failed\")\n}\n") + fmt.Printf("}\n") +} |