mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
test: move rotate tests to top-level testsuite.
Remove old tests from asm_test. Change-Id: Ib408ec7faa60068bddecf709b93ce308e0ef665a Reviewed-on: https://go-review.googlesource.com/100075 Reviewed-by: Alberto Donizetti <alb.donizetti@gmail.com>
This commit is contained in:
parent
c15b7b2a54
commit
f7ac70a566
2 changed files with 145 additions and 344 deletions
|
|
@ -316,115 +316,6 @@ var linuxAMD64Tests = []*asmTest{
|
||||||
`,
|
`,
|
||||||
pos: []string{"\tXORPS\tX., X", "\tMOVUPS\tX., \\(.*\\)", "\tMOVQ\t\\$0, 16\\(.*\\)", "\tCALL\truntime\\.gcWriteBarrier\\(SB\\)"},
|
pos: []string{"\tXORPS\tX., X", "\tMOVUPS\tX., \\(.*\\)", "\tMOVQ\t\\$0, 16\\(.*\\)", "\tCALL\truntime\\.gcWriteBarrier\\(SB\\)"},
|
||||||
},
|
},
|
||||||
// Rotate tests
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f20(x uint64) uint64 {
|
|
||||||
return x<<7 | x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLQ\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f21(x uint64) uint64 {
|
|
||||||
return x<<7 + x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLQ\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f22(x uint64) uint64 {
|
|
||||||
return x<<7 ^ x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLQ\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f23(x uint32) uint32 {
|
|
||||||
return x<<7 + x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f24(x uint32) uint32 {
|
|
||||||
return x<<7 | x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f25(x uint32) uint32 {
|
|
||||||
return x<<7 ^ x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f26(x uint16) uint16 {
|
|
||||||
return x<<7 + x>>9
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLW\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f27(x uint16) uint16 {
|
|
||||||
return x<<7 | x>>9
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLW\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f28(x uint16) uint16 {
|
|
||||||
return x<<7 ^ x>>9
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLW\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f29(x uint8) uint8 {
|
|
||||||
return x<<7 + x>>1
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLB\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f30(x uint8) uint8 {
|
|
||||||
return x<<7 | x>>1
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLB\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f31(x uint8) uint8 {
|
|
||||||
return x<<7 ^ x>>1
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLB\t[$]7,"},
|
|
||||||
},
|
|
||||||
// Rotate after inlining (see issue 18254).
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f32(x uint32) uint32 {
|
|
||||||
return g(x, 7)
|
|
||||||
}
|
|
||||||
func g(x uint32, k uint) uint32 {
|
|
||||||
return x<<k | x>>(32-k)
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
fn: `
|
fn: `
|
||||||
func f33(m map[int]int) int {
|
func f33(m map[int]int) int {
|
||||||
|
|
@ -570,63 +461,6 @@ var linuxAMD64Tests = []*asmTest{
|
||||||
}`,
|
}`,
|
||||||
pos: []string{"\tCMPQ\t[A-Z]"},
|
pos: []string{"\tCMPQ\t[A-Z]"},
|
||||||
},
|
},
|
||||||
// Non-constant rotate
|
|
||||||
{
|
|
||||||
fn: `func rot64l(x uint64, y int) uint64 {
|
|
||||||
z := uint(y & 63)
|
|
||||||
return x << z | x >> (64-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tROLQ\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot64r(x uint64, y int) uint64 {
|
|
||||||
z := uint(y & 63)
|
|
||||||
return x >> z | x << (64-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tRORQ\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot32l(x uint32, y int) uint32 {
|
|
||||||
z := uint(y & 31)
|
|
||||||
return x << z | x >> (32-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tROLL\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot32r(x uint32, y int) uint32 {
|
|
||||||
z := uint(y & 31)
|
|
||||||
return x >> z | x << (32-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tRORL\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot16l(x uint16, y int) uint16 {
|
|
||||||
z := uint(y & 15)
|
|
||||||
return x << z | x >> (16-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tROLW\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot16r(x uint16, y int) uint16 {
|
|
||||||
z := uint(y & 15)
|
|
||||||
return x >> z | x << (16-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tRORW\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot8l(x uint8, y int) uint8 {
|
|
||||||
z := uint(y & 7)
|
|
||||||
return x << z | x >> (8-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tROLB\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `func rot8r(x uint8, y int) uint8 {
|
|
||||||
z := uint(y & 7)
|
|
||||||
return x >> z | x << (8-z)
|
|
||||||
}`,
|
|
||||||
pos: []string{"\tRORB\t"},
|
|
||||||
},
|
|
||||||
// Check that array compare uses 2/4/8 byte compares
|
// Check that array compare uses 2/4/8 byte compares
|
||||||
{
|
{
|
||||||
fn: `
|
fn: `
|
||||||
|
|
@ -954,54 +788,6 @@ var linux386Tests = []*asmTest{
|
||||||
}
|
}
|
||||||
|
|
||||||
var linuxS390XTests = []*asmTest{
|
var linuxS390XTests = []*asmTest{
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f8(x uint64) uint64 {
|
|
||||||
return x<<7 + x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLLG\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f9(x uint64) uint64 {
|
|
||||||
return x<<7 | x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLLG\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f10(x uint64) uint64 {
|
|
||||||
return x<<7 ^ x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLLG\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f11(x uint32) uint32 {
|
|
||||||
return x<<7 + x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f12(x uint32) uint32 {
|
|
||||||
return x<<7 | x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f13(x uint32) uint32 {
|
|
||||||
return x<<7 ^ x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRLL\t[$]7,"},
|
|
||||||
},
|
|
||||||
// Fused multiply-add/sub instructions.
|
// Fused multiply-add/sub instructions.
|
||||||
{
|
{
|
||||||
fn: `
|
fn: `
|
||||||
|
|
@ -1048,30 +834,6 @@ var linuxS390XTests = []*asmTest{
|
||||||
}
|
}
|
||||||
|
|
||||||
var linuxARMTests = []*asmTest{
|
var linuxARMTests = []*asmTest{
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f0(x uint32) uint32 {
|
|
||||||
return x<<7 + x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tMOVW\tR[0-9]+@>25,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f1(x uint32) uint32 {
|
|
||||||
return x<<7 | x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tMOVW\tR[0-9]+@>25,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f2(x uint32) uint32 {
|
|
||||||
return x<<7 ^ x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tMOVW\tR[0-9]+@>25,"},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// make sure assembly output has matching offset and base register.
|
// make sure assembly output has matching offset and base register.
|
||||||
fn: `
|
fn: `
|
||||||
|
|
@ -1095,54 +857,6 @@ var linuxARMTests = []*asmTest{
|
||||||
}
|
}
|
||||||
|
|
||||||
var linuxARM64Tests = []*asmTest{
|
var linuxARM64Tests = []*asmTest{
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f0(x uint64) uint64 {
|
|
||||||
return x<<7 + x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROR\t[$]57,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f1(x uint64) uint64 {
|
|
||||||
return x<<7 | x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROR\t[$]57,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f2(x uint64) uint64 {
|
|
||||||
return x<<7 ^ x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROR\t[$]57,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f3(x uint32) uint32 {
|
|
||||||
return x<<7 + x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRORW\t[$]25,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f4(x uint32) uint32 {
|
|
||||||
return x<<7 | x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRORW\t[$]25,"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f5(x uint32) uint32 {
|
|
||||||
return x<<7 ^ x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tRORW\t[$]25,"},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
fn: `
|
fn: `
|
||||||
func $(x, y uint32) uint32 {
|
func $(x, y uint32) uint32 {
|
||||||
|
|
@ -1586,54 +1300,6 @@ var linuxPPC64LETests = []*asmTest{
|
||||||
`,
|
`,
|
||||||
pos: []string{"\tFMSUBS\t"},
|
pos: []string{"\tFMSUBS\t"},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f4(x uint32) uint32 {
|
|
||||||
return x<<7 | x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTLW\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f5(x uint32) uint32 {
|
|
||||||
return x<<7 + x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTLW\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f6(x uint32) uint32 {
|
|
||||||
return x<<7 ^ x>>25
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTLW\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f7(x uint64) uint64 {
|
|
||||||
return x<<7 | x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTL\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f8(x uint64) uint64 {
|
|
||||||
return x<<7 + x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTL\t"},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
fn: `
|
|
||||||
func f9(x uint64) uint64 {
|
|
||||||
return x<<7 ^ x>>57
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
pos: []string{"\tROTL\t"},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
// check that stack store is optimized away
|
// check that stack store is optimized away
|
||||||
fn: `
|
fn: `
|
||||||
|
|
|
||||||
|
|
@ -6,18 +6,153 @@
|
||||||
|
|
||||||
package codegen
|
package codegen
|
||||||
|
|
||||||
func rot32(x uint32) uint32 {
|
// ------------------- //
|
||||||
var a uint32
|
// const rotates //
|
||||||
a += x<<7 | x>>25 // amd64:"ROLL.*[$]7" arm:"MOVW.*@>25"
|
// ------------------- //
|
||||||
a += x<<8 + x>>24 // amd64:`ROLL.*\$8` arm:"MOVW.*@>24"
|
|
||||||
a += x<<9 ^ x>>23 // amd64:"ROLL.*\\$9" arm:"MOVW.*@>23"
|
|
||||||
return a
|
|
||||||
}
|
|
||||||
|
|
||||||
func rot64(x uint64) uint64 {
|
func rot64(x uint64) uint64 {
|
||||||
var a uint64
|
var a uint64
|
||||||
a += x<<7 | x>>57 // amd64:"ROL"
|
|
||||||
a += x<<8 + x>>56 // amd64:"ROL"
|
// amd64:"ROLQ\t[$]7"
|
||||||
a += x<<9 ^ x>>55 // amd64:"ROL"
|
// arm64:"ROR\t[$]57"
|
||||||
|
// s390x:"RLLG\t[$]7"
|
||||||
|
// ppc64le:"ROTL\t[$]7"
|
||||||
|
a += x<<7 | x>>57
|
||||||
|
|
||||||
|
// amd64:"ROLQ\t[$]8"
|
||||||
|
// arm64:"ROR\t[$]56"
|
||||||
|
// s390x:"RLLG\t[$]8"
|
||||||
|
// ppc64le:"ROTL\t[$]8"
|
||||||
|
a += x<<8 + x>>56
|
||||||
|
|
||||||
|
// amd64:"ROLQ\t[$]9"
|
||||||
|
// arm64:"ROR\t[$]55"
|
||||||
|
// s390x:"RLLG\t[$]9"
|
||||||
|
// ppc64le:"ROTL\t[$]9"
|
||||||
|
a += x<<9 ^ x>>55
|
||||||
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func rot32(x uint32) uint32 {
|
||||||
|
var a uint32
|
||||||
|
|
||||||
|
// amd64:"ROLL\t[$]7"
|
||||||
|
// arm:"MOVW\tR\\d+@>25"
|
||||||
|
// arm64:"RORW\t[$]25"
|
||||||
|
// s390x:"RLL\t[$]7"
|
||||||
|
// ppc64le:"ROTLW\t[$]7"
|
||||||
|
a += x<<7 | x>>25
|
||||||
|
|
||||||
|
// amd64:`ROLL\t[$]8`
|
||||||
|
// arm:"MOVW\tR\\d+@>24"
|
||||||
|
// arm64:"RORW\t[$]24"
|
||||||
|
// s390x:"RLL\t[$]8"
|
||||||
|
// ppc64le:"ROTLW\t[$]8"
|
||||||
|
a += x<<8 + x>>24
|
||||||
|
|
||||||
|
// amd64:"ROLL\t[$]9"
|
||||||
|
// arm:"MOVW\tR\\d+@>23"
|
||||||
|
// arm64:"RORW\t[$]23"
|
||||||
|
// s390x:"RLL\t[$]9"
|
||||||
|
// ppc64le:"ROTLW\t[$]9"
|
||||||
|
a += x<<9 ^ x>>23
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func rot16(x uint16) uint16 {
|
||||||
|
var a uint16
|
||||||
|
|
||||||
|
// amd64:"ROLW\t[$]7"
|
||||||
|
a += x<<7 | x>>9
|
||||||
|
|
||||||
|
// amd64:`ROLW\t[$]8`
|
||||||
|
a += x<<8 + x>>8
|
||||||
|
|
||||||
|
// amd64:"ROLW\t[$]9"
|
||||||
|
a += x<<9 ^ x>>7
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func rot8(x uint8) uint8 {
|
||||||
|
var a uint8
|
||||||
|
|
||||||
|
// amd64:"ROLB\t[$]5"
|
||||||
|
a += x<<5 | x>>3
|
||||||
|
|
||||||
|
// amd64:`ROLB\t[$]6`
|
||||||
|
a += x<<6 + x>>2
|
||||||
|
|
||||||
|
// amd64:"ROLB\t[$]7"
|
||||||
|
a += x<<7 ^ x>>1
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------- //
|
||||||
|
// non-const rotates //
|
||||||
|
// ----------------------- //
|
||||||
|
|
||||||
|
func rot64nc(x uint64, z uint) uint64 {
|
||||||
|
var a uint64
|
||||||
|
|
||||||
|
z &= 63
|
||||||
|
|
||||||
|
// amd64:"ROLQ"
|
||||||
|
a += x<<z | x>>(64-z)
|
||||||
|
|
||||||
|
// amd64:"RORQ"
|
||||||
|
a += x>>z | x<<(64-z)
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func rot32nc(x uint32, z uint) uint32 {
|
||||||
|
var a uint32
|
||||||
|
|
||||||
|
z &= 31
|
||||||
|
|
||||||
|
// amd64:"ROLL"
|
||||||
|
a += x<<z | x>>(32-z)
|
||||||
|
|
||||||
|
// amd64:"RORL"
|
||||||
|
a += x>>z | x<<(32-z)
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func rot16nc(x uint16, z uint) uint16 {
|
||||||
|
var a uint16
|
||||||
|
|
||||||
|
z &= 15
|
||||||
|
|
||||||
|
// amd64:"ROLW"
|
||||||
|
a += x<<z | x>>(16-z)
|
||||||
|
|
||||||
|
// amd64:"RORW"
|
||||||
|
a += x>>z | x<<(16-z)
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
func rot8nc(x uint8, z uint) uint8 {
|
||||||
|
var a uint8
|
||||||
|
|
||||||
|
z &= 7
|
||||||
|
|
||||||
|
// amd64:"ROLB"
|
||||||
|
a += x<<z | x>>(8-z)
|
||||||
|
|
||||||
|
// amd64:"RORB"
|
||||||
|
a += x>>z | x<<(8-z)
|
||||||
|
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
|
||||||
|
// Issue 18254: rotate after inlining
|
||||||
|
func f32(x uint32) uint32 {
|
||||||
|
// amd64:"ROLL\t[$]7"
|
||||||
|
return rot32nc(x, 7)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue