Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 
0003 /*
0004  * Copyright 2019, Michael Ellerman, IBM Corp.
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)