// asmcheck

// Copyright 2023 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

func combine2string(p *[2]string, a, b string) {
	// amd64:`.*runtime[.]gcWriteBarrier4\(SB\)`
	// arm64:`.*runtime[.]gcWriteBarrier4\(SB\)`
	p[0] = a
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[1] = b
}

func combine4string(p *[4]string, a, b, c, d string) {
	// amd64:`.*runtime[.]gcWriteBarrier8\(SB\)`
	// arm64:`.*runtime[.]gcWriteBarrier8\(SB\)`
	p[0] = a
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[1] = b
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[2] = c
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[3] = d
}

func combine2slice(p *[2][]byte, a, b []byte) {
	// amd64:`.*runtime[.]gcWriteBarrier4\(SB\)`
	// arm64:`.*runtime[.]gcWriteBarrier4\(SB\)`
	p[0] = a
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[1] = b
}

func combine4slice(p *[4][]byte, a, b, c, d []byte) {
	// amd64:`.*runtime[.]gcWriteBarrier8\(SB\)`
	// arm64:`.*runtime[.]gcWriteBarrier8\(SB\)`
	p[0] = a
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[1] = b
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[2] = c
	// amd64:-`.*runtime[.]gcWriteBarrier`
	// arm64:-`.*runtime[.]gcWriteBarrier`
	p[3] = d
}

func trickyWriteNil(p *int, q **int) {
	if p == nil {
		// We change "= p" to "= 0" in the prove pass, which
		// means we have one less pointer that needs to go
		// into the write barrier buffer.
		// amd64:`.*runtime[.]gcWriteBarrier1`
		*q = p
	}
}

type S struct {
	a, b string
	c    *int
}

var g1, g2 *int

func issue71228(dst *S, ptr *int) {
	// Make sure that the non-write-barrier write.
	// "sp.c = ptr" happens before the large write
	// barrier "*dst = *sp". We approximate testing
	// that by ensuring that two global variable write
	// barriers aren't combined.
	_ = *dst
	var s S
	sp := &s
	//amd64:`.*runtime[.]gcWriteBarrier1`
	g1 = nil
	sp.c = ptr // outside of any write barrier
	//amd64:`.*runtime[.]gcWriteBarrier1`
	g2 = nil
	//amd64:`.*runtime[.]wbMove`
	*dst = *sp
}

func writeDouble(p *[2]*int, x, y *int) {
	// arm64: `LDP ` `STP \(R[0-9]+, R[0-9]+\), \(`
	p[0] = x
	// arm64: `STP \(R[0-9]+, R[0-9]+\), 16\(`
	p[1] = y
}

func writeDoubleNil(p *[2]*int) {
	// arm64: `LDP ` `STP \(R[0-9]+, R[0-9]+\),` `STP \(ZR, ZR\),`
	p[0] = nil
	p[1] = nil
}
