una_asm.S 3.5 KB

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