mirror of
https://github.com/golang/go.git
synced 2025-10-20 11:33:18 +00:00

This change creates calls to size-specialized malloc functions instead of calls to newObject when we know the size of the allocation at compilation time. Most of it is a matter of calling the newObject function (which will create calls to the size-specialized functions) rather then the newObjectNonSpecialized function (which won't). In the newHeapaddr, small, non-pointer case, we'll create a non specialized newObject and transform that into the appropriate size-specialized function when we produce the mallocgc in flushPendingHeapAllocations. We have to update some of the rewrites in generic.rules to also apply to the size-specialized functions when they apply to newObject. The messiest thing is we have to adjust the offset we use to save the memory profiler stack, because the depth of the call to profilealloc is two frames fewer in the size-specialized malloc functions compared to when newObject calls mallocgc. A bunch of tests have been adjusted to account for that. Change-Id: I6a6a6964c9037fb6719e392c4a498ed700b617d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/707856 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Michael Matloob <matloob@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Keith Randall <khr@golang.org>
113 lines
3.3 KiB
Go
113 lines
3.3 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 "strings"
|
|
|
|
// This file contains code generation tests related to the handling of
|
|
// string types.
|
|
|
|
func CountRunes(s string) int { // Issue #24923
|
|
// amd64:`.*countrunes`
|
|
return len([]rune(s))
|
|
}
|
|
|
|
func CountBytes(s []byte) int {
|
|
// amd64:-`.*runtime.slicebytetostring`
|
|
return len(string(s))
|
|
}
|
|
|
|
func ToByteSlice() []byte { // Issue #24698
|
|
// amd64:`LEAQ\ttype:\[3\]uint8`
|
|
// amd64:`CALL\truntime\.mallocTiny3`
|
|
// amd64:-`.*runtime.stringtoslicebyte`
|
|
return []byte("foo")
|
|
}
|
|
|
|
func ConvertToByteSlice(a, b, c string) []byte {
|
|
// amd64:`.*runtime.concatbyte3`
|
|
return []byte(a + b + c)
|
|
}
|
|
|
|
// Loading from read-only symbols should get transformed into constants.
|
|
func ConstantLoad() {
|
|
// 12592 = 0x3130
|
|
// 50 = 0x32
|
|
// amd64:`MOVW\t\$12592, \(`,`MOVB\t\$50, 2\(`
|
|
// 386:`MOVW\t\$12592, \(`,`MOVB\t\$50, 2\(`
|
|
// arm:`MOVW\t\$48`,`MOVW\t\$49`,`MOVW\t\$50`
|
|
// arm64:`MOVD\t\$12592`,`MOVD\t\$50`
|
|
// loong64:`MOVV\t\$12592`,`MOVV\t\$50`
|
|
// wasm:`I64Const\t\$12592`,`I64Store16\t\$0`,`I64Const\t\$50`,`I64Store8\t\$2`
|
|
// mips64:`MOVV\t\$48`,`MOVV\t\$49`,`MOVV\t\$50`
|
|
bsink = []byte("012")
|
|
|
|
// 858927408 = 0x33323130
|
|
// 13620 = 0x3534
|
|
// amd64:`MOVL\t\$858927408`,`MOVW\t\$13620, 4\(`
|
|
// 386:`MOVL\t\$858927408`,`MOVW\t\$13620, 4\(`
|
|
// arm64:`MOVD\t\$858927408`,`MOVD\t\$13620`
|
|
// loong64:`MOVV\t\$858927408`,`MOVV\t\$13620`
|
|
// wasm:`I64Const\t\$858927408`,`I64Store32\t\$0`,`I64Const\t\$13620`,`I64Store16\t\$4`
|
|
bsink = []byte("012345")
|
|
|
|
// 3978425819141910832 = 0x3736353433323130
|
|
// 7306073769690871863 = 0x6564636261393837
|
|
// amd64:`MOVQ\t\$3978425819141910832`,`MOVQ\t\$7306073769690871863`
|
|
// 386:`MOVL\t\$858927408, \(`,`DUFFCOPY`
|
|
// arm64:`MOVD\t\$3978425819141910832`,`MOVD\t\$7306073769690871863`,`MOVD\t\$15`
|
|
// loong64:`MOVV\t\$3978425819141910832`,`MOVV\t\$7306073769690871863`,`MOVV\t\$15`
|
|
// wasm:`I64Const\t\$3978425819141910832`,`I64Store\t\$0`,`I64Const\t\$7306073769690871863`,`I64Store\t\$7`
|
|
bsink = []byte("0123456789abcde")
|
|
|
|
// 56 = 0x38
|
|
// amd64:`MOVQ\t\$3978425819141910832`,`MOVB\t\$56`
|
|
// loong64:`MOVV\t\$3978425819141910832`,`MOVV\t\$56`
|
|
bsink = []byte("012345678")
|
|
|
|
// 14648 = 0x3938
|
|
// amd64:`MOVQ\t\$3978425819141910832`,`MOVW\t\$14648`
|
|
// loong64:`MOVV\t\$3978425819141910832`,`MOVV\t\$14648`
|
|
bsink = []byte("0123456789")
|
|
|
|
// 1650538808 = 0x62613938
|
|
// amd64:`MOVQ\t\$3978425819141910832`,`MOVL\t\$1650538808`
|
|
// loong64:`MOVV\t\$3978425819141910832`,`MOVV\t\$1650538808`
|
|
bsink = []byte("0123456789ab")
|
|
}
|
|
|
|
// self-equality is always true. See issue 60777.
|
|
func EqualSelf(s string) bool {
|
|
// amd64:`MOVL\t\$1, AX`,-`.*memequal.*`
|
|
return s == s
|
|
}
|
|
func NotEqualSelf(s string) bool {
|
|
// amd64:`XORL\tAX, AX`,-`.*memequal.*`
|
|
return s != s
|
|
}
|
|
|
|
var bsink []byte
|
|
|
|
func HasPrefix3(s string) bool {
|
|
// amd64:-`.*memequal.*`
|
|
return strings.HasPrefix(s, "str")
|
|
}
|
|
|
|
func HasPrefix5(s string) bool {
|
|
// amd64:-`.*memequal.*`
|
|
return strings.HasPrefix(s, "strin")
|
|
}
|
|
|
|
func HasPrefix6(s string) bool {
|
|
// amd64:-`.*memequal.*`
|
|
return strings.HasPrefix(s, "string")
|
|
}
|
|
|
|
func HasPrefix7(s string) bool {
|
|
// amd64:-`.*memequal.*`
|
|
return strings.HasPrefix(s, "strings")
|
|
}
|