// 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 type:\[3\]uint8` // amd64:`CALL runtime\.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 \$12592, \(`,`MOVB \$50, 2\(` // 386:`MOVW \$12592, \(`,`MOVB \$50, 2\(` // arm:`MOVW \$48`,`MOVW \$49`,`MOVW \$50` // arm64:`MOVD \$12592`,`MOVD \$50` // loong64:`MOVV \$12592`,`MOVV \$50` // wasm:`I64Const \$12592`,`I64Store16 \$0`,`I64Const \$50`,`I64Store8 \$2` // mips64:`MOVV \$48`,`MOVV \$49`,`MOVV \$50` bsink = []byte("012") // 858927408 = 0x33323130 // 13620 = 0x3534 // amd64:`MOVL \$858927408`,`MOVW \$13620, 4\(` // 386:`MOVL \$858927408`,`MOVW \$13620, 4\(` // arm64:`MOVD \$858927408`,`MOVD \$13620` // loong64:`MOVV \$858927408`,`MOVV \$13620` // wasm:`I64Const \$858927408`,`I64Store32 \$0`,`I64Const \$13620`,`I64Store16 \$4` bsink = []byte("012345") // 3978425819141910832 = 0x3736353433323130 // 7306073769690871863 = 0x6564636261393837 // amd64:`MOVQ \$3978425819141910832`,`MOVQ \$7306073769690871863` // 386:`MOVL \$858927408, \(`,`DUFFCOPY` // arm64:`MOVD \$3978425819141910832`,`MOVD \$7306073769690871863`,`MOVD \$15` // loong64:`MOVV \$3978425819141910832`,`MOVV \$7306073769690871863`,`MOVV \$15` // wasm:`I64Const \$3978425819141910832`,`I64Store \$0`,`I64Const \$7306073769690871863`,`I64Store \$7` bsink = []byte("0123456789abcde") // 56 = 0x38 // amd64:`MOVQ \$3978425819141910832`,`MOVB \$56` // loong64:`MOVV \$3978425819141910832`,`MOVV \$56` bsink = []byte("012345678") // 14648 = 0x3938 // amd64:`MOVQ \$3978425819141910832`,`MOVW \$14648` // loong64:`MOVV \$3978425819141910832`,`MOVV \$14648` bsink = []byte("0123456789") // 1650538808 = 0x62613938 // amd64:`MOVQ \$3978425819141910832`,`MOVL \$1650538808` // loong64:`MOVV \$3978425819141910832`,`MOVV \$1650538808` bsink = []byte("0123456789ab") } // self-equality is always true. See issue 60777. func EqualSelf(s string) bool { // amd64:`MOVL \$1, AX`,-`.*memequal.*` return s == s } func NotEqualSelf(s string) bool { // amd64:`XORL AX, 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") }