1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0+ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun/* 4*4882a593Smuzhiyun * Copyright 2019, Michael Ellerman, IBM Corp. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun#include <ppc-asm.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun .data 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunjump_table: 12*4882a593Smuzhiyun .long 0x0 13*4882a593Smuzhiyun .long (.Lstate_1 - .Lstate_0) 14*4882a593Smuzhiyun .long (.Lstate_2 - .Lstate_0) 15*4882a593Smuzhiyun .long (.Lstate_3 - .Lstate_0) 16*4882a593Smuzhiyun .long (.Lstate_4 - .Lstate_0) 17*4882a593Smuzhiyun .long (.Lstate_5 - .Lstate_0) 18*4882a593Smuzhiyun .long (.Lstate_6 - .Lstate_0) 19*4882a593Smuzhiyun .long (.Lstate_7 - .Lstate_0) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun .text 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun#define ITER_SHIFT 31 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun.macro state number 26*4882a593Smuzhiyun .balign 32 27*4882a593Smuzhiyun.Lstate_\number: 28*4882a593Smuzhiyun .if \number==7 29*4882a593Smuzhiyun li r3, 0 30*4882a593Smuzhiyun .else 31*4882a593Smuzhiyun li r3, \number+1 32*4882a593Smuzhiyun .endif 33*4882a593Smuzhiyun b .Lloop 34*4882a593Smuzhiyun.endm 35*4882a593Smuzhiyun 36*4882a593SmuzhiyunFUNC_START(pattern_cache_loop) 37*4882a593Smuzhiyun li r3, 0 38*4882a593Smuzhiyun li r4, 1 39*4882a593Smuzhiyun sldi r4, r4, ITER_SHIFT 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun.Lloop: cmpdi r4, 0 42*4882a593Smuzhiyun beqlr 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun addi r4, r4, -1 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun ld r6, jump_table@got(%r2) 47*4882a593Smuzhiyun sldi r5, r3, 2 48*4882a593Smuzhiyun lwax r6, r5, r6 49*4882a593Smuzhiyun ld r7, .Lstate_0@got(%r2) 50*4882a593Smuzhiyun add r6, r6, r7 51*4882a593Smuzhiyun mtctr r6 52*4882a593Smuzhiyun bctr 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun state 0 55*4882a593Smuzhiyun state 1 56*4882a593Smuzhiyun state 2 57*4882a593Smuzhiyun state 3 58*4882a593Smuzhiyun state 4 59*4882a593Smuzhiyun state 5 60*4882a593Smuzhiyun state 6 61*4882a593Smuzhiyun state 7 62*4882a593Smuzhiyun 63*4882a593SmuzhiyunFUNC_END(pattern_cache_loop) 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun 66*4882a593SmuzhiyunFUNC_START(indirect_branch_loop) 67*4882a593Smuzhiyun li r3, 1 68*4882a593Smuzhiyun sldi r3, r3, ITER_SHIFT 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun1: cmpdi r3, 0 71*4882a593Smuzhiyun beqlr 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun addi r3, r3, -1 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun ld r4, 2f@got(%r2) 76*4882a593Smuzhiyun mtctr r4 77*4882a593Smuzhiyun bctr 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun .balign 32 80*4882a593Smuzhiyun2: b 1b 81*4882a593Smuzhiyun 82*4882a593SmuzhiyunFUNC_END(indirect_branch_loop) 83