Commit dd9892e3 authored by Keith Randall's avatar Keith Randall Committed by Keith Randall

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: default avatarRobert Griesemer <gri@golang.org>
parent 793e4ec3
...@@ -183,9 +183,10 @@ var allAsmTests = []*asmTests{ ...@@ -183,9 +183,10 @@ var allAsmTests = []*asmTests{
tests: linuxARMTests, tests: linuxARMTests,
}, },
{ {
arch: "arm64", arch: "arm64",
os: "linux", os: "linux",
tests: linuxARM64Tests, imports: []string{"math/bits"},
tests: linuxARM64Tests,
}, },
} }
...@@ -576,6 +577,30 @@ var linuxAMD64Tests = []*asmTest{ ...@@ -576,6 +577,30 @@ var linuxAMD64Tests = []*asmTest{
`, `,
[]string{"\tBSFQ\t", "\tORQ\t\\$256,"}, []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{ var linux386Tests = []*asmTest{
...@@ -776,6 +801,23 @@ var linuxS390XTests = []*asmTest{ ...@@ -776,6 +801,23 @@ var linuxS390XTests = []*asmTest{
`, `,
[]string{"\tFLOGR\t", "\tOR\t\\$256,"}, []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{ var linuxARMTests = []*asmTest{
...@@ -854,6 +896,22 @@ var linuxARM64Tests = []*asmTest{ ...@@ -854,6 +896,22 @@ var linuxARM64Tests = []*asmTest{
`, `,
[]string{"\tRORW\t[$]25,"}, []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 // TestLineNumber checks to make sure the generated assembly has line numbers
......
...@@ -2702,6 +2702,10 @@ func init() { ...@@ -2702,6 +2702,10 @@ func init() {
return s.newValue1(ssa.OpCtz64, Types[TINT], y) return s.newValue1(ssa.OpCtz64, Types[TINT], y)
}, },
sys.AMD64, sys.ARM64, sys.S390X) 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 ********/ /******** sync/atomic ********/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment