mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: implement non-constant rotates
Makes math/bits.Rotate{Left,Right} fast on amd64.
name old time/op new time/op delta
RotateLeft-12 7.42ns ± 6% 5.45ns ± 6% -26.54% (p=0.000 n=9+10)
RotateLeft8-12 4.77ns ± 5% 3.42ns ± 7% -28.25% (p=0.000 n=8+10)
RotateLeft16-12 4.82ns ± 8% 3.40ns ± 7% -29.36% (p=0.000 n=10+10)
RotateLeft32-12 4.87ns ± 7% 3.48ns ± 7% -28.51% (p=0.000 n=8+9)
RotateLeft64-12 5.23ns ±10% 3.35ns ± 6% -35.97% (p=0.000 n=9+10)
RotateRight-12 7.59ns ± 8% 5.71ns ± 1% -24.72% (p=0.000 n=10+8)
RotateRight8-12 4.98ns ± 7% 3.36ns ± 9% -32.55% (p=0.000 n=10+10)
RotateRight16-12 5.12ns ± 2% 3.45ns ± 5% -32.62% (p=0.000 n=10+10)
RotateRight32-12 4.80ns ± 6% 3.42ns ±16% -28.68% (p=0.000 n=10+10)
RotateRight64-12 4.78ns ± 6% 3.42ns ± 6% -28.50% (p=0.000 n=10+10)
Update #18940
Change-Id: Ie79fb5581c489ed4d3b859314c5e669a134c119b
Reviewed-on: https://go-review.googlesource.com/39711
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
This commit is contained in:
parent
38521004ed
commit
7e07e635f3
6 changed files with 5839 additions and 43 deletions
|
|
@ -800,6 +800,63 @@ var linuxAMD64Tests = []*asmTest{
|
|||
}`,
|
||||
[]string{"\tCMPQ\t[A-Z]"},
|
||||
},
|
||||
// Non-constant rotate
|
||||
{
|
||||
`func rot64l(x uint64, y int) uint64 {
|
||||
z := uint(y & 63)
|
||||
return x << z | x >> (64-z)
|
||||
}`,
|
||||
[]string{"\tROLQ\t"},
|
||||
},
|
||||
{
|
||||
`func rot64r(x uint64, y int) uint64 {
|
||||
z := uint(y & 63)
|
||||
return x >> z | x << (64-z)
|
||||
}`,
|
||||
[]string{"\tRORQ\t"},
|
||||
},
|
||||
{
|
||||
`func rot32l(x uint32, y int) uint32 {
|
||||
z := uint(y & 31)
|
||||
return x << z | x >> (32-z)
|
||||
}`,
|
||||
[]string{"\tROLL\t"},
|
||||
},
|
||||
{
|
||||
`func rot32r(x uint32, y int) uint32 {
|
||||
z := uint(y & 31)
|
||||
return x >> z | x << (32-z)
|
||||
}`,
|
||||
[]string{"\tRORL\t"},
|
||||
},
|
||||
{
|
||||
`func rot16l(x uint16, y int) uint16 {
|
||||
z := uint(y & 15)
|
||||
return x << z | x >> (16-z)
|
||||
}`,
|
||||
[]string{"\tROLW\t"},
|
||||
},
|
||||
{
|
||||
`func rot16r(x uint16, y int) uint16 {
|
||||
z := uint(y & 15)
|
||||
return x >> z | x << (16-z)
|
||||
}`,
|
||||
[]string{"\tRORW\t"},
|
||||
},
|
||||
{
|
||||
`func rot8l(x uint8, y int) uint8 {
|
||||
z := uint(y & 7)
|
||||
return x << z | x >> (8-z)
|
||||
}`,
|
||||
[]string{"\tROLB\t"},
|
||||
},
|
||||
{
|
||||
`func rot8r(x uint8, y int) uint8 {
|
||||
z := uint(y & 7)
|
||||
return x >> z | x << (8-z)
|
||||
}`,
|
||||
[]string{"\tRORB\t"},
|
||||
},
|
||||
}
|
||||
|
||||
var linux386Tests = []*asmTest{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue