// Copyright 2024 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.

TEXT ·bad1(SB), 0, $0
	MOVD	$0, R29 // want `frame pointer is clobbered before saving`
	RET
TEXT ·bad2(SB), 0, $0
	MOVD	R1, R29 // want `frame pointer is clobbered before saving`
	RET
TEXT ·bad3(SB), 0, $0
	MOVD	6(R2), R29 // want `frame pointer is clobbered before saving`
	RET
TEXT ·bad4(SB), 0, $0
	LDP	0(R1), (R26, R29) // want `frame pointer is clobbered before saving`
	RET
TEXT ·bad5(SB), 0, $0
	AND	$0x1, R3, R29 // want `frame pointer is clobbered before saving`
	RET
TEXT ·bad6(SB), 0, $0
	CMP	R1, R2
	BEQ	skip
	// Assume that the above conditional branch is not taken
	MOVD	$0, R29 // want `frame pointer is clobbered before saving`
skip:
	RET
TEXT ·bad7(SB), 0, $0
	BL	·good4(SB)
	AND	$0x1, R3, R29 // want `frame pointer is clobbered before saving`
	RET
TEXT ·good1(SB), 0, $0
	STPW 	(R29, R30), -32(RSP)
	MOVD	$0, R29 // this is ok
	LDPW	32(RSP), (R29, R30)
	RET
TEXT ·good2(SB), 0, $0
	MOVD	R29, R1
	MOVD	$0, R29 // this is ok
	MOVD	R1, R29
	RET
TEXT ·good3(SB), 0, $0
	CMP	R1, R2
	B	skip
	MOVD	$0, R29 // this is ok
skip:
	RET
TEXT ·good4(SB), 0, $0
	RET
	MOVD	$0, R29 // this is ok
	RET
TEXT ·good5(SB), 0, $8
	MOVD	$0, R29 // this is ok
	RET
