diff options
| author | Aliaksandr Valialkin <valyala@gmail.com> | 2017-09-23 00:34:37 +0300 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2017-10-06 15:15:39 +0000 |
| commit | 0011cfbe2b57b385bac25a3daf9de581ee263661 (patch) | |
| tree | fb111b1b477edac94e8e05620379916702f8a662 /src/math/bits/make_examples.go | |
| parent | 2e8545531e759a47bbb2c1f9fefa54bafbcf02e5 (diff) | |
| download | go-0011cfbe2b57b385bac25a3daf9de581ee263661.tar.xz | |
cmd/compile: optimize signed non-negative div/mod by a power of 2
This CL optimizes assembly for len() or cap() division
by a power of 2 constants:
func lenDiv(s []int) int {
return len(s) / 16
}
amd64 assembly before the CL:
MOVQ "".s+16(SP), AX
MOVQ AX, CX
SARQ $63, AX
SHRQ $60, AX
ADDQ CX, AX
SARQ $4, AX
MOVQ AX, "".~r1+32(SP)
RET
amd64 assembly after the CL:
MOVQ "".s+16(SP), AX
SHRQ $4, AX
MOVQ AX, "".~r1+32(SP)
RET
The CL relies on the fact that len() and cap() result cannot
be negative.
Trigger stats for the added SSA rules on linux/amd64 when running
make.bash:
46 Div64
12 Mod64
The added SSA rules may trigger on more cases in the future
when SSA values will be populated with the info on their
lower bounds.
For instance:
func f(i int16) int16 {
if i < 3 {
return -1
}
// Lower bound of i is 3 here -> i is non-negative,
// so unsigned arithmetics may be used here.
return i % 16
}
Change-Id: I8bc6be5a03e71157ced533c01416451ff6f1a7f0
Reviewed-on: https://go-review.googlesource.com/65530
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/math/bits/make_examples.go')
0 files changed, 0 insertions, 0 deletions
