162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci 362306a36Sopenharmony_ci/* 462306a36Sopenharmony_ci * Copyright 2019, Michael Ellerman, IBM Corp. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <ppc-asm.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci .data 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_cijump_table: 1262306a36Sopenharmony_ci .long 0x0 1362306a36Sopenharmony_ci .long (.Lstate_1 - .Lstate_0) 1462306a36Sopenharmony_ci .long (.Lstate_2 - .Lstate_0) 1562306a36Sopenharmony_ci .long (.Lstate_3 - .Lstate_0) 1662306a36Sopenharmony_ci .long (.Lstate_4 - .Lstate_0) 1762306a36Sopenharmony_ci .long (.Lstate_5 - .Lstate_0) 1862306a36Sopenharmony_ci .long (.Lstate_6 - .Lstate_0) 1962306a36Sopenharmony_ci .long (.Lstate_7 - .Lstate_0) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci .text 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define ITER_SHIFT 31 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci.macro state number 2662306a36Sopenharmony_ci .balign 32 2762306a36Sopenharmony_ci.Lstate_\number: 2862306a36Sopenharmony_ci .if \number==7 2962306a36Sopenharmony_ci li r3, 0 3062306a36Sopenharmony_ci .else 3162306a36Sopenharmony_ci li r3, \number+1 3262306a36Sopenharmony_ci .endif 3362306a36Sopenharmony_ci b .Lloop 3462306a36Sopenharmony_ci.endm 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciFUNC_START(pattern_cache_loop) 3762306a36Sopenharmony_ci li r3, 0 3862306a36Sopenharmony_ci li r4, 1 3962306a36Sopenharmony_ci sldi r4, r4, ITER_SHIFT 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci.Lloop: cmpdi r4, 0 4262306a36Sopenharmony_ci beqlr 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci addi r4, r4, -1 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci ld r6, jump_table@got(%r2) 4762306a36Sopenharmony_ci sldi r5, r3, 2 4862306a36Sopenharmony_ci lwax r6, r5, r6 4962306a36Sopenharmony_ci ld r7, .Lstate_0@got(%r2) 5062306a36Sopenharmony_ci add r6, r6, r7 5162306a36Sopenharmony_ci mtctr r6 5262306a36Sopenharmony_ci bctr 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci state 0 5562306a36Sopenharmony_ci state 1 5662306a36Sopenharmony_ci state 2 5762306a36Sopenharmony_ci state 3 5862306a36Sopenharmony_ci state 4 5962306a36Sopenharmony_ci state 5 6062306a36Sopenharmony_ci state 6 6162306a36Sopenharmony_ci state 7 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ciFUNC_END(pattern_cache_loop) 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ciFUNC_START(indirect_branch_loop) 6762306a36Sopenharmony_ci li r3, 1 6862306a36Sopenharmony_ci sldi r3, r3, ITER_SHIFT 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci1: cmpdi r3, 0 7162306a36Sopenharmony_ci beqlr 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci addi r3, r3, -1 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci ld r4, 2f@got(%r2) 7662306a36Sopenharmony_ci mtctr r4 7762306a36Sopenharmony_ci bctr 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci .balign 32 8062306a36Sopenharmony_ci2: b 1b 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciFUNC_END(indirect_branch_loop) 83