| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- // 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)
|