copy_user_template.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
  4. */
  5. /* Numerology:
  6. * WXYZ
  7. * W: width in bytes
  8. * X: Load=0, Store=1
  9. * Y: Location 0=preamble,8=loop,9=epilog
  10. * Z: Location=0,handler=9
  11. */
  12. .text
  13. .global FUNCNAME
  14. .type FUNCNAME, @function
  15. .p2align 5
  16. FUNCNAME:
  17. {
  18. p0 = cmp.gtu(bytes,#0)
  19. if (!p0.new) jump:nt .Ldone
  20. r3 = or(dst,src)
  21. r4 = xor(dst,src)
  22. }
  23. {
  24. p1 = cmp.gtu(bytes,#15)
  25. p0 = bitsclr(r3,#7)
  26. if (!p0.new) jump:nt .Loop_not_aligned_8
  27. src_dst_sav = combine(src,dst)
  28. }
  29. {
  30. loopcount = lsr(bytes,#3)
  31. if (!p1) jump .Lsmall
  32. }
  33. p3=sp1loop0(.Loop8,loopcount)
  34. .Loop8:
  35. 8080:
  36. 8180:
  37. {
  38. if (p3) memd(dst++#8) = d_dbuf
  39. d_dbuf = memd(src++#8)
  40. }:endloop0
  41. 8190:
  42. {
  43. memd(dst++#8) = d_dbuf
  44. bytes -= asl(loopcount,#3)
  45. jump .Lsmall
  46. }
  47. .Loop_not_aligned_8:
  48. {
  49. p0 = bitsclr(r4,#7)
  50. if (p0.new) jump:nt .Lalign
  51. }
  52. {
  53. p0 = bitsclr(r3,#3)
  54. if (!p0.new) jump:nt .Loop_not_aligned_4
  55. p1 = cmp.gtu(bytes,#7)
  56. }
  57. {
  58. if (!p1) jump .Lsmall
  59. loopcount = lsr(bytes,#2)
  60. }
  61. p3=sp1loop0(.Loop4,loopcount)
  62. .Loop4:
  63. 4080:
  64. 4180:
  65. {
  66. if (p3) memw(dst++#4) = w_dbuf
  67. w_dbuf = memw(src++#4)
  68. }:endloop0
  69. 4190:
  70. {
  71. memw(dst++#4) = w_dbuf
  72. bytes -= asl(loopcount,#2)
  73. jump .Lsmall
  74. }
  75. .Loop_not_aligned_4:
  76. {
  77. p0 = bitsclr(r3,#1)
  78. if (!p0.new) jump:nt .Loop_not_aligned
  79. p1 = cmp.gtu(bytes,#3)
  80. }
  81. {
  82. if (!p1) jump .Lsmall
  83. loopcount = lsr(bytes,#1)
  84. }
  85. p3=sp1loop0(.Loop2,loopcount)
  86. .Loop2:
  87. 2080:
  88. 2180:
  89. {
  90. if (p3) memh(dst++#2) = w_dbuf
  91. w_dbuf = memuh(src++#2)
  92. }:endloop0
  93. 2190:
  94. {
  95. memh(dst++#2) = w_dbuf
  96. bytes -= asl(loopcount,#1)
  97. jump .Lsmall
  98. }
  99. .Loop_not_aligned: /* Works for as small as one byte */
  100. p3=sp1loop0(.Loop1,bytes)
  101. .Loop1:
  102. 1080:
  103. 1180:
  104. {
  105. if (p3) memb(dst++#1) = w_dbuf
  106. w_dbuf = memub(src++#1)
  107. }:endloop0
  108. /* Done */
  109. 1190:
  110. {
  111. memb(dst) = w_dbuf
  112. jumpr r31
  113. r0 = #0
  114. }
  115. .Lsmall:
  116. {
  117. p0 = cmp.gtu(bytes,#0)
  118. if (p0.new) jump:nt .Loop_not_aligned
  119. }
  120. .Ldone:
  121. {
  122. r0 = #0
  123. jumpr r31
  124. }
  125. .falign
  126. .Lalign:
  127. 1000:
  128. {
  129. if (p0.new) w_dbuf = memub(src)
  130. p0 = tstbit(src,#0)
  131. if (!p1) jump .Lsmall
  132. }
  133. 1100:
  134. {
  135. if (p0) memb(dst++#1) = w_dbuf
  136. if (p0) bytes = add(bytes,#-1)
  137. if (p0) src = add(src,#1)
  138. }
  139. 2000:
  140. {
  141. if (p0.new) w_dbuf = memuh(src)
  142. p0 = tstbit(src,#1)
  143. if (!p1) jump .Lsmall
  144. }
  145. 2100:
  146. {
  147. if (p0) memh(dst++#2) = w_dbuf
  148. if (p0) bytes = add(bytes,#-2)
  149. if (p0) src = add(src,#2)
  150. }
  151. 4000:
  152. {
  153. if (p0.new) w_dbuf = memw(src)
  154. p0 = tstbit(src,#2)
  155. if (!p1) jump .Lsmall
  156. }
  157. 4100:
  158. {
  159. if (p0) memw(dst++#4) = w_dbuf
  160. if (p0) bytes = add(bytes,#-4)
  161. if (p0) src = add(src,#4)
  162. jump FUNCNAME
  163. }
  164. .size FUNCNAME,.-FUNCNAME