una_asm_64.S 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /* una_asm.S: Kernel unaligned trap assembler helpers.
  3. *
  4. * Copyright (C) 1996,2005 David S. Miller (davem@davemloft.net)
  5. * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  6. */
  7. .text
  8. .globl __do_int_store
  9. __do_int_store:
  10. rd %asi, %o4
  11. wr %o3, 0, %asi
  12. mov %o2, %g3
  13. cmp %o1, 2
  14. be,pn %icc, 2f
  15. cmp %o1, 4
  16. be,pt %icc, 1f
  17. srlx %g3, 24, %g2
  18. srlx %g3, 56, %g1
  19. srlx %g3, 48, %g7
  20. 4: stba %g1, [%o0] %asi
  21. srlx %g3, 40, %g1
  22. 5: stba %g7, [%o0 + 1] %asi
  23. srlx %g3, 32, %g7
  24. 6: stba %g1, [%o0 + 2] %asi
  25. 7: stba %g7, [%o0 + 3] %asi
  26. srlx %g3, 16, %g1
  27. 8: stba %g2, [%o0 + 4] %asi
  28. srlx %g3, 8, %g7
  29. 9: stba %g1, [%o0 + 5] %asi
  30. 10: stba %g7, [%o0 + 6] %asi
  31. ba,pt %xcc, 0f
  32. 11: stba %g3, [%o0 + 7] %asi
  33. 1: srl %g3, 16, %g7
  34. 12: stba %g2, [%o0] %asi
  35. srl %g3, 8, %g2
  36. 13: stba %g7, [%o0 + 1] %asi
  37. 14: stba %g2, [%o0 + 2] %asi
  38. ba,pt %xcc, 0f
  39. 15: stba %g3, [%o0 + 3] %asi
  40. 2: srl %g3, 8, %g2
  41. 16: stba %g2, [%o0] %asi
  42. 17: stba %g3, [%o0 + 1] %asi
  43. 0:
  44. wr %o4, 0x0, %asi
  45. retl
  46. mov 0, %o0
  47. .size __do_int_store, .-__do_int_store
  48. .section __ex_table,"a"
  49. .word 4b, __retl_efault
  50. .word 5b, __retl_efault
  51. .word 6b, __retl_efault
  52. .word 7b, __retl_efault
  53. .word 8b, __retl_efault
  54. .word 9b, __retl_efault
  55. .word 10b, __retl_efault
  56. .word 11b, __retl_efault
  57. .word 12b, __retl_efault
  58. .word 13b, __retl_efault
  59. .word 14b, __retl_efault
  60. .word 15b, __retl_efault
  61. .word 16b, __retl_efault
  62. .word 17b, __retl_efault
  63. .previous
  64. .globl do_int_load
  65. do_int_load:
  66. rd %asi, %o5
  67. wr %o4, 0, %asi
  68. cmp %o1, 8
  69. bge,pn %icc, 9f
  70. cmp %o1, 4
  71. be,pt %icc, 6f
  72. 4: lduba [%o2] %asi, %g2
  73. 5: lduba [%o2 + 1] %asi, %g3
  74. sll %g2, 8, %g2
  75. brz,pt %o3, 3f
  76. add %g2, %g3, %g2
  77. sllx %g2, 48, %g2
  78. srax %g2, 48, %g2
  79. 3: ba,pt %xcc, 0f
  80. stx %g2, [%o0]
  81. 6: lduba [%o2 + 1] %asi, %g3
  82. sll %g2, 24, %g2
  83. 7: lduba [%o2 + 2] %asi, %g7
  84. sll %g3, 16, %g3
  85. 8: lduba [%o2 + 3] %asi, %g1
  86. sll %g7, 8, %g7
  87. or %g2, %g3, %g2
  88. or %g7, %g1, %g7
  89. or %g2, %g7, %g2
  90. brnz,a,pt %o3, 3f
  91. sra %g2, 0, %g2
  92. 3: ba,pt %xcc, 0f
  93. stx %g2, [%o0]
  94. 9: lduba [%o2] %asi, %g2
  95. 10: lduba [%o2 + 1] %asi, %g3
  96. sllx %g2, 56, %g2
  97. 11: lduba [%o2 + 2] %asi, %g7
  98. sllx %g3, 48, %g3
  99. 12: lduba [%o2 + 3] %asi, %g1
  100. sllx %g7, 40, %g7
  101. sllx %g1, 32, %g1
  102. or %g2, %g3, %g2
  103. or %g7, %g1, %g7
  104. 13: lduba [%o2 + 4] %asi, %g3
  105. or %g2, %g7, %g7
  106. 14: lduba [%o2 + 5] %asi, %g1
  107. sllx %g3, 24, %g3
  108. 15: lduba [%o2 + 6] %asi, %g2
  109. sllx %g1, 16, %g1
  110. or %g7, %g3, %g7
  111. 16: lduba [%o2 + 7] %asi, %g3
  112. sllx %g2, 8, %g2
  113. or %g7, %g1, %g7
  114. or %g2, %g3, %g2
  115. or %g7, %g2, %g7
  116. cmp %o1, 8
  117. be,a,pt %icc, 0f
  118. stx %g7, [%o0]
  119. srlx %g7, 32, %g2
  120. sra %g7, 0, %g7
  121. stx %g2, [%o0]
  122. stx %g7, [%o0 + 8]
  123. 0:
  124. wr %o5, 0x0, %asi
  125. retl
  126. mov 0, %o0
  127. .size do_int_load, .-do_int_load
  128. .section __ex_table,"a"
  129. .word 4b, __retl_efault
  130. .word 5b, __retl_efault
  131. .word 6b, __retl_efault
  132. .word 7b, __retl_efault
  133. .word 8b, __retl_efault
  134. .word 9b, __retl_efault
  135. .word 10b, __retl_efault
  136. .word 11b, __retl_efault
  137. .word 12b, __retl_efault
  138. .word 13b, __retl_efault
  139. .word 14b, __retl_efault
  140. .word 15b, __retl_efault
  141. .word 16b, __retl_efault
  142. .previous