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 | |