1 // SPDX-License-Identifier: GPL-2.0+
2 
3 /*
4  * Copyright 2019, Michael Ellerman, IBM Corp.
5  */
6 
7 #include <ppc-asm.h>
8 
9 	.data
10 
11 jump_table:
12 	.long	0x0
13 	.long	(.Lstate_1 - .Lstate_0)
14 	.long	(.Lstate_2 - .Lstate_0)
15 	.long	(.Lstate_3 - .Lstate_0)
16 	.long	(.Lstate_4 - .Lstate_0)
17 	.long	(.Lstate_5 - .Lstate_0)
18 	.long	(.Lstate_6 - .Lstate_0)
19 	.long	(.Lstate_7 - .Lstate_0)
20 
21 	.text
22 
23 #define ITER_SHIFT	31
24 
25 .macro state number
26 	.balign	32
27 .Lstate_\number:
28 	.if	\number==7
29 	li	r3, 0
30 	.else
31 	li	r3, \number+1
32 	.endif
33 	b	.Lloop
34 .endm
35 
36 FUNC_START(pattern_cache_loop)
37 	li	r3, 0
38 	li	r4, 1
39 	sldi	r4, r4, ITER_SHIFT
40 
41 .Lloop:	cmpdi	r4, 0
42 	beqlr
43 
44 	addi	r4, r4, -1
45 
46 	ld	r6, jump_table@got(%r2)
47 	sldi	r5, r3, 2
48 	lwax	r6, r5, r6
49 	ld	r7, .Lstate_0@got(%r2)
50 	add	r6, r6, r7
51 	mtctr	r6
52 	bctr
53 
54 	state	0
55 	state	1
56 	state	2
57 	state	3
58 	state	4
59 	state	5
60 	state	6
61 	state	7
62 
63 FUNC_END(pattern_cache_loop)
64 
65 
66 FUNC_START(indirect_branch_loop)
67 	li	r3, 1
68 	sldi	r3, r3, ITER_SHIFT
69 
70 1:	cmpdi	r3, 0
71 	beqlr
72 
73 	addi	r3, r3, -1
74 
75 	ld	r4, 2f@got(%r2)
76 	mtctr	r4
77 	bctr
78 
79 	.balign 32
80 2:	b	1b
81 
82 FUNC_END(indirect_branch_loop)
83