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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-generic/xor.h
  3.  *
  4.  * Generic optimized RAID-5 checksumming functions.
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published by
  8.  * the Free Software Foundation; either version 2, or (at your option)
  9.  * any later version.
  10.  *
  11.  * You should have received a copy of the GNU General Public License
  12.  * (for example /usr/src/linux/COPYING); if not, write to the Free
  13.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  */
  15. static void
  16. xor_8regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
  17. {
  18. long lines = bytes / (sizeof (long)) / 8;
  19. do {
  20. p1[0] ^= p2[0];
  21. p1[1] ^= p2[1];
  22. p1[2] ^= p2[2];
  23. p1[3] ^= p2[3];
  24. p1[4] ^= p2[4];
  25. p1[5] ^= p2[5];
  26. p1[6] ^= p2[6];
  27. p1[7] ^= p2[7];
  28. p1 += 8;
  29. p2 += 8;
  30. } while (--lines > 0);
  31. }
  32. static void
  33. xor_8regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  34.     unsigned long *p3)
  35. {
  36. long lines = bytes / (sizeof (long)) / 8;
  37. do {
  38. p1[0] ^= p2[0] ^ p3[0];
  39. p1[1] ^= p2[1] ^ p3[1];
  40. p1[2] ^= p2[2] ^ p3[2];
  41. p1[3] ^= p2[3] ^ p3[3];
  42. p1[4] ^= p2[4] ^ p3[4];
  43. p1[5] ^= p2[5] ^ p3[5];
  44. p1[6] ^= p2[6] ^ p3[6];
  45. p1[7] ^= p2[7] ^ p3[7];
  46. p1 += 8;
  47. p2 += 8;
  48. p3 += 8;
  49. } while (--lines > 0);
  50. }
  51. static void
  52. xor_8regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  53.     unsigned long *p3, unsigned long *p4)
  54. {
  55. long lines = bytes / (sizeof (long)) / 8;
  56. do {
  57. p1[0] ^= p2[0] ^ p3[0] ^ p4[0];
  58. p1[1] ^= p2[1] ^ p3[1] ^ p4[1];
  59. p1[2] ^= p2[2] ^ p3[2] ^ p4[2];
  60. p1[3] ^= p2[3] ^ p3[3] ^ p4[3];
  61. p1[4] ^= p2[4] ^ p3[4] ^ p4[4];
  62. p1[5] ^= p2[5] ^ p3[5] ^ p4[5];
  63. p1[6] ^= p2[6] ^ p3[6] ^ p4[6];
  64. p1[7] ^= p2[7] ^ p3[7] ^ p4[7];
  65. p1 += 8;
  66. p2 += 8;
  67. p3 += 8;
  68. p4 += 8;
  69. } while (--lines > 0);
  70. }
  71. static void
  72. xor_8regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  73.     unsigned long *p3, unsigned long *p4, unsigned long *p5)
  74. {
  75. long lines = bytes / (sizeof (long)) / 8;
  76. do {
  77. p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0];
  78. p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1];
  79. p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2];
  80. p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3];
  81. p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4];
  82. p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5];
  83. p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6];
  84. p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7];
  85. p1 += 8;
  86. p2 += 8;
  87. p3 += 8;
  88. p4 += 8;
  89. p5 += 8;
  90. } while (--lines > 0);
  91. }
  92. static void
  93. xor_32regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
  94. {
  95. long lines = bytes / (sizeof (long)) / 8;
  96. do {
  97. register long d0, d1, d2, d3, d4, d5, d6, d7;
  98. d0 = p1[0]; /* Pull the stuff into registers */
  99. d1 = p1[1]; /*  ... in bursts, if possible. */
  100. d2 = p1[2];
  101. d3 = p1[3];
  102. d4 = p1[4];
  103. d5 = p1[5];
  104. d6 = p1[6];
  105. d7 = p1[7];
  106. d0 ^= p2[0];
  107. d1 ^= p2[1];
  108. d2 ^= p2[2];
  109. d3 ^= p2[3];
  110. d4 ^= p2[4];
  111. d5 ^= p2[5];
  112. d6 ^= p2[6];
  113. d7 ^= p2[7];
  114. p1[0] = d0; /* Store the result (in burts) */
  115. p1[1] = d1;
  116. p1[2] = d2;
  117. p1[3] = d3;
  118. p1[4] = d4;
  119. p1[5] = d5;
  120. p1[6] = d6;
  121. p1[7] = d7;
  122. p1 += 8;
  123. p2 += 8;
  124. } while (--lines > 0);
  125. }
  126. static void
  127. xor_32regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  128.     unsigned long *p3)
  129. {
  130. long lines = bytes / (sizeof (long)) / 8;
  131. do {
  132. register long d0, d1, d2, d3, d4, d5, d6, d7;
  133. d0 = p1[0]; /* Pull the stuff into registers */
  134. d1 = p1[1]; /*  ... in bursts, if possible. */
  135. d2 = p1[2];
  136. d3 = p1[3];
  137. d4 = p1[4];
  138. d5 = p1[5];
  139. d6 = p1[6];
  140. d7 = p1[7];
  141. d0 ^= p2[0];
  142. d1 ^= p2[1];
  143. d2 ^= p2[2];
  144. d3 ^= p2[3];
  145. d4 ^= p2[4];
  146. d5 ^= p2[5];
  147. d6 ^= p2[6];
  148. d7 ^= p2[7];
  149. d0 ^= p3[0];
  150. d1 ^= p3[1];
  151. d2 ^= p3[2];
  152. d3 ^= p3[3];
  153. d4 ^= p3[4];
  154. d5 ^= p3[5];
  155. d6 ^= p3[6];
  156. d7 ^= p3[7];
  157. p1[0] = d0; /* Store the result (in burts) */
  158. p1[1] = d1;
  159. p1[2] = d2;
  160. p1[3] = d3;
  161. p1[4] = d4;
  162. p1[5] = d5;
  163. p1[6] = d6;
  164. p1[7] = d7;
  165. p1 += 8;
  166. p2 += 8;
  167. p3 += 8;
  168. } while (--lines > 0);
  169. }
  170. static void
  171. xor_32regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  172.     unsigned long *p3, unsigned long *p4)
  173. {
  174. long lines = bytes / (sizeof (long)) / 8;
  175. do {
  176. register long d0, d1, d2, d3, d4, d5, d6, d7;
  177. d0 = p1[0]; /* Pull the stuff into registers */
  178. d1 = p1[1]; /*  ... in bursts, if possible. */
  179. d2 = p1[2];
  180. d3 = p1[3];
  181. d4 = p1[4];
  182. d5 = p1[5];
  183. d6 = p1[6];
  184. d7 = p1[7];
  185. d0 ^= p2[0];
  186. d1 ^= p2[1];
  187. d2 ^= p2[2];
  188. d3 ^= p2[3];
  189. d4 ^= p2[4];
  190. d5 ^= p2[5];
  191. d6 ^= p2[6];
  192. d7 ^= p2[7];
  193. d0 ^= p3[0];
  194. d1 ^= p3[1];
  195. d2 ^= p3[2];
  196. d3 ^= p3[3];
  197. d4 ^= p3[4];
  198. d5 ^= p3[5];
  199. d6 ^= p3[6];
  200. d7 ^= p3[7];
  201. d0 ^= p4[0];
  202. d1 ^= p4[1];
  203. d2 ^= p4[2];
  204. d3 ^= p4[3];
  205. d4 ^= p4[4];
  206. d5 ^= p4[5];
  207. d6 ^= p4[6];
  208. d7 ^= p4[7];
  209. p1[0] = d0; /* Store the result (in burts) */
  210. p1[1] = d1;
  211. p1[2] = d2;
  212. p1[3] = d3;
  213. p1[4] = d4;
  214. p1[5] = d5;
  215. p1[6] = d6;
  216. p1[7] = d7;
  217. p1 += 8;
  218. p2 += 8;
  219. p3 += 8;
  220. p4 += 8;
  221. } while (--lines > 0);
  222. }
  223. static void
  224. xor_32regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  225.     unsigned long *p3, unsigned long *p4, unsigned long *p5)
  226. {
  227. long lines = bytes / (sizeof (long)) / 8;
  228. do {
  229. register long d0, d1, d2, d3, d4, d5, d6, d7;
  230. d0 = p1[0]; /* Pull the stuff into registers */
  231. d1 = p1[1]; /*  ... in bursts, if possible. */
  232. d2 = p1[2];
  233. d3 = p1[3];
  234. d4 = p1[4];
  235. d5 = p1[5];
  236. d6 = p1[6];
  237. d7 = p1[7];
  238. d0 ^= p2[0];
  239. d1 ^= p2[1];
  240. d2 ^= p2[2];
  241. d3 ^= p2[3];
  242. d4 ^= p2[4];
  243. d5 ^= p2[5];
  244. d6 ^= p2[6];
  245. d7 ^= p2[7];
  246. d0 ^= p3[0];
  247. d1 ^= p3[1];
  248. d2 ^= p3[2];
  249. d3 ^= p3[3];
  250. d4 ^= p3[4];
  251. d5 ^= p3[5];
  252. d6 ^= p3[6];
  253. d7 ^= p3[7];
  254. d0 ^= p4[0];
  255. d1 ^= p4[1];
  256. d2 ^= p4[2];
  257. d3 ^= p4[3];
  258. d4 ^= p4[4];
  259. d5 ^= p4[5];
  260. d6 ^= p4[6];
  261. d7 ^= p4[7];
  262. d0 ^= p5[0];
  263. d1 ^= p5[1];
  264. d2 ^= p5[2];
  265. d3 ^= p5[3];
  266. d4 ^= p5[4];
  267. d5 ^= p5[5];
  268. d6 ^= p5[6];
  269. d7 ^= p5[7];
  270. p1[0] = d0; /* Store the result (in burts) */
  271. p1[1] = d1;
  272. p1[2] = d2;
  273. p1[3] = d3;
  274. p1[4] = d4;
  275. p1[5] = d5;
  276. p1[6] = d6;
  277. p1[7] = d7;
  278. p1 += 8;
  279. p2 += 8;
  280. p3 += 8;
  281. p4 += 8;
  282. p5 += 8;
  283. } while (--lines > 0);
  284. }
  285. static struct xor_block_template xor_block_8regs = {
  286. name: "8regs",
  287. do_2: xor_8regs_2,
  288. do_3: xor_8regs_3,
  289. do_4: xor_8regs_4,
  290. do_5: xor_8regs_5,
  291. };
  292. static struct xor_block_template xor_block_32regs = {
  293. name: "32regs",
  294. do_2: xor_32regs_2,
  295. do_3: xor_32regs_3,
  296. do_4: xor_32regs_4,
  297. do_5: xor_32regs_5,
  298. };
  299. #define XOR_TRY_TEMPLATES
  300. do {
  301. xor_speed(&xor_block_8regs);
  302. xor_speed(&xor_block_32regs);
  303. } while (0)