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 11jump_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 36FUNC_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 63FUNC_END(pattern_cache_loop) 64 65 66FUNC_START(indirect_branch_loop) 67 li r3, 1 68 sldi r3, r3, ITER_SHIFT 69 701: 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 802: b 1b 81 82FUNC_END(indirect_branch_loop) 83