xor.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
源码类别:

Linux/Unix编程

开发平台:

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__ ("n
  44. .textn
  45. .globl xor_vis_2n
  46. .type xor_vis_2,@functionn
  47. xor_vis_2:n
  48. rd %fprs, %o5n
  49. andcc %o5, FPRS_FEF|FPRS_DU, %g0n
  50. be,pt %icc, 0fn
  51.  sethi %hi(VISenter), %g1n
  52. jmpl %g1 + %lo(VISenter), %g7n
  53.  add %g7, 8, %g7n
  54. 0: wr %g0, FPRS_FEF, %fprsn
  55. rd %asi, %g1n
  56. wr %g0, ASI_BLK_P, %asin
  57. membar #LoadStore|#StoreLoad|#StoreStoren
  58. sub %o0, 128, %o0n
  59. ldda [%o1] %asi, %f0n
  60. ldda [%o2] %asi, %f16n
  61. n
  62. 2: ldda [%o1 + 64] %asi, %f32n
  63. fxor %f0, %f16, %f16n
  64. fxor %f2, %f18, %f18n
  65. fxor %f4, %f20, %f20n
  66. fxor %f6, %f22, %f22n
  67. fxor %f8, %f24, %f24n
  68. fxor %f10, %f26, %f26n
  69. fxor %f12, %f28, %f28n
  70. fxor %f14, %f30, %f30n
  71. stda %f16, [%o1] %asin
  72. ldda [%o2 + 64] %asi, %f48n
  73. ldda [%o1 + 128] %asi, %f0n
  74. fxor %f32, %f48, %f48n
  75. fxor %f34, %f50, %f50n
  76. add %o1, 128, %o1n
  77. fxor %f36, %f52, %f52n
  78. add %o2, 128, %o2n
  79. fxor %f38, %f54, %f54n
  80. subcc %o0, 128, %o0n
  81. fxor %f40, %f56, %f56n
  82. fxor %f42, %f58, %f58n
  83. fxor %f44, %f60, %f60n
  84. fxor %f46, %f62, %f62n
  85. stda %f48, [%o1 - 64] %asin
  86. bne,pt %xcc, 2bn
  87.  ldda [%o2] %asi, %f16n
  88. n
  89. ldda [%o1 + 64] %asi, %f32n
  90. fxor %f0, %f16, %f16n
  91. fxor %f2, %f18, %f18n
  92. fxor %f4, %f20, %f20n
  93. fxor %f6, %f22, %f22n
  94. fxor %f8, %f24, %f24n
  95. fxor %f10, %f26, %f26n
  96. fxor %f12, %f28, %f28n
  97. fxor %f14, %f30, %f30n
  98. stda %f16, [%o1] %asin
  99. ldda [%o2 + 64] %asi, %f48n
  100. membar #Syncn
  101. fxor %f32, %f48, %f48n
  102. fxor %f34, %f50, %f50n
  103. fxor %f36, %f52, %f52n
  104. fxor %f38, %f54, %f54n
  105. fxor %f40, %f56, %f56n
  106. fxor %f42, %f58, %f58n
  107. fxor %f44, %f60, %f60n
  108. fxor %f46, %f62, %f62n
  109. stda %f48, [%o1 + 64] %asin
  110. membar #Sync|#StoreStore|#StoreLoadn
  111. wr %g1, %g0, %asin
  112. retln
  113.   wr %g0, 0, %fprsn
  114. .size xor_vis_2, .-xor_vis_2n
  115. n
  116. n
  117. .globl xor_vis_3n
  118. .type xor_vis_3,@functionn
  119. xor_vis_3:n
  120. rd %fprs, %o5n
  121. andcc %o5, FPRS_FEF|FPRS_DU, %g0n
  122. be,pt %icc, 0fn
  123.  sethi %hi(VISenter), %g1n
  124. jmpl %g1 + %lo(VISenter), %g7n
  125.  add %g7, 8, %g7n
  126. 0: wr %g0, FPRS_FEF, %fprsn
  127. rd %asi, %g1n
  128. wr %g0, ASI_BLK_P, %asin
  129. membar #LoadStore|#StoreLoad|#StoreStoren
  130. sub %o0, 64, %o0n
  131. ldda [%o1] %asi, %f0n
  132. ldda [%o2] %asi, %f16n
  133. n
  134. 3: ldda [%o3] %asi, %f32n
  135. fxor %f0, %f16, %f48n
  136. fxor %f2, %f18, %f50n
  137. add %o1, 64, %o1n
  138. fxor %f4, %f20, %f52n
  139. fxor %f6, %f22, %f54n
  140. add %o2, 64, %o2n
  141. fxor %f8, %f24, %f56n
  142. fxor %f10, %f26, %f58n
  143. fxor %f12, %f28, %f60n
  144. fxor %f14, %f30, %f62n
  145. ldda [%o1] %asi, %f0n
  146. fxor %f48, %f32, %f48n
  147. fxor %f50, %f34, %f50n
  148. fxor %f52, %f36, %f52n
  149. fxor %f54, %f38, %f54n
  150. add %o3, 64, %o3n
  151. fxor %f56, %f40, %f56n
  152. fxor %f58, %f42, %f58n
  153. subcc %o0, 64, %o0n
  154. fxor %f60, %f44, %f60n
  155. fxor %f62, %f46, %f62n
  156. stda %f48, [%o1 - 64] %asin
  157. bne,pt %xcc, 3bn
  158.  ldda [%o2] %asi, %f16n
  159. n
  160. ldda [%o3] %asi, %f32n
  161. fxor %f0, %f16, %f48n
  162. fxor %f2, %f18, %f50n
  163. fxor %f4, %f20, %f52n
  164. fxor %f6, %f22, %f54n
  165. fxor %f8, %f24, %f56n
  166. fxor %f10, %f26, %f58n
  167. fxor %f12, %f28, %f60n
  168. fxor %f14, %f30, %f62n
  169. membar #Syncn
  170. fxor %f48, %f32, %f48n
  171. fxor %f50, %f34, %f50n
  172. fxor %f52, %f36, %f52n
  173. fxor %f54, %f38, %f54n
  174. fxor %f56, %f40, %f56n
  175. fxor %f58, %f42, %f58n
  176. fxor %f60, %f44, %f60n
  177. fxor %f62, %f46, %f62n
  178. stda %f48, [%o1] %asin
  179. membar #Sync|#StoreStore|#StoreLoadn
  180. wr %g1, %g0, %asin
  181. retln
  182.  wr %g0, 0, %fprsn
  183. .size xor_vis_3, .-xor_vis_3n
  184. n
  185. n
  186. .globl xor_vis_4n
  187. .type xor_vis_4,@functionn
  188. xor_vis_4:n
  189. rd %fprs, %o5n
  190. andcc %o5, FPRS_FEF|FPRS_DU, %g0n
  191. be,pt %icc, 0fn
  192.  sethi %hi(VISenter), %g1n
  193. jmpl %g1 + %lo(VISenter), %g7n
  194.  add %g7, 8, %g7n
  195. 0: wr %g0, FPRS_FEF, %fprsn
  196. rd %asi, %g1n
  197. wr %g0, ASI_BLK_P, %asin
  198. membar #LoadStore|#StoreLoad|#StoreStoren
  199. sub %o0, 64, %o0n
  200. ldda [%o1] %asi, %f0n
  201. ldda [%o2] %asi, %f16n
  202. n
  203. 4: ldda [%o3] %asi, %f32n
  204. fxor %f0, %f16, %f16n
  205. fxor %f2, %f18, %f18n
  206. add %o1, 64, %o1n
  207. fxor %f4, %f20, %f20n
  208. fxor %f6, %f22, %f22n
  209. add %o2, 64, %o2n
  210. fxor %f8, %f24, %f24n
  211. fxor %f10, %f26, %f26n
  212. fxor %f12, %f28, %f28n
  213. fxor %f14, %f30, %f30n
  214. ldda [%o4] %asi, %f48n
  215. fxor %f16, %f32, %f32n
  216. fxor %f18, %f34, %f34n
  217. fxor %f20, %f36, %f36n
  218. fxor %f22, %f38, %f38n
  219. add %o3, 64, %o3n
  220. fxor %f24, %f40, %f40n
  221. fxor %f26, %f42, %f42n
  222. fxor %f28, %f44, %f44n
  223. fxor %f30, %f46, %f46n
  224. ldda [%o1] %asi, %f0n
  225. fxor %f32, %f48, %f48n
  226. fxor %f34, %f50, %f50n
  227. fxor %f36, %f52, %f52n
  228. add %o4, 64, %o4n
  229. fxor %f38, %f54, %f54n
  230. fxor %f40, %f56, %f56n
  231. fxor %f42, %f58, %f58n
  232. subcc %o0, 64, %o0n
  233. fxor %f44, %f60, %f60n
  234. fxor %f46, %f62, %f62n
  235. stda %f48, [%o1 - 64] %asin
  236. bne,pt %xcc, 4bn
  237.  ldda [%o2] %asi, %f16n
  238. n
  239. ldda [%o3] %asi, %f32n
  240. fxor %f0, %f16, %f16n
  241. fxor %f2, %f18, %f18n
  242. fxor %f4, %f20, %f20n
  243. fxor %f6, %f22, %f22n
  244. fxor %f8, %f24, %f24n
  245. fxor %f10, %f26, %f26n
  246. fxor %f12, %f28, %f28n
  247. fxor %f14, %f30, %f30n
  248. ldda [%o4] %asi, %f48n
  249. fxor %f16, %f32, %f32n
  250. fxor %f18, %f34, %f34n
  251. fxor %f20, %f36, %f36n
  252. fxor %f22, %f38, %f38n
  253. fxor %f24, %f40, %f40n
  254. fxor %f26, %f42, %f42n
  255. fxor %f28, %f44, %f44n
  256. fxor %f30, %f46, %f46n
  257. membar #Syncn
  258. fxor %f32, %f48, %f48n
  259. fxor %f34, %f50, %f50n
  260. fxor %f36, %f52, %f52n
  261. fxor %f38, %f54, %f54n
  262. fxor %f40, %f56, %f56n
  263. fxor %f42, %f58, %f58n
  264. fxor %f44, %f60, %f60n
  265. fxor %f46, %f62, %f62n
  266. stda %f48, [%o1] %asin
  267. membar #Sync|#StoreStore|#StoreLoadn
  268. wr %g1, %g0, %asin
  269. retln
  270.  wr %g0, 0, %fprsn
  271. .size xor_vis_4, .-xor_vis_4n
  272. n
  273. n
  274. .globl xor_vis_5n
  275. .type xor_vis_5,@functionn
  276. xor_vis_5:n
  277. mov %o5, %g5n
  278. rd %fprs, %o5n
  279. andcc %o5, FPRS_FEF|FPRS_DU, %g0n
  280. be,pt %icc, 0fn
  281.  sethi %hi(VISenter), %g1n
  282. jmpl %g1 + %lo(VISenter), %g7n
  283.  add %g7, 8, %g7n
  284. 0: wr %g0, FPRS_FEF, %fprsn
  285. mov %g5, %o5n
  286. rd %asi, %g1n
  287. wr %g0, ASI_BLK_P, %asin
  288. membar #LoadStore|#StoreLoad|#StoreStoren
  289. sub %o0, 64, %o0n
  290. ldda [%o1] %asi, %f0n
  291. ldda [%o2] %asi, %f16n
  292. n
  293. 5: ldda [%o3] %asi, %f32n
  294. fxor %f0, %f16, %f48n
  295. fxor %f2, %f18, %f50n
  296. add %o1, 64, %o1n
  297. fxor %f4, %f20, %f52n
  298. fxor %f6, %f22, %f54n
  299. add %o2, 64, %o2n
  300. fxor %f8, %f24, %f56n
  301. fxor %f10, %f26, %f58n
  302. fxor %f12, %f28, %f60n
  303. fxor %f14, %f30, %f62n
  304. ldda [%o4] %asi, %f16n
  305. fxor %f48, %f32, %f48n
  306. fxor %f50, %f34, %f50n
  307. fxor %f52, %f36, %f52n
  308. fxor %f54, %f38, %f54n
  309. add %o3, 64, %o3n
  310. fxor %f56, %f40, %f56n
  311. fxor %f58, %f42, %f58n
  312. fxor %f60, %f44, %f60n
  313. fxor %f62, %f46, %f62n
  314. ldda [%o5] %asi, %f32n
  315. fxor %f48, %f16, %f48n
  316. fxor %f50, %f18, %f50n
  317. add %o4, 64, %o4n
  318. fxor %f52, %f20, %f52n
  319. fxor %f54, %f22, %f54n
  320. add %o5, 64, %o5n
  321. fxor %f56, %f24, %f56n
  322. fxor %f58, %f26, %f58n
  323. fxor %f60, %f28, %f60n
  324. fxor %f62, %f30, %f62n
  325. ldda [%o1] %asi, %f0n
  326. fxor %f48, %f32, %f48n
  327. fxor %f50, %f34, %f50n
  328. fxor %f52, %f36, %f52n
  329. fxor %f54, %f38, %f54n
  330. fxor %f56, %f40, %f56n
  331. fxor %f58, %f42, %f58n
  332. subcc %o0, 64, %o0n
  333. fxor %f60, %f44, %f60n
  334. fxor %f62, %f46, %f62n
  335. stda %f48, [%o1 - 64] %asin
  336. bne,pt %xcc, 5bn
  337.  ldda [%o2] %asi, %f16n
  338. n
  339. ldda [%o3] %asi, %f32n
  340. fxor %f0, %f16, %f48n
  341. fxor %f2, %f18, %f50n
  342. fxor %f4, %f20, %f52n
  343. fxor %f6, %f22, %f54n
  344. fxor %f8, %f24, %f56n
  345. fxor %f10, %f26, %f58n
  346. fxor %f12, %f28, %f60n
  347. fxor %f14, %f30, %f62n
  348. ldda [%o4] %asi, %f16n
  349. fxor %f48, %f32, %f48n
  350. fxor %f50, %f34, %f50n
  351. fxor %f52, %f36, %f52n
  352. fxor %f54, %f38, %f54n
  353. fxor %f56, %f40, %f56n
  354. fxor %f58, %f42, %f58n
  355. fxor %f60, %f44, %f60n
  356. fxor %f62, %f46, %f62n
  357. ldda [%o5] %asi, %f32n
  358. fxor %f48, %f16, %f48n
  359. fxor %f50, %f18, %f50n
  360. fxor %f52, %f20, %f52n
  361. fxor %f54, %f22, %f54n
  362. fxor %f56, %f24, %f56n
  363. fxor %f58, %f26, %f58n
  364. fxor %f60, %f28, %f60n
  365. fxor %f62, %f30, %f62n
  366. membar #Syncn
  367. fxor %f48, %f32, %f48n
  368. fxor %f50, %f34, %f50n
  369. fxor %f52, %f36, %f52n
  370. fxor %f54, %f38, %f54n
  371. fxor %f56, %f40, %f56n
  372. fxor %f58, %f42, %f58n
  373. fxor %f60, %f44, %f60n
  374. fxor %f62, %f46, %f62n
  375. stda %f48, [%o1] %asin
  376. membar #Sync|#StoreStore|#StoreLoadn
  377. wr %g1, %g0, %asin
  378. retln
  379.  wr %g0, 0, %fprsn
  380. .size xor_vis_5, .-xor_vis_5n
  381. ");
  382. static struct xor_block_template xor_block_VIS = {
  383.         name: "VIS",
  384.         do_2: xor_vis_2,
  385.         do_3: xor_vis_3,
  386.         do_4: xor_vis_4,
  387.         do_5: xor_vis_5,
  388. };
  389. #define XOR_TRY_TEMPLATES       xor_speed(&xor_block_VIS)