branch_loops.S 1.0 KB

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