1// asmcheck
2
3// Copyright 2018 The Go Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style
5// license that can be found in the LICENSE file.
6
7package codegen
8
9// This file contains code generation tests related to the handling of
10// string types.
11
12func CountRunes(s string) int { // Issue #24923
13	// amd64:`.*countrunes`
14	return len([]rune(s))
15}
16
17func CountBytes(s []byte) int {
18	// amd64:-`.*runtime.slicebytetostring`
19	return len(string(s))
20}
21
22func ToByteSlice() []byte { // Issue #24698
23	// amd64:`LEAQ\ttype:\[3\]uint8`
24	// amd64:`CALL\truntime\.newobject`
25	// amd64:-`.*runtime.stringtoslicebyte`
26	return []byte("foo")
27}
28
29// Loading from read-only symbols should get transformed into constants.
30func ConstantLoad() {
31	// 12592 = 0x3130
32	//    50 = 0x32
33	// amd64:`MOVW\t\$12592, \(`,`MOVB\t\$50, 2\(`
34	//   386:`MOVW\t\$12592, \(`,`MOVB\t\$50, 2\(`
35	//   arm:`MOVW\t\$48`,`MOVW\t\$49`,`MOVW\t\$50`
36	// arm64:`MOVD\t\$12592`,`MOVD\t\$50`
37	//  wasm:`I64Const\t\$12592`,`I64Store16\t\$0`,`I64Const\t\$50`,`I64Store8\t\$2`
38	// mips64:`MOVV\t\$48`,`MOVV\t\$49`,`MOVV\t\$50`
39	bsink = []byte("012")
40
41	// 858927408 = 0x33323130
42	//     13620 = 0x3534
43	// amd64:`MOVL\t\$858927408`,`MOVW\t\$13620, 4\(`
44	//   386:`MOVL\t\$858927408`,`MOVW\t\$13620, 4\(`
45	// arm64:`MOVD\t\$858927408`,`MOVD\t\$13620`
46	//  wasm:`I64Const\t\$858927408`,`I64Store32\t\$0`,`I64Const\t\$13620`,`I64Store16\t\$4`
47	bsink = []byte("012345")
48
49	// 3978425819141910832 = 0x3736353433323130
50	// 7306073769690871863 = 0x6564636261393837
51	// amd64:`MOVQ\t\$3978425819141910832`,`MOVQ\t\$7306073769690871863`
52	//   386:`MOVL\t\$858927408, \(`,`DUFFCOPY`
53	// arm64:`MOVD\t\$3978425819141910832`,`MOVD\t\$7306073769690871863`,`MOVD\t\$15`
54	//  wasm:`I64Const\t\$3978425819141910832`,`I64Store\t\$0`,`I64Const\t\$7306073769690871863`,`I64Store\t\$7`
55	bsink = []byte("0123456789abcde")
56
57	// 56 = 0x38
58	// amd64:`MOVQ\t\$3978425819141910832`,`MOVB\t\$56`
59	bsink = []byte("012345678")
60
61	// 14648 = 0x3938
62	// amd64:`MOVQ\t\$3978425819141910832`,`MOVW\t\$14648`
63	bsink = []byte("0123456789")
64
65	// 1650538808 = 0x62613938
66	// amd64:`MOVQ\t\$3978425819141910832`,`MOVL\t\$1650538808`
67	bsink = []byte("0123456789ab")
68}
69
70// self-equality is always true. See issue 60777.
71func EqualSelf(s string) bool {
72	// amd64:`MOVL\t\$1, AX`,-`.*memequal.*`
73	return s == s
74}
75func NotEqualSelf(s string) bool {
76	// amd64:`XORL\tAX, AX`,-`.*memequal.*`
77	return s != s
78}
79
80var bsink []byte
81