| // SPDX-License-Identifier: GPL-2.0+ |
| |
| /* |
| * Copyright 2019, Michael Ellerman, IBM Corp. |
| */ |
| |
| #include <ppc-asm.h> |
| |
| .data |
| |
| jump_table: |
| .long 0x0 |
| .long (.Lstate_1 - .Lstate_0) |
| .long (.Lstate_2 - .Lstate_0) |
| .long (.Lstate_3 - .Lstate_0) |
| .long (.Lstate_4 - .Lstate_0) |
| .long (.Lstate_5 - .Lstate_0) |
| .long (.Lstate_6 - .Lstate_0) |
| .long (.Lstate_7 - .Lstate_0) |
| |
| .text |
| |
| #define ITER_SHIFT 31 |
| |
| .macro state number |
| .balign 32 |
| .Lstate_\number: |
| .if \number==7 |
| li r3, 0 |
| .else |
| li r3, \number+1 |
| .endif |
| b .Lloop |
| .endm |
| |
| FUNC_START(pattern_cache_loop) |
| li r3, 0 |
| li r4, 1 |
| sldi r4, r4, ITER_SHIFT |
| |
| .Lloop: cmpdi r4, 0 |
| beqlr |
| |
| addi r4, r4, -1 |
| |
| ld r6, jump_table@got(%r2) |
| sldi r5, r3, 2 |
| lwax r6, r5, r6 |
| ld r7, .Lstate_0@got(%r2) |
| add r6, r6, r7 |
| mtctr r6 |
| bctr |
| |
| state 0 |
| state 1 |
| state 2 |
| state 3 |
| state 4 |
| state 5 |
| state 6 |
| state 7 |
| |
| FUNC_END(pattern_cache_loop) |
| |
| |
| FUNC_START(indirect_branch_loop) |
| li r3, 1 |
| sldi r3, r3, ITER_SHIFT |
| |
| 1: cmpdi r3, 0 |
| beqlr |
| |
| addi r3, r3, -1 |
| |
| ld r4, 2f@got(%r2) |
| mtctr r4 |
| bctr |
| |
| .balign 32 |
| 2: b 1b |
| |
| FUNC_END(indirect_branch_loop) |