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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-sparc64/xor.h
  3.  *
  4.  * High speed xor_block operation for RAID4/5 utilizing the
  5.  * UltraSparc Visual Instruction Set.
  6.  *
  7.  * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2, or (at your option)
  12.  * any later version.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * (for example /usr/src/linux/COPYING); if not, write to the Free
  16.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  */
  18. /*
  19.  * Requirements:
  20.  * !(((long)dest | (long)sourceN) & (64 - 1)) &&
  21.  * !(len & 127) && len >= 256
  22.  *
  23.  * It is done in pure assembly, as otherwise gcc makes it a non-leaf
  24.  * function, which is not what we want.
  25.  */
  26. #include <asm/pstate.h>
  27. #include <asm/asi.h>
  28. extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
  29. extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
  30.       unsigned long *);
  31. extern void xor_vis_4(unsigned long, unsigned long *, unsigned long *,
  32.       unsigned long *, unsigned long *);
  33. extern void xor_vis_5(unsigned long, unsigned long *, unsigned long *,
  34.       unsigned long *, unsigned long *, unsigned long *);
  35. #define _S(x) __S(x)
  36. #define __S(x) #x
  37. #define DEF(x) __asm__(#x " = " _S(x))
  38. DEF(FPRS_FEF);
  39. DEF(FPRS_DU);
  40. DEF(ASI_BLK_P);
  41. /* ??? We set and use %asi instead of using ASI_BLK_P directly because gas
  42.    currently does not accept symbolic constants for the ASI specifier.  */
  43. __asm__ ("
  44. .text
  45. .globl xor_vis_2
  46. .type xor_vis_2,@function
  47. xor_vis_2:
  48. rd %fprs, %o5
  49. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  50. be,pt %icc, 0f
  51.  sethi %hi(VISenter), %g1
  52. jmpl %g1 + %lo(VISenter), %g7
  53.  add %g7, 8, %g7
  54. 0: wr %g0, FPRS_FEF, %fprs
  55. rd %asi, %g1
  56. wr %g0, ASI_BLK_P, %asi
  57. membar #LoadStore|#StoreLoad|#StoreStore
  58. sub %o0, 128, %o0
  59. ldda [%o1] %asi, %f0
  60. ldda [%o2] %asi, %f16
  61. 2: ldda [%o1 + 64] %asi, %f32
  62. fxor %f0, %f16, %f16
  63. fxor %f2, %f18, %f18
  64. fxor %f4, %f20, %f20
  65. fxor %f6, %f22, %f22
  66. fxor %f8, %f24, %f24
  67. fxor %f10, %f26, %f26
  68. fxor %f12, %f28, %f28
  69. fxor %f14, %f30, %f30
  70. stda %f16, [%o1] %asi
  71. ldda [%o2 + 64] %asi, %f48
  72. ldda [%o1 + 128] %asi, %f0
  73. fxor %f32, %f48, %f48
  74. fxor %f34, %f50, %f50
  75. add %o1, 128, %o1
  76. fxor %f36, %f52, %f52
  77. add %o2, 128, %o2
  78. fxor %f38, %f54, %f54
  79. subcc %o0, 128, %o0
  80. fxor %f40, %f56, %f56
  81. fxor %f42, %f58, %f58
  82. fxor %f44, %f60, %f60
  83. fxor %f46, %f62, %f62
  84. stda %f48, [%o1 - 64] %asi
  85. bne,pt %xcc, 2b
  86.  ldda [%o2] %asi, %f16
  87. ldda [%o1 + 64] %asi, %f32
  88. fxor %f0, %f16, %f16
  89. fxor %f2, %f18, %f18
  90. fxor %f4, %f20, %f20
  91. fxor %f6, %f22, %f22
  92. fxor %f8, %f24, %f24
  93. fxor %f10, %f26, %f26
  94. fxor %f12, %f28, %f28
  95. fxor %f14, %f30, %f30
  96. stda %f16, [%o1] %asi
  97. ldda [%o2 + 64] %asi, %f48
  98. membar #Sync
  99. fxor %f32, %f48, %f48
  100. fxor %f34, %f50, %f50
  101. fxor %f36, %f52, %f52
  102. fxor %f38, %f54, %f54
  103. fxor %f40, %f56, %f56
  104. fxor %f42, %f58, %f58
  105. fxor %f44, %f60, %f60
  106. fxor %f46, %f62, %f62
  107. stda %f48, [%o1 + 64] %asi
  108. membar #Sync|#StoreStore|#StoreLoad
  109. wr %g1, %g0, %asi
  110. retl
  111.   wr %g0, 0, %fprs
  112. .size xor_vis_2, .-xor_vis_2
  113. .globl xor_vis_3
  114. .type xor_vis_3,@function
  115. xor_vis_3:
  116. rd %fprs, %o5
  117. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  118. be,pt %icc, 0f
  119.  sethi %hi(VISenter), %g1
  120. jmpl %g1 + %lo(VISenter), %g7
  121.  add %g7, 8, %g7
  122. 0: wr %g0, FPRS_FEF, %fprs
  123. rd %asi, %g1
  124. wr %g0, ASI_BLK_P, %asi
  125. membar #LoadStore|#StoreLoad|#StoreStore
  126. sub %o0, 64, %o0
  127. ldda [%o1] %asi, %f0
  128. ldda [%o2] %asi, %f16
  129. 3: ldda [%o3] %asi, %f32
  130. fxor %f0, %f16, %f48
  131. fxor %f2, %f18, %f50
  132. add %o1, 64, %o1
  133. fxor %f4, %f20, %f52
  134. fxor %f6, %f22, %f54
  135. add %o2, 64, %o2
  136. fxor %f8, %f24, %f56
  137. fxor %f10, %f26, %f58
  138. fxor %f12, %f28, %f60
  139. fxor %f14, %f30, %f62
  140. ldda [%o1] %asi, %f0
  141. fxor %f48, %f32, %f48
  142. fxor %f50, %f34, %f50
  143. fxor %f52, %f36, %f52
  144. fxor %f54, %f38, %f54
  145. add %o3, 64, %o3
  146. fxor %f56, %f40, %f56
  147. fxor %f58, %f42, %f58
  148. subcc %o0, 64, %o0
  149. fxor %f60, %f44, %f60
  150. fxor %f62, %f46, %f62
  151. stda %f48, [%o1 - 64] %asi
  152. bne,pt %xcc, 3b
  153.  ldda [%o2] %asi, %f16
  154. ldda [%o3] %asi, %f32
  155. fxor %f0, %f16, %f48
  156. fxor %f2, %f18, %f50
  157. fxor %f4, %f20, %f52
  158. fxor %f6, %f22, %f54
  159. fxor %f8, %f24, %f56
  160. fxor %f10, %f26, %f58
  161. fxor %f12, %f28, %f60
  162. fxor %f14, %f30, %f62
  163. membar #Sync
  164. fxor %f48, %f32, %f48
  165. fxor %f50, %f34, %f50
  166. fxor %f52, %f36, %f52
  167. fxor %f54, %f38, %f54
  168. fxor %f56, %f40, %f56
  169. fxor %f58, %f42, %f58
  170. fxor %f60, %f44, %f60
  171. fxor %f62, %f46, %f62
  172. stda %f48, [%o1] %asi
  173. membar #Sync|#StoreStore|#StoreLoad
  174. wr %g1, %g0, %asi
  175. retl
  176.  wr %g0, 0, %fprs
  177. .size xor_vis_3, .-xor_vis_3
  178. .globl xor_vis_4
  179. .type xor_vis_4,@function
  180. xor_vis_4:
  181. rd %fprs, %o5
  182. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  183. be,pt %icc, 0f
  184.  sethi %hi(VISenter), %g1
  185. jmpl %g1 + %lo(VISenter), %g7
  186.  add %g7, 8, %g7
  187. 0: wr %g0, FPRS_FEF, %fprs
  188. rd %asi, %g1
  189. wr %g0, ASI_BLK_P, %asi
  190. membar #LoadStore|#StoreLoad|#StoreStore
  191. sub %o0, 64, %o0
  192. ldda [%o1] %asi, %f0
  193. ldda [%o2] %asi, %f16
  194. 4: ldda [%o3] %asi, %f32
  195. fxor %f0, %f16, %f16
  196. fxor %f2, %f18, %f18
  197. add %o1, 64, %o1
  198. fxor %f4, %f20, %f20
  199. fxor %f6, %f22, %f22
  200. add %o2, 64, %o2
  201. fxor %f8, %f24, %f24
  202. fxor %f10, %f26, %f26
  203. fxor %f12, %f28, %f28
  204. fxor %f14, %f30, %f30
  205. ldda [%o4] %asi, %f48
  206. fxor %f16, %f32, %f32
  207. fxor %f18, %f34, %f34
  208. fxor %f20, %f36, %f36
  209. fxor %f22, %f38, %f38
  210. add %o3, 64, %o3
  211. fxor %f24, %f40, %f40
  212. fxor %f26, %f42, %f42
  213. fxor %f28, %f44, %f44
  214. fxor %f30, %f46, %f46
  215. ldda [%o1] %asi, %f0
  216. fxor %f32, %f48, %f48
  217. fxor %f34, %f50, %f50
  218. fxor %f36, %f52, %f52
  219. add %o4, 64, %o4
  220. fxor %f38, %f54, %f54
  221. fxor %f40, %f56, %f56
  222. fxor %f42, %f58, %f58
  223. subcc %o0, 64, %o0
  224. fxor %f44, %f60, %f60
  225. fxor %f46, %f62, %f62
  226. stda %f48, [%o1 - 64] %asi
  227. bne,pt %xcc, 4b
  228.  ldda [%o2] %asi, %f16
  229. ldda [%o3] %asi, %f32
  230. fxor %f0, %f16, %f16
  231. fxor %f2, %f18, %f18
  232. fxor %f4, %f20, %f20
  233. fxor %f6, %f22, %f22
  234. fxor %f8, %f24, %f24
  235. fxor %f10, %f26, %f26
  236. fxor %f12, %f28, %f28
  237. fxor %f14, %f30, %f30
  238. ldda [%o4] %asi, %f48
  239. fxor %f16, %f32, %f32
  240. fxor %f18, %f34, %f34
  241. fxor %f20, %f36, %f36
  242. fxor %f22, %f38, %f38
  243. fxor %f24, %f40, %f40
  244. fxor %f26, %f42, %f42
  245. fxor %f28, %f44, %f44
  246. fxor %f30, %f46, %f46
  247. membar #Sync
  248. fxor %f32, %f48, %f48
  249. fxor %f34, %f50, %f50
  250. fxor %f36, %f52, %f52
  251. fxor %f38, %f54, %f54
  252. fxor %f40, %f56, %f56
  253. fxor %f42, %f58, %f58
  254. fxor %f44, %f60, %f60
  255. fxor %f46, %f62, %f62
  256. stda %f48, [%o1] %asi
  257. membar #Sync|#StoreStore|#StoreLoad
  258. wr %g1, %g0, %asi
  259. retl
  260.  wr %g0, 0, %fprs
  261. .size xor_vis_4, .-xor_vis_4
  262. .globl xor_vis_5
  263. .type xor_vis_5,@function
  264. xor_vis_5:
  265. mov %o5, %g5
  266. rd %fprs, %o5
  267. andcc %o5, FPRS_FEF|FPRS_DU, %g0
  268. be,pt %icc, 0f
  269.  sethi %hi(VISenter), %g1
  270. jmpl %g1 + %lo(VISenter), %g7
  271.  add %g7, 8, %g7
  272. 0: wr %g0, FPRS_FEF, %fprs
  273. mov %g5, %o5
  274. rd %asi, %g1
  275. wr %g0, ASI_BLK_P, %asi
  276. membar #LoadStore|#StoreLoad|#StoreStore
  277. sub %o0, 64, %o0
  278. ldda [%o1] %asi, %f0
  279. ldda [%o2] %asi, %f16
  280. 5: ldda [%o3] %asi, %f32
  281. fxor %f0, %f16, %f48
  282. fxor %f2, %f18, %f50
  283. add %o1, 64, %o1
  284. fxor %f4, %f20, %f52
  285. fxor %f6, %f22, %f54
  286. add %o2, 64, %o2
  287. fxor %f8, %f24, %f56
  288. fxor %f10, %f26, %f58
  289. fxor %f12, %f28, %f60
  290. fxor %f14, %f30, %f62
  291. ldda [%o4] %asi, %f16
  292. fxor %f48, %f32, %f48
  293. fxor %f50, %f34, %f50
  294. fxor %f52, %f36, %f52
  295. fxor %f54, %f38, %f54
  296. add %o3, 64, %o3
  297. fxor %f56, %f40, %f56
  298. fxor %f58, %f42, %f58
  299. fxor %f60, %f44, %f60
  300. fxor %f62, %f46, %f62
  301. ldda [%o5] %asi, %f32
  302. fxor %f48, %f16, %f48
  303. fxor %f50, %f18, %f50
  304. add %o4, 64, %o4
  305. fxor %f52, %f20, %f52
  306. fxor %f54, %f22, %f54
  307. add %o5, 64, %o5
  308. fxor %f56, %f24, %f56
  309. fxor %f58, %f26, %f58
  310. fxor %f60, %f28, %f60
  311. fxor %f62, %f30, %f62
  312. ldda [%o1] %asi, %f0
  313. fxor %f48, %f32, %f48
  314. fxor %f50, %f34, %f50
  315. fxor %f52, %f36, %f52
  316. fxor %f54, %f38, %f54
  317. fxor %f56, %f40, %f56
  318. fxor %f58, %f42, %f58
  319. subcc %o0, 64, %o0
  320. fxor %f60, %f44, %f60
  321. fxor %f62, %f46, %f62
  322. stda %f48, [%o1 - 64] %asi
  323. bne,pt %xcc, 5b
  324.  ldda [%o2] %asi, %f16
  325. ldda [%o3] %asi, %f32
  326. fxor %f0, %f16, %f48
  327. fxor %f2, %f18, %f50
  328. fxor %f4, %f20, %f52
  329. fxor %f6, %f22, %f54
  330. fxor %f8, %f24, %f56
  331. fxor %f10, %f26, %f58
  332. fxor %f12, %f28, %f60
  333. fxor %f14, %f30, %f62
  334. ldda [%o4] %asi, %f16
  335. fxor %f48, %f32, %f48
  336. fxor %f50, %f34, %f50
  337. fxor %f52, %f36, %f52
  338. fxor %f54, %f38, %f54
  339. fxor %f56, %f40, %f56
  340. fxor %f58, %f42, %f58
  341. fxor %f60, %f44, %f60
  342. fxor %f62, %f46, %f62
  343. ldda [%o5] %asi, %f32
  344. fxor %f48, %f16, %f48
  345. fxor %f50, %f18, %f50
  346. fxor %f52, %f20, %f52
  347. fxor %f54, %f22, %f54
  348. fxor %f56, %f24, %f56
  349. fxor %f58, %f26, %f58
  350. fxor %f60, %f28, %f60
  351. fxor %f62, %f30, %f62
  352. membar #Sync
  353. fxor %f48, %f32, %f48
  354. fxor %f50, %f34, %f50
  355. fxor %f52, %f36, %f52
  356. fxor %f54, %f38, %f54
  357. fxor %f56, %f40, %f56
  358. fxor %f58, %f42, %f58
  359. fxor %f60, %f44, %f60
  360. fxor %f62, %f46, %f62
  361. stda %f48, [%o1] %asi
  362. membar #Sync|#StoreStore|#StoreLoad
  363. wr %g1, %g0, %asi
  364. retl
  365.  wr %g0, 0, %fprs
  366. .size xor_vis_5, .-xor_vis_5
  367. ");
  368. static struct xor_block_template xor_block_VIS = {
  369.         name: "VIS",
  370.         do_2: xor_vis_2,
  371.         do_3: xor_vis_3,
  372.         do_4: xor_vis_4,
  373.         do_5: xor_vis_5,
  374. };
  375. #define XOR_TRY_TEMPLATES       xor_speed(&xor_block_VIS)