diff options
Diffstat (limited to 'test/codegen')
| -rw-r--r-- | test/codegen/append.go | 190 | ||||
| -rw-r--r-- | test/codegen/arithmetic.go | 21 | ||||
| -rw-r--r-- | test/codegen/bool.go | 15 | ||||
| -rw-r--r-- | test/codegen/fuse.go | 120 | ||||
| -rw-r--r-- | test/codegen/strings.go | 2 |
5 files changed, 344 insertions, 4 deletions
diff --git a/test/codegen/append.go b/test/codegen/append.go new file mode 100644 index 0000000000..0e58a48c45 --- /dev/null +++ b/test/codegen/append.go @@ -0,0 +1,190 @@ +// asmcheck + +// Copyright 2025 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package codegen + +func Append1(n int) []int { + var r []int + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append2(n int) (r []int) { + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return +} + +func Append3(n int) (r []int) { + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append4(n int) []int { + var r []int + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, i) + } + println(cap(r)) + // amd64:`.*moveSliceNoScan` + return r +} + +func Append5(n int) []int { + var r []int + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, i) + } + useSlice(r) + // amd64:`.*moveSliceNoScan` + return r +} + +func Append6(n int) []*int { + var r []*int + for i := range n { + // amd64:`.*growslice` + r = append(r, new(i)) + } + // amd64:`.*moveSliceNoCap` + return r +} + +func Append7(n int) []*int { + var r []*int + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, new(i)) + } + println(cap(r)) + // amd64:`.*moveSlice` + return r +} + +func Append8(n int, p *[]int) { + var r []int + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + *p = r +} + +func Append9(n int) []int { + var r []int + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + println(len(r)) + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append10(n int) []int { + var r []int + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + println(r[3]) + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append11(n int) []int { + var r []int + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, i) + } + r = r[3:5] + // amd64:`.*moveSliceNoScan` + return r +} + +func Append12(n int) []int { + var r []int + r = nil + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append13(n int) []int { + var r []int + r, r = nil, nil + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append14(n int) []int { + var r []int + r = []int{3, 4, 5} + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, i) + } + // amd64:`.*moveSliceNoScan` + return r +} + +func Append15(n int) []int { + r := []int{3, 4, 5} + for i := range n { + // amd64:`.*growsliceBuf` + r = append(r, i) + } + // amd64:`.*moveSliceNoScan` + return r +} + +func Append16(r []int, n int) []int { + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +func Append17(n int) []int { + var r []int + for i := range n { + // amd64:`.*growslice` + r = append(r, i) + } + for i, x := range r { + println(i, x) + } + // amd64:`.*moveSliceNoCapNoScan` + return r +} + +//go:noinline +func useSlice(s []int) { +} diff --git a/test/codegen/arithmetic.go b/test/codegen/arithmetic.go index 42d5d2ef65..9443d812dc 100644 --- a/test/codegen/arithmetic.go +++ b/test/codegen/arithmetic.go @@ -318,13 +318,28 @@ func MergeMuls5(a, n int) int { // Multiplications folded negation func FoldNegMul(a int) int { - // loong64:"SUBVU" "ALSLV [$]2" "ALSLV [$]1" - return (-a) * 11 + // amd64:"IMUL3Q [$]-11" -"NEGQ" + // arm64:"MOVD [$]-11" "MUL" -"NEG" + // loong64:"ALSLV [$]2" "SUBVU" "ALSLV [$]4" + // riscv64:"MOV [$]-11" "MUL" -"NEG" + return -a * 11 } func Fold2NegMul(a, b int) int { + // amd64:"IMULQ" -"NEGQ" + // arm64:"MUL" -"NEG" // loong64:"MULV" -"SUBVU R[0-9], R0," - return (-a) * (-b) + // riscv64:"MUL" -"NEG" + return -a * -b +} + +func Mul32(a, b int32) int64 { + // arm64:"SMULL" -"MOVW" + return int64(a) * int64(b) +} +func Mul32U(a, b uint32) uint64 { + // arm64:"UMULL" -"MOVWU" + return uint64(a) * uint64(b) } // -------------- // diff --git a/test/codegen/bool.go b/test/codegen/bool.go index 37f85a45b7..8fe7a94687 100644 --- a/test/codegen/bool.go +++ b/test/codegen/bool.go @@ -313,3 +313,18 @@ func constantWrite(b bool, p *bool) { *p = b } } + +func boolCompare1(p, q *bool) int { + // arm64:-"EOR [$]1" + if *p == *q { + return 5 + } + return 7 +} +func boolCompare2(p, q *bool) int { + // arm64:-"EOR [$]1" + if *p != *q { + return 5 + } + return 7 +} diff --git a/test/codegen/fuse.go b/test/codegen/fuse.go index 4fbb03bef8..e5a28549dc 100644 --- a/test/codegen/fuse.go +++ b/test/codegen/fuse.go @@ -198,6 +198,126 @@ func ui4d(c <-chan uint8) { } } +// ------------------------------------ // +// single bit difference (conjunction) // +// ------------------------------------ // + +func sisbc64(c <-chan int64) { + // amd64: "ORQ [$]2," + // riscv64: "ORI [$]2," + for x := <-c; x != 4 && x != 6; x = <-c { + } +} + +func sisbc32(c <-chan int32) { + // amd64: "ORL [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x != -1 && x != -5; x = <-c { + } +} + +func sisbc16(c <-chan int16) { + // amd64: "ORL [$]32," + // riscv64: "ORI [$]32," + for x := <-c; x != 16 && x != 48; x = <-c { + } +} + +func sisbc8(c <-chan int8) { + // amd64: "ORL [$]16," + // riscv64: "ORI [$]16," + for x := <-c; x != -15 && x != -31; x = <-c { + } +} + +func uisbc64(c <-chan uint64) { + // amd64: "ORQ [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x != 1 && x != 5; x = <-c { + } +} + +func uisbc32(c <-chan uint32) { + // amd64: "ORL [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x != 2 && x != 6; x = <-c { + } +} + +func uisbc16(c <-chan uint16) { + // amd64: "ORL [$]32," + // riscv64: "ORI [$]32," + for x := <-c; x != 16 && x != 48; x = <-c { + } +} + +func uisbc8(c <-chan uint8) { + // amd64: "ORL [$]64," + // riscv64: "ORI [$]64," + for x := <-c; x != 64 && x != 0; x = <-c { + } +} + +// ------------------------------------ // +// single bit difference (disjunction) // +// ------------------------------------ // + +func sisbd64(c <-chan int64) { + // amd64: "ORQ [$]2," + // riscv64: "ORI [$]2," + for x := <-c; x == 4 || x == 6; x = <-c { + } +} + +func sisbd32(c <-chan int32) { + // amd64: "ORL [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x == -1 || x == -5; x = <-c { + } +} + +func sisbd16(c <-chan int16) { + // amd64: "ORL [$]32," + // riscv64: "ORI [$]32," + for x := <-c; x == 16 || x == 48; x = <-c { + } +} + +func sisbd8(c <-chan int8) { + // amd64: "ORL [$]16," + // riscv64: "ORI [$]16," + for x := <-c; x == -15 || x == -31; x = <-c { + } +} + +func uisbd64(c <-chan uint64) { + // amd64: "ORQ [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x == 1 || x == 5; x = <-c { + } +} + +func uisbd32(c <-chan uint32) { + // amd64: "ORL [$]4," + // riscv64: "ORI [$]4," + for x := <-c; x == 2 || x == 6; x = <-c { + } +} + +func uisbd16(c <-chan uint16) { + // amd64: "ORL [$]32," + // riscv64: "ORI [$]32," + for x := <-c; x == 16 || x == 48; x = <-c { + } +} + +func uisbd8(c <-chan uint8) { + // amd64: "ORL [$]64," + // riscv64: "ORI [$]64," + for x := <-c; x == 64 || x == 0; x = <-c { + } +} + // -------------------------------------// // merge NaN checks // // ------------------------------------ // diff --git a/test/codegen/strings.go b/test/codegen/strings.go index 9d85604395..0c5ee2f8f5 100644 --- a/test/codegen/strings.go +++ b/test/codegen/strings.go @@ -23,7 +23,7 @@ func CountBytes(s []byte) int { func ToByteSlice() []byte { // Issue #24698 // amd64:`LEAQ type:\[3\]uint8` - // amd64:`CALL runtime\.mallocTiny3` + // amd64:`CALL runtime\.(newobject|mallocTiny3)` // amd64:-`.*runtime.stringtoslicebyte` return []byte("foo") } |
