// 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\.(newobject|mallocgcTinySC2)`
	// 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")
}
