golang slices 代码
文件路径:/test/codegen/slices.go
/ asmcheck
/ Copyright 2018 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
/ This file contains code generation tests related to the handling of
/ slice types.
/ ------------------ /
/ Clear /
/ ------------------ /
/ Issue #5373 optimize memset idiom
func SliceClear(s []int) []int {
/ amd64:`.*memclrNoHeapPointers`
for i := range s {
s[i] = 0
}
return s
}
func SliceClearPointers(s []*int) []*int {
/ amd64:`.*memclrHasPointers`
for i := range s {
s[i] = nil
}
return s
}
/ ------------------ /
/ Extension /
/ ------------------ /
/ Issue #21266 - avoid makeslice in append(x, make([]T, y)...)
func SliceExtensionConst(s []int) []int {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:-`.*runtime\.panicmakeslicelen`
return append(s, make([]int, 1<<2)...)
}
func SliceExtensionConstInt64(s []int) []int {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:-`.*runtime\.panicmakeslicelen`
return append(s, make([]int, int64(1<<2))...)
}
func SliceExtensionConstUint64(s []int) []int {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:-`.*runtime\.panicmakeslicelen`
return append(s, make([]int, uint64(1<<2))...)
}
func SliceExtensionConstUint(s []int) []int {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:-`.*runtime\.panicmakeslicelen`
return append(s, make([]int, uint(1<<2))...)
}
func SliceExtensionPointer(s []*int, l int) []*int {
/ amd64:`.*runtime\.memclrHasPointers`
/ amd64:-`.*runtime\.makeslice`
return append(s, make([]*int, l)...)
}
func SliceExtensionVar(s []byte, l int) []byte {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
return append(s, make([]byte, l)...)
}
func SliceExtensionVarInt64(s []byte, l int64) []byte {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:`.*runtime\.panicmakeslicelen`
return append(s, make([]byte, l)...)
}
func SliceExtensionVarUint64(s []byte, l uint64) []byte {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:`.*runtime\.panicmakeslicelen`
return append(s, make([]byte, l)...)
}
func SliceExtensionVarUint(s []byte, l uint) []byte {
/ amd64:`.*runtime\.memclrNoHeapPointers`
/ amd64:-`.*runtime\.makeslice`
/ amd64:`.*runtime\.panicmakeslicelen`
return append(s, make([]byte, l)...)
}
func SliceExtensionInt64(s []int, l64 int64) []int {
/ 386:`.*runtime\.makeslice`
/ 386:-`.*runtime\.memclr`
return append(s, make([]int, l64)...)
}
/ ------------------ /
/ Make+Copy /
/ ------------------ /
/ Issue #26252 - avoid memclr for make+copy
func SliceMakeCopyLen(s []int) []int {
/ amd64:`.*runtime\.mallocgc`
/ amd64:`.*runtime\.memmove`
/ amd64:-`.*runtime\.makeslice`
a := make([]int, len(s))
copy(a, s)
return a
}
func SliceMakeCopyLenPtr(s []*int) []*int {
/ amd64:`.*runtime\.makeslicecopy`
/ amd64:-`.*runtime\.makeslice\(`
/ amd64:-`.*runtime\.typedslicecopy
a := make([]*int, len(s))
copy(a, s)
return a
}
func SliceMakeCopyConst(s []int) []int {
/ amd64:`.*runtime\.makeslicecopy`
/ amd64:-`.*runtime\.makeslice\(`
/ amd64:-`.*runtime\.memmove`
a := make([]int, 4)
copy(a, s)
return a
}
func SliceMakeCopyConstPtr(s []*int) []*int {
/ amd64:`.*runtime\.makeslicecopy`
/ amd64:-`.*runtime\.makeslice\(`
/ amd64:-`.*runtime\.typedslicecopy
a := make([]*int, 4)
copy(a, s)
return a
}
func SliceMakeCopyNoOptNoDeref(s []*int) []*int {
a := new([]*int)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
*a = make([]*int, 4)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(*a, s)
return *a
}
func SliceMakeCopyNoOptNoVar(s []*int) []*int {
a := make([][]*int, 1)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a[0] = make([]*int, 4)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(a[0], s)
return a[0]
}
func SliceMakeCopyNoOptBlank(s []*int) []*int {
var a []*int
/ amd64:-`.*runtime\.makeslicecopy`
_ = make([]*int, 4)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(a, s)
return a
}
func SliceMakeCopyNoOptNoMake(s []*int) []*int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:-`.*runtime\.objectnew`
a := *new([]*int)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(a, s)
return a
}
func SliceMakeCopyNoOptNoHeapAlloc(s []*int) int {
/ amd64:-`.*runtime\.makeslicecopy`
a := make([]*int, 4)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(a, s)
return cap(a)
}
func SliceMakeCopyNoOptNoCap(s []*int) []*int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 0, 4)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.typedslicecopy`
copy(a, s)
return a
}
func SliceMakeCopyNoOptNoCopy(s []*int) []*int {
copy := func(x, y []*int) {}
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 4)
/ amd64:-`.*runtime\.makeslicecopy`
copy(a, s)
return a
}
func SliceMakeCopyNoOptWrongOrder(s []*int) []*int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 4)
/ amd64:`.*runtime\.typedslicecopy`
/ amd64:-`.*runtime\.makeslicecopy`
copy(s, a)
return a
}
func SliceMakeCopyNoOptWrongAssign(s []*int) []*int {
var a []*int
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
s = make([]*int, 4)
/ amd64:`.*runtime\.typedslicecopy`
/ amd64:-`.*runtime\.makeslicecopy`
copy(a, s)
return s
}
func SliceMakeCopyNoOptCopyLength(s []*int) (int, []*int) {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 4)
/ amd64:`.*runtime\.typedslicecopy`
/ amd64:-`.*runtime\.makeslicecopy`
n := copy(a, s)
return n, a
}
func SliceMakeCopyNoOptSelfCopy(s []*int) []*int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 4)
/ amd64:`.*runtime\.typedslicecopy`
/ amd64:-`.*runtime\.makeslicecopy`
copy(a, a)
return a
}
func SliceMakeCopyNoOptTargetReference(s []*int) []*int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]*int, 4)
/ amd64:`.*runtime\.typedslicecopy`
/ amd64:-`.*runtime\.makeslicecopy`
copy(a, s[:len(a)])
return a
}
func SliceMakeCopyNoOptCap(s []int) []int {
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.makeslice\(`
a := make([]int, len(s), 9)
/ amd64:-`.*runtime\.makeslicecopy`
/ amd64:`.*runtime\.memmove`
copy(a, s)
return a
}
func SliceMakeCopyNoMemmoveDifferentLen(s []int) []int {
/ amd64:`.*runtime\.makeslicecopy`
/ amd64:-`.*runtime\.memmove`
a := make([]int, len(s)-1)
/ amd64:-`.*runtime\.memmove`
copy(a, s)
return a
}
/ ---------------------- /
/ Nil check of &s[0] /
/ ---------------------- /
/ See issue 30366
func SliceNilCheck(s []int) {
p := &s[0]
/ amd64:-`TESTB`
_ = *p
}
/ ---------------------- /
/ Init slice literal /
/ ---------------------- /
/ See issue 21561
func InitSmallSliceLiteral() []int {
/ amd64:`MOVQ\t[$]42`
return []int{42}
}
func InitNotSmallSliceLiteral() []int {
/ amd64:`LEAQ\t.*stmp_`
return []int{
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
42,
}
}
/ --------------------------------------- /
/ Test PPC64 SUBFCconst folding rules /
/ triggered by slice operations. /
/ --------------------------------------- /
func SliceWithConstCompare(a []int, b int) []int {
var c []int = []int{1, 2, 3, 4, 5}
if b+len(a) < len(c) {
/ ppc64le:-"NEG"
/ ppc64:-"NEG"
return c[b:]
}
return a
}
func SliceWithSubtractBound(a []int, b int) []int {
/ ppc64le:"SUBC",-"NEG"
/ ppc64:"SUBC",-"NEG"
return a[(3 - b):]
}