1
0
mirror of https://github.com/golang/go synced 2024-11-24 08:00:12 -07:00

cmd/compile: intrinsify math/bits.ReverseBytes

Update #18616

Change-Id: I0c2d643cbbeb131b4c9b12194697afa4af48e1d2
Reviewed-on: https://go-review.googlesource.com/38166
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Keith Randall 2017-03-15 21:28:29 -07:00 committed by Keith Randall
parent 793e4ec3dd
commit dd9892e31b
2 changed files with 65 additions and 3 deletions

View File

@ -185,6 +185,7 @@ var allAsmTests = []*asmTests{
{
arch: "arm64",
os: "linux",
imports: []string{"math/bits"},
tests: linuxARM64Tests,
},
}
@ -576,6 +577,30 @@ var linuxAMD64Tests = []*asmTest{
`,
[]string{"\tBSFQ\t", "\tORQ\t\\$256,"},
},
{
`
func f45(a uint64) uint64 {
return bits.ReverseBytes64(a)
}
`,
[]string{"\tBSWAPQ\t"},
},
{
`
func f46(a uint32) uint32 {
return bits.ReverseBytes32(a)
}
`,
[]string{"\tBSWAPL\t"},
},
{
`
func f47(a uint16) uint16 {
return bits.ReverseBytes16(a)
}
`,
[]string{"\tROLW\t\\$8,"},
},
}
var linux386Tests = []*asmTest{
@ -776,6 +801,23 @@ var linuxS390XTests = []*asmTest{
`,
[]string{"\tFLOGR\t", "\tOR\t\\$256,"},
},
// Intrinsic tests for math/bits
{
`
func f22(a uint64) uint64 {
return bits.ReverseBytes64(a)
}
`,
[]string{"\tMOVDBR\t"},
},
{
`
func f23(a uint32) uint32 {
return bits.ReverseBytes32(a)
}
`,
[]string{"\tMOVWBR\t"},
},
}
var linuxARMTests = []*asmTest{
@ -854,6 +896,22 @@ var linuxARM64Tests = []*asmTest{
`,
[]string{"\tRORW\t[$]25,"},
},
{
`
func f22(a uint64) uint64 {
return bits.ReverseBytes64(a)
}
`,
[]string{"\tREV\t"},
},
{
`
func f23(a uint32) uint32 {
return bits.ReverseBytes32(a)
}
`,
[]string{"\tREVW\t"},
},
}
// TestLineNumber checks to make sure the generated assembly has line numbers

View File

@ -2702,6 +2702,10 @@ func init() {
return s.newValue1(ssa.OpCtz64, Types[TINT], y)
},
sys.AMD64, sys.ARM64, sys.S390X)
alias("math/bits", "ReverseBytes64", "runtime/internal/sys", "Bswap64", all...)
alias("math/bits", "ReverseBytes32", "runtime/internal/sys", "Bswap32", all...)
// ReverseBytes inlines correctly, no need to intrinsify it.
// ReverseBytes16 lowers to a rotate, no need for anything special here.
/******** sync/atomic ********/