mirror of
				https://github.com/golang/go.git
				synced 2025-10-31 00:30:57 +00:00 
			
		
		
		
	 c2a9c55823
			
		
	
	
		c2a9c55823
		
	
	
	
	
		
			
			We don't need a multiply when the element type is size 0 or 1. The panic functions don't return, so we don't need any post-call code (register restores, etc.). Change-Id: I0dcea5df56d29d7be26554ddca966b3903c672e5 Reviewed-on: https://go-review.googlesource.com/c/go/+/419754 TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com> Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Than McIntosh <thanm@google.com> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
		
			
				
	
	
		
			385 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
	
		
			8.4 KiB
		
	
	
	
		
			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
 | |
| 
 | |
| import "unsafe"
 | |
| 
 | |
| // 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):]
 | |
| }
 | |
| 
 | |
| // --------------------------------------- //
 | |
| //   Code generation for unsafe.Slice      //
 | |
| // --------------------------------------- //
 | |
| 
 | |
| func Slice1(p *byte, i int) []byte {
 | |
| 	// amd64:-"MULQ"
 | |
| 	return unsafe.Slice(p, i)
 | |
| }
 | |
| func Slice0(p *struct{}, i int) []struct{} {
 | |
| 	// amd64:-"MULQ"
 | |
| 	return unsafe.Slice(p, i)
 | |
| }
 |