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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: VISbzero.S,v 1.11 2001/03/15 08:51:24 anton Exp $
  2.  * VISbzero.S: High speed clear operations utilizing the UltraSparc
  3.  *        Visual Instruction Set.
  4.  *
  5.  * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
  6.  * Copyright (C) 1996, 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  7.  */
  8. #include "VIS.h"
  9. #ifdef __KERNEL__
  10. #include <asm/visasm.h>
  11. #define EXN(x,y,a,b,z) 
  12. 98:  x,y;
  13. .section .fixup;
  14. .align 4;
  15. 99: ba VISbzerofixup_ret##z;
  16.  a, b, %o0;
  17. .section __ex_table;
  18. .align 4;
  19. .word 98b, 99b;
  20. .text;
  21. .align 4;
  22. #define EXC(x,y,a,b,c...) 
  23. 98:  x,y;
  24. .section .fixup;
  25. .align 4;
  26. 99: c;
  27. ba VISbzerofixup_ret0;
  28.  a, b, %o0;
  29. .section __ex_table;
  30. .align 4;
  31. .word 98b, 99b;
  32. .text;
  33. .align 4;
  34. #define EXO1(x,y) 
  35. 98:  x,y;
  36. .section __ex_table;
  37. .align 4;
  38. .word 98b, VISbzerofixup_reto1;
  39. .text;
  40. .align 4;
  41. #define EX(x,y,a,b) EXN(x,y,a,b,0)
  42. #define EX1(x,y,a,b) EXN(x,y,a,b,1)
  43. #define EX2(x,y,a,b) EXN(x,y,a,b,2)
  44. #define EXT(start,end,handler) 
  45. .section __ex_table;
  46. .align 4;
  47. .word start, 0, end, handler;
  48. .text;
  49. .align 4
  50. #else
  51. #define EX(x,y,a,b) x,y
  52. #define EX1(x,y,a,b) x,y
  53. #define EX2(x,y,a,b) x,y
  54. #define EXC(x,y,a,b,c...) x,y
  55. #define EXO1(x,y) x,y
  56. #define EXT(a,b,c)
  57. #endif
  58. #define ZERO_BLOCKS(base, offset, source)
  59. STX source, [base - offset - 0x38] ASINORMAL;
  60. STX source, [base - offset - 0x30] ASINORMAL;
  61. STX source, [base - offset - 0x28] ASINORMAL;
  62. STX source, [base - offset - 0x20] ASINORMAL;
  63. STX source, [base - offset - 0x18] ASINORMAL;
  64. STX source, [base - offset - 0x10] ASINORMAL;
  65. STX source, [base - offset - 0x08] ASINORMAL;
  66. STX source, [base - offset - 0x00] ASINORMAL;
  67. #ifdef __KERNEL__
  68. #define RETL clr %o0
  69. #else
  70. #define RETL mov %g3, %o0
  71. #endif
  72. /* Well, bzero is a lot easier to get right than bcopy... */
  73. #ifdef __KERNEL__
  74. .section __ex_table,#alloc
  75. .section .fixup,#alloc,#execinstr
  76. #endif
  77. .text
  78. .align 32
  79. #ifdef __KERNEL__
  80. .globl __bzero_begin
  81. __bzero_begin:
  82. .globl __bzero, __bzero_noasi
  83. __bzero_noasi:
  84. rd %asi, %g5
  85. ba,pt %xcc, __bzero+12
  86.  mov %g5, %o4
  87. __bzero:
  88. rd %asi, %g5
  89. wr %g0, ASI_P, %asi ! LSU Group
  90. mov ASI_P, %o4
  91. #else
  92. .globl bzero
  93. bzero_private:
  94. bzero:
  95. #ifndef REGS_64BIT
  96. srl %o1, 0, %o1
  97. #endif
  98. mov %o0, %g3
  99. #endif
  100. cmp %o1, 7
  101. bleu,pn %xcc, 17f
  102.  andcc %o0, 3, %o2
  103. be,a,pt %xcc, 4f
  104.  andcc %o0, 4, %g0
  105. cmp %o2, 3
  106. be,pn %xcc, 2f
  107.  EXO1(STB %g0, [%o0 + 0x00] ASINORMAL)
  108. cmp %o2, 2
  109. be,pt %xcc, 2f
  110.  EX(STB %g0, [%o0 + 0x01] ASINORMAL, sub %o1, 1)
  111. EX(STB %g0, [%o0 + 0x02] ASINORMAL, sub %o1, 2)
  112. 2: sub %o2, 4, %o2
  113. sub %o0, %o2, %o0
  114. add %o1, %o2, %o1
  115. andcc %o0, 4, %g0
  116. 4: be,pt %xcc, 2f
  117.  cmp %o1, 128
  118. EXO1(STW %g0, [%o0] ASINORMAL)
  119. sub %o1, 4, %o1
  120. add %o0, 4, %o0
  121. 2: blu,pn %xcc, 9f
  122.  andcc %o0, 0x38, %o2
  123. be,pn %icc, 6f
  124.  mov 64, %o5
  125. andcc %o0, 8, %g0
  126. be,pn %icc, 1f
  127.  sub %o5, %o2, %o5
  128. EX(STX %g0, [%o0] ASINORMAL, sub %o1, 0)
  129. add %o0, 8, %o0
  130. 1: andcc %o5, 16, %g0
  131. be,pn %icc, 1f
  132.  sub %o1, %o5, %o1
  133. EX1(STX %g0, [%o0] ASINORMAL, add %g0, 0)
  134. EX1(STX %g0, [%o0 + 8] ASINORMAL, sub %g0, 8)
  135. add %o0, 16, %o0
  136. 1: andcc %o5, 32, %g0
  137. be,pn %icc, 7f
  138.  andncc %o1, 0x3f, %o3
  139. EX(STX %g0, [%o0] ASINORMAL, add %o1, 32)
  140. EX(STX %g0, [%o0 + 8] ASINORMAL, add %o1, 24)
  141. EX(STX %g0, [%o0 + 16] ASINORMAL, add %o1, 16)
  142. EX(STX %g0, [%o0 + 24] ASINORMAL, add %o1, 8)
  143. add %o0, 32, %o0
  144. 6: andncc %o1, 0x3f, %o3
  145. 7: be,pn %xcc, 9f
  146. #ifdef __KERNEL__
  147.  or %o4, ASI_BLK_OR, %g7 
  148. wr %g7, %g0, %asi
  149. VISEntryHalf
  150. #else
  151.  wr %g0, ASI_BLK_P, %asi
  152. #endif
  153. membar #StoreLoad | #StoreStore | #LoadStore
  154. fzero %f0
  155. andcc %o3, 0xc0, %o2
  156. and %o1, 0x3f, %o1
  157. fzero %f2
  158. andn %o3, 0xff, %o3
  159. faddd %f0, %f2, %f4
  160. fmuld %f0, %f2, %f6
  161. cmp %o2, 64
  162. faddd %f0, %f2, %f8
  163. fmuld %f0, %f2, %f10
  164. faddd %f0, %f2, %f12
  165. brz,pn %o2, 10f
  166.  fmuld %f0, %f2, %f14
  167. be,pn %icc, 2f
  168.  EXC(STBLK %f0, [%o0 + 0x00] ASIBLK, add %o3, %o2, add %o2, %o1, %o2)
  169. cmp %o2, 128
  170. be,pn %icc, 2f
  171.  EXC(STBLK %f0, [%o0 + 0x40] ASIBLK, add %o3, %o2, add %o2, %o1, %o2; sub %o2, 64, %o2)
  172. EXC(STBLK %f0, [%o0 + 0x80] ASIBLK, add %o3, %o2, add %o2, %o1, %o2; sub %o2, 128, %o2)
  173. 2: brz,pn %o3, 12f
  174.  add %o0, %o2, %o0
  175. 10: EX(STBLK %f0, [%o0 + 0x00] ASIBLK, add %o3, %o1)
  176. EXC(STBLK %f0, [%o0 + 0x40] ASIBLK, add %o3, %o1, sub %o1, 64, %o1)
  177. EXC(STBLK %f0, [%o0 + 0x80] ASIBLK, add %o3, %o1, sub %o1, 128, %o1)
  178. EXC(STBLK %f0, [%o0 + 0xc0] ASIBLK, add %o3, %o1, sub %o1, 192, %o1)
  179. 11: subcc %o3, 256, %o3
  180. bne,pt %xcc, 10b
  181.  add %o0, 256, %o0
  182. 12:
  183. #ifdef __KERNEL__
  184. VISExitHalf
  185. wr %o4, 0x0, %asi
  186. #else
  187. #ifndef REGS_64BIT
  188. wr %g0, FPRS_FEF, %fprs
  189. #endif
  190. #endif
  191. membar #StoreLoad | #StoreStore
  192. 9: andcc %o1, 0xf8, %o2
  193. be,pn %xcc, 13f
  194.  andcc %o1, 7, %o1
  195. #ifdef __KERNEL__
  196. 14: sethi %hi(13f), %o4
  197. srl %o2, 1, %o3
  198. sub %o4, %o3, %o4
  199. jmpl %o4 + %lo(13f), %g0
  200.  add %o0, %o2, %o0
  201. #else
  202. 14: rd %pc, %o4
  203. srl %o2, 1, %o3
  204. sub %o4, %o3, %o4
  205. jmpl %o4 + (13f - 14b), %g0
  206.  add %o0, %o2, %o0
  207. #endif
  208. 12: ZERO_BLOCKS(%o0, 0xc8, %g0)
  209. ZERO_BLOCKS(%o0, 0x88, %g0)
  210. ZERO_BLOCKS(%o0, 0x48, %g0)
  211. ZERO_BLOCKS(%o0, 0x08, %g0)
  212. EXT(12b,13f,VISbzerofixup_zb)
  213. 13: be,pn %xcc, 8f
  214.  andcc %o1, 4, %g0
  215. be,pn %xcc, 1f
  216.  andcc %o1, 2, %g0
  217. EX(STW %g0, [%o0] ASINORMAL, and %o1, 7)
  218. add %o0, 4, %o0
  219. 1: be,pn %xcc, 1f
  220.  andcc %o1, 1, %g0
  221. EX(STH %g0, [%o0] ASINORMAL, and %o1, 3)
  222. add %o0, 2, %o0
  223. 1: bne,a,pn %xcc, 8f
  224.  EX(STB %g0, [%o0] ASINORMAL, add %g0, 1)
  225. 8:
  226. #ifdef __KERNEL__
  227. wr %g5, %g0, %asi
  228. #endif
  229. retl
  230.  RETL
  231. 17: be,pn %xcc, 13b
  232.  orcc %o1, 0, %g0
  233. be,pn %xcc, 0f
  234. 8:  add %o0, 1, %o0
  235. subcc %o1, 1, %o1
  236. bne,pt %xcc, 8b
  237.  EX(STB %g0, [%o0 - 1] ASINORMAL, add %o1, 1)
  238. 0:
  239. #ifdef __KERNEL__
  240. wr %g5, %g0, %asi
  241. #endif
  242. retl
  243.  RETL
  244. #ifdef __KERNEL__
  245. .section .fixup
  246. .align 4
  247. VISbzerofixup_reto1:
  248. mov %o1, %o0
  249. VISbzerofixup_ret0:
  250. wr %g5, %g0, %asi
  251. retl
  252.  wr %g0, 0, %fprs
  253. VISbzerofixup_ret1:
  254. and %o5, 0x30, %o5
  255. add %o5, %o1, %o5
  256. ba,pt %xcc, VISbzerofixup_ret0
  257.  add %o0, %o5, %o0
  258. VISbzerofixup_ret2:
  259. and %o5, 0x20, %o5
  260. add %o5, %o1, %o5
  261. ba,pt %xcc, VISbzerofixup_ret0
  262.  add %o0, %o5, %o0
  263. VISbzerofixup_zb:
  264. andcc %o1, 7, %o1
  265. sll %g2, 3, %g2
  266. add %o1, 256, %o1
  267. ba,pt %xcc, VISbzerofixup_ret0
  268.  sub %o1, %g2, %o0
  269. #endif
  270. .globl __bzero_end
  271. __bzero_end: