memset.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* linux/arch/sparc/lib/memset.S: Sparc optimized memset, bzero and clear_user code
  2.  * Copyright (C) 1991,1996 Free Software Foundation
  3.  * Copyright (C) 1996,1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
  4.  * Copyright (C) 1996 David S. Miller (davem@caip.rutgers.edu)
  5.  *
  6.  * Returns 0, if ok, and number of bytes not yet set if exception
  7.  * occurs and we were called as clear_user.
  8.  */
  9. #include <asm/cprefix.h>
  10. #include <asm/ptrace.h>
  11. #define EX(x,y,a,b,z) 
  12. 98:  x,y;
  13. .section .fixup,z##alloc,z##execinstr;
  14. .align 4;
  15. 99: ba 30f;
  16.  a, b, %o0;
  17. .section __ex_table,z##alloc;
  18. .align 4;
  19. .word 98b, 99b;
  20. .text;
  21. .align 4
  22. #define EXT(start,end,handler,z) 
  23. .section __ex_table,z##alloc;
  24. .align 4;
  25. .word start, 0, end, handler;
  26. .text;
  27. .align 4
  28. /* Please don't change these macros, unless you change the logic
  29.  * in the .fixup section below as well.
  30.  * Store 64 bytes at (BASE + OFFSET) using value SOURCE. */
  31. #define ZERO_BIG_BLOCK(base, offset, source)    
  32. std source, [base + offset + 0x00]; 
  33. std source, [base + offset + 0x08]; 
  34. std source, [base + offset + 0x10]; 
  35. std source, [base + offset + 0x18]; 
  36. std source, [base + offset + 0x20]; 
  37. std source, [base + offset + 0x28]; 
  38. std source, [base + offset + 0x30]; 
  39. std source, [base + offset + 0x38];
  40. #define ZERO_LAST_BLOCKS(base, offset, source)
  41. std source, [base - offset - 0x38]; 
  42. std source, [base - offset - 0x30]; 
  43. std source, [base - offset - 0x28]; 
  44. std source, [base - offset - 0x20]; 
  45. std source, [base - offset - 0x18]; 
  46. std source, [base - offset - 0x10]; 
  47. std source, [base - offset - 0x08]; 
  48. std source, [base - offset - 0x00];
  49. .text
  50. .align 4
  51.         .globl  __bzero_begin
  52. __bzero_begin:
  53. .globl C_LABEL(__bzero), C_LABEL(__memset), 
  54. .globl C_LABEL(memset)
  55. .globl C_LABEL(__memset_start), C_LABEL(__memset_end)
  56. C_LABEL(__memset_start):
  57. C_LABEL(__memset):
  58. C_LABEL(memset):
  59. and %o1, 0xff, %g3
  60. sll %g3, 8, %g2
  61. or %g3, %g2, %g3
  62. sll %g3, 16, %g2
  63. or %g3, %g2, %g3
  64. b 1f
  65.  mov %o2, %o1
  66. 3:
  67. cmp %o2, 3
  68. be 2f
  69.  EX(stb %g3, [%o0], sub %o1, 0,#)
  70. cmp %o2, 2
  71. be 2f
  72.  EX(stb %g3, [%o0 + 0x01], sub %o1, 1,#)
  73. EX(stb %g3, [%o0 + 0x02], sub %o1, 2,#)
  74. 2:
  75. sub %o2, 4, %o2
  76. add %o1, %o2, %o1
  77. b 4f
  78.  sub %o0, %o2, %o0
  79. C_LABEL(__bzero):
  80. mov %g0, %g3
  81. 1:
  82. cmp %o1, 7
  83. bleu 7f
  84.  andcc %o0, 3, %o2
  85. bne 3b
  86. 4:
  87.  andcc %o0, 4, %g0
  88. be 2f
  89.  mov %g3, %g2
  90. EX(st %g3, [%o0], sub %o1, 0,#)
  91. sub %o1, 4, %o1
  92. add %o0, 4, %o0
  93. 2:
  94. andcc %o1, 0xffffff80, %o3 ! Now everything is 8 aligned and o1 is len to run
  95. be 9f
  96.  andcc %o1, 0x78, %o2
  97. 10:
  98. ZERO_BIG_BLOCK(%o0, 0x00, %g2)
  99. subcc %o3, 128, %o3
  100. ZERO_BIG_BLOCK(%o0, 0x40, %g2)
  101. 11:
  102. EXT(10b, 11b, 20f,#)
  103. bne 10b
  104.  add %o0, 128, %o0
  105. orcc %o2, %g0, %g0
  106. 9:
  107. be 13f
  108.  andcc %o1, 7, %o1
  109. srl %o2, 1, %o3
  110. set 13f, %o4
  111. sub %o4, %o3, %o4
  112. jmp %o4
  113.  add %o0, %o2, %o0
  114. 12:
  115. ZERO_LAST_BLOCKS(%o0, 0x48, %g2)
  116. ZERO_LAST_BLOCKS(%o0, 0x08, %g2)
  117. 13:
  118. be 8f
  119.  andcc %o1, 4, %g0
  120. be 1f
  121.  andcc %o1, 2, %g0
  122. EX(st %g3, [%o0], and %o1, 7,#)
  123. add %o0, 4, %o0
  124. 1:
  125. be 1f
  126.  andcc %o1, 1, %g0
  127. EX(sth %g3, [%o0], and %o1, 3,#)
  128. add %o0, 2, %o0
  129. 1:
  130. bne,a 8f
  131.  EX(stb %g3, [%o0], and %o1, 1,#)
  132. 8:
  133. retl
  134.  clr %o0
  135. 7:
  136. be 13b
  137.  orcc %o1, 0, %g0
  138. be 0f
  139. 8:
  140.  add %o0, 1, %o0
  141. subcc %o1, 1, %o1
  142. bne,a 8b
  143.  EX(stb %g3, [%o0 - 1], add %o1, 1,#)
  144. 0:
  145. retl
  146.  clr %o0
  147. C_LABEL(__memset_end):
  148. .section .fixup,#alloc,#execinstr
  149. .align 4
  150. 20:
  151. cmp %g2, 8
  152. bleu 1f
  153.  and %o1, 0x7f, %o1
  154. sub %g2, 9, %g2
  155. add %o3, 64, %o3
  156. 1:
  157. sll %g2, 3, %g2
  158. add %o3, %o1, %o0
  159. b 30f
  160.  sub %o0, %g2, %o0
  161. 21:
  162. mov 8, %o0
  163. and %o1, 7, %o1
  164. sub %o0, %g2, %o0
  165. sll %o0, 3, %o0
  166. b 30f
  167.  add %o0, %o1, %o0
  168. 30:
  169. /* %o4 is faulting address, %o5 is %pc where fault occurred */
  170. save %sp, -104, %sp
  171. mov %i5, %o0
  172. mov %i7, %o1
  173. call C_LABEL(lookup_fault)
  174.  mov %i4, %o2
  175. ret
  176.  restore
  177. .globl __bzero_end
  178. __bzero_end: