0001 // SPDX-License-Identifier: GPL-2.0+
0002
0003
0004
0005
0006
0007 #include <ppc-asm.h>
0008
0009 .data
0010
0011 jump_table:
0012 .long 0x0
0013 .long (.Lstate_1 - .Lstate_0)
0014 .long (.Lstate_2 - .Lstate_0)
0015 .long (.Lstate_3 - .Lstate_0)
0016 .long (.Lstate_4 - .Lstate_0)
0017 .long (.Lstate_5 - .Lstate_0)
0018 .long (.Lstate_6 - .Lstate_0)
0019 .long (.Lstate_7 - .Lstate_0)
0020
0021 .text
0022
0023 #define ITER_SHIFT 31
0024
0025 .macro state number
0026 .balign 32
0027 .Lstate_\number:
0028 .if \number==7
0029 li r3, 0
0030 .else
0031 li r3, \number+1
0032 .endif
0033 b .Lloop
0034 .endm
0035
0036 FUNC_START(pattern_cache_loop)
0037 li r3, 0
0038 li r4, 1
0039 sldi r4, r4, ITER_SHIFT
0040
0041 .Lloop: cmpdi r4, 0
0042 beqlr
0043
0044 addi r4, r4, -1
0045
0046 ld r6, jump_table@got(%r2)
0047 sldi r5, r3, 2
0048 lwax r6, r5, r6
0049 ld r7, .Lstate_0@got(%r2)
0050 add r6, r6, r7
0051 mtctr r6
0052 bctr
0053
0054 state 0
0055 state 1
0056 state 2
0057 state 3
0058 state 4
0059 state 5
0060 state 6
0061 state 7
0062
0063 FUNC_END(pattern_cache_loop)
0064
0065
0066 FUNC_START(indirect_branch_loop)
0067 li r3, 1
0068 sldi r3, r3, ITER_SHIFT
0069
0070 1: cmpdi r3, 0
0071 beqlr
0072
0073 addi r3, r3, -1
0074
0075 ld r4, 2f@got(%r2)
0076 mtctr r4
0077 bctr
0078
0079 .balign 32
0080 2: b 1b
0081
0082 FUNC_END(indirect_branch_loop)