162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci/*
462306a36Sopenharmony_ci * Copyright 2019, Michael Ellerman, IBM Corp.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <ppc-asm.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci	.data
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cijump_table:
1262306a36Sopenharmony_ci	.long	0x0
1362306a36Sopenharmony_ci	.long	(.Lstate_1 - .Lstate_0)
1462306a36Sopenharmony_ci	.long	(.Lstate_2 - .Lstate_0)
1562306a36Sopenharmony_ci	.long	(.Lstate_3 - .Lstate_0)
1662306a36Sopenharmony_ci	.long	(.Lstate_4 - .Lstate_0)
1762306a36Sopenharmony_ci	.long	(.Lstate_5 - .Lstate_0)
1862306a36Sopenharmony_ci	.long	(.Lstate_6 - .Lstate_0)
1962306a36Sopenharmony_ci	.long	(.Lstate_7 - .Lstate_0)
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci	.text
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define ITER_SHIFT	31
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci.macro state number
2662306a36Sopenharmony_ci	.balign	32
2762306a36Sopenharmony_ci.Lstate_\number:
2862306a36Sopenharmony_ci	.if	\number==7
2962306a36Sopenharmony_ci	li	r3, 0
3062306a36Sopenharmony_ci	.else
3162306a36Sopenharmony_ci	li	r3, \number+1
3262306a36Sopenharmony_ci	.endif
3362306a36Sopenharmony_ci	b	.Lloop
3462306a36Sopenharmony_ci.endm
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciFUNC_START(pattern_cache_loop)
3762306a36Sopenharmony_ci	li	r3, 0
3862306a36Sopenharmony_ci	li	r4, 1
3962306a36Sopenharmony_ci	sldi	r4, r4, ITER_SHIFT
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci.Lloop:	cmpdi	r4, 0
4262306a36Sopenharmony_ci	beqlr
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	addi	r4, r4, -1
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	ld	r6, jump_table@got(%r2)
4762306a36Sopenharmony_ci	sldi	r5, r3, 2
4862306a36Sopenharmony_ci	lwax	r6, r5, r6
4962306a36Sopenharmony_ci	ld	r7, .Lstate_0@got(%r2)
5062306a36Sopenharmony_ci	add	r6, r6, r7
5162306a36Sopenharmony_ci	mtctr	r6
5262306a36Sopenharmony_ci	bctr
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	state	0
5562306a36Sopenharmony_ci	state	1
5662306a36Sopenharmony_ci	state	2
5762306a36Sopenharmony_ci	state	3
5862306a36Sopenharmony_ci	state	4
5962306a36Sopenharmony_ci	state	5
6062306a36Sopenharmony_ci	state	6
6162306a36Sopenharmony_ci	state	7
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciFUNC_END(pattern_cache_loop)
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ciFUNC_START(indirect_branch_loop)
6762306a36Sopenharmony_ci	li	r3, 1
6862306a36Sopenharmony_ci	sldi	r3, r3, ITER_SHIFT
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci1:	cmpdi	r3, 0
7162306a36Sopenharmony_ci	beqlr
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	addi	r3, r3, -1
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	ld	r4, 2f@got(%r2)
7662306a36Sopenharmony_ci	mtctr	r4
7762306a36Sopenharmony_ci	bctr
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	.balign 32
8062306a36Sopenharmony_ci2:	b	1b
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciFUNC_END(indirect_branch_loop)
83