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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * include/asm-sparc/xor.h
  3.  *
  4.  * Optimized RAID-5 checksumming functions for 32-bit Sparc.
  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. /*
  16.  * High speed xor_block operation for RAID4/5 utilizing the
  17.  * ldd/std SPARC instructions.
  18.  *
  19.  * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
  20.  */
  21. static void
  22. sparc_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
  23. {
  24. int lines = bytes / (sizeof (long)) / 8;
  25. do {
  26. __asm__ __volatile__(
  27.   "ldd [%0 + 0x00], %%g2nt"
  28.   "ldd [%0 + 0x08], %%g4nt"
  29.   "ldd [%0 + 0x10], %%o0nt"
  30.   "ldd [%0 + 0x18], %%o2nt"
  31.   "ldd [%1 + 0x00], %%o4nt"
  32.   "ldd [%1 + 0x08], %%l0nt"
  33.   "ldd [%1 + 0x10], %%l2nt"
  34.   "ldd [%1 + 0x18], %%l4nt"
  35.   "xor %%g2, %%o4, %%g2nt"
  36.   "xor %%g3, %%o5, %%g3nt"
  37.   "xor %%g4, %%l0, %%g4nt"
  38.   "xor %%g5, %%l1, %%g5nt"
  39.   "xor %%o0, %%l2, %%o0nt"
  40.   "xor %%o1, %%l3, %%o1nt"
  41.   "xor %%o2, %%l4, %%o2nt"
  42.   "xor %%o3, %%l5, %%o3nt"
  43.   "std %%g2, [%0 + 0x00]nt"
  44.   "std %%g4, [%0 + 0x08]nt"
  45.   "std %%o0, [%0 + 0x10]nt"
  46.   "std %%o2, [%0 + 0x18]n"
  47. :
  48. : "r" (p1), "r" (p2)
  49. : "g2", "g3", "g4", "g5",
  50.   "o0", "o1", "o2", "o3", "o4", "o5",
  51.   "l0", "l1", "l2", "l3", "l4", "l5");
  52. p1 += 8;
  53. p2 += 8;
  54. } while (--lines > 0);
  55. }
  56. static void
  57. sparc_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  58. unsigned long *p3)
  59. {
  60. int lines = bytes / (sizeof (long)) / 8;
  61. do {
  62. __asm__ __volatile__(
  63.   "ldd [%0 + 0x00], %%g2nt"
  64.   "ldd [%0 + 0x08], %%g4nt"
  65.   "ldd [%0 + 0x10], %%o0nt"
  66.   "ldd [%0 + 0x18], %%o2nt"
  67.   "ldd [%1 + 0x00], %%o4nt"
  68.   "ldd [%1 + 0x08], %%l0nt"
  69.   "ldd [%1 + 0x10], %%l2nt"
  70.   "ldd [%1 + 0x18], %%l4nt"
  71.   "xor %%g2, %%o4, %%g2nt"
  72.   "xor %%g3, %%o5, %%g3nt"
  73.   "ldd [%2 + 0x00], %%o4nt"
  74.   "xor %%g4, %%l0, %%g4nt"
  75.   "xor %%g5, %%l1, %%g5nt"
  76.   "ldd [%2 + 0x08], %%l0nt"
  77.   "xor %%o0, %%l2, %%o0nt"
  78.   "xor %%o1, %%l3, %%o1nt"
  79.   "ldd [%2 + 0x10], %%l2nt"
  80.   "xor %%o2, %%l4, %%o2nt"
  81.   "xor %%o3, %%l5, %%o3nt"
  82.   "ldd [%2 + 0x18], %%l4nt"
  83.   "xor %%g2, %%o4, %%g2nt"
  84.   "xor %%g3, %%o5, %%g3nt"
  85.   "xor %%g4, %%l0, %%g4nt"
  86.   "xor %%g5, %%l1, %%g5nt"
  87.   "xor %%o0, %%l2, %%o0nt"
  88.   "xor %%o1, %%l3, %%o1nt"
  89.   "xor %%o2, %%l4, %%o2nt"
  90.   "xor %%o3, %%l5, %%o3nt"
  91.   "std %%g2, [%0 + 0x00]nt"
  92.   "std %%g4, [%0 + 0x08]nt"
  93.   "std %%o0, [%0 + 0x10]nt"
  94.   "std %%o2, [%0 + 0x18]n"
  95. :
  96. : "r" (p1), "r" (p2), "r" (p3)
  97. : "g2", "g3", "g4", "g5",
  98.   "o0", "o1", "o2", "o3", "o4", "o5",
  99.   "l0", "l1", "l2", "l3", "l4", "l5");
  100. p1 += 8;
  101. p2 += 8;
  102. p3 += 8;
  103. } while (--lines > 0);
  104. }
  105. static void
  106. sparc_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  107. unsigned long *p3, unsigned long *p4)
  108. {
  109. int lines = bytes / (sizeof (long)) / 8;
  110. do {
  111. __asm__ __volatile__(
  112.   "ldd [%0 + 0x00], %%g2nt"
  113.   "ldd [%0 + 0x08], %%g4nt"
  114.   "ldd [%0 + 0x10], %%o0nt"
  115.   "ldd [%0 + 0x18], %%o2nt"
  116.   "ldd [%1 + 0x00], %%o4nt"
  117.   "ldd [%1 + 0x08], %%l0nt"
  118.   "ldd [%1 + 0x10], %%l2nt"
  119.   "ldd [%1 + 0x18], %%l4nt"
  120.   "xor %%g2, %%o4, %%g2nt"
  121.   "xor %%g3, %%o5, %%g3nt"
  122.   "ldd [%2 + 0x00], %%o4nt"
  123.   "xor %%g4, %%l0, %%g4nt"
  124.   "xor %%g5, %%l1, %%g5nt"
  125.   "ldd [%2 + 0x08], %%l0nt"
  126.   "xor %%o0, %%l2, %%o0nt"
  127.   "xor %%o1, %%l3, %%o1nt"
  128.   "ldd [%2 + 0x10], %%l2nt"
  129.   "xor %%o2, %%l4, %%o2nt"
  130.   "xor %%o3, %%l5, %%o3nt"
  131.   "ldd [%2 + 0x18], %%l4nt"
  132.   "xor %%g2, %%o4, %%g2nt"
  133.   "xor %%g3, %%o5, %%g3nt"
  134.   "ldd [%3 + 0x00], %%o4nt"
  135.   "xor %%g4, %%l0, %%g4nt"
  136.   "xor %%g5, %%l1, %%g5nt"
  137.   "ldd [%3 + 0x08], %%l0nt"
  138.   "xor %%o0, %%l2, %%o0nt"
  139.   "xor %%o1, %%l3, %%o1nt"
  140.   "ldd [%3 + 0x10], %%l2nt"
  141.   "xor %%o2, %%l4, %%o2nt"
  142.   "xor %%o3, %%l5, %%o3nt"
  143.   "ldd [%3 + 0x18], %%l4nt"
  144.   "xor %%g2, %%o4, %%g2nt"
  145.   "xor %%g3, %%o5, %%g3nt"
  146.   "xor %%g4, %%l0, %%g4nt"
  147.   "xor %%g5, %%l1, %%g5nt"
  148.   "xor %%o0, %%l2, %%o0nt"
  149.   "xor %%o1, %%l3, %%o1nt"
  150.   "xor %%o2, %%l4, %%o2nt"
  151.   "xor %%o3, %%l5, %%o3nt"
  152.   "std %%g2, [%0 + 0x00]nt"
  153.   "std %%g4, [%0 + 0x08]nt"
  154.   "std %%o0, [%0 + 0x10]nt"
  155.   "std %%o2, [%0 + 0x18]n"
  156. :
  157. : "r" (p1), "r" (p2), "r" (p3), "r" (p4)
  158. : "g2", "g3", "g4", "g5",
  159.   "o0", "o1", "o2", "o3", "o4", "o5",
  160.   "l0", "l1", "l2", "l3", "l4", "l5");
  161. p1 += 8;
  162. p2 += 8;
  163. p3 += 8;
  164. p4 += 8;
  165. } while (--lines > 0);
  166. }
  167. static void
  168. sparc_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
  169. unsigned long *p3, unsigned long *p4, unsigned long *p5)
  170. {
  171. int lines = bytes / (sizeof (long)) / 8;
  172. do {
  173. __asm__ __volatile__(
  174.   "ldd [%0 + 0x00], %%g2nt"
  175.   "ldd [%0 + 0x08], %%g4nt"
  176.   "ldd [%0 + 0x10], %%o0nt"
  177.   "ldd [%0 + 0x18], %%o2nt"
  178.   "ldd [%1 + 0x00], %%o4nt"
  179.   "ldd [%1 + 0x08], %%l0nt"
  180.   "ldd [%1 + 0x10], %%l2nt"
  181.   "ldd [%1 + 0x18], %%l4nt"
  182.   "xor %%g2, %%o4, %%g2nt"
  183.   "xor %%g3, %%o5, %%g3nt"
  184.   "ldd [%2 + 0x00], %%o4nt"
  185.   "xor %%g4, %%l0, %%g4nt"
  186.   "xor %%g5, %%l1, %%g5nt"
  187.   "ldd [%2 + 0x08], %%l0nt"
  188.   "xor %%o0, %%l2, %%o0nt"
  189.   "xor %%o1, %%l3, %%o1nt"
  190.   "ldd [%2 + 0x10], %%l2nt"
  191.   "xor %%o2, %%l4, %%o2nt"
  192.   "xor %%o3, %%l5, %%o3nt"
  193.   "ldd [%2 + 0x18], %%l4nt"
  194.   "xor %%g2, %%o4, %%g2nt"
  195.   "xor %%g3, %%o5, %%g3nt"
  196.   "ldd [%3 + 0x00], %%o4nt"
  197.   "xor %%g4, %%l0, %%g4nt"
  198.   "xor %%g5, %%l1, %%g5nt"
  199.   "ldd [%3 + 0x08], %%l0nt"
  200.   "xor %%o0, %%l2, %%o0nt"
  201.   "xor %%o1, %%l3, %%o1nt"
  202.   "ldd [%3 + 0x10], %%l2nt"
  203.   "xor %%o2, %%l4, %%o2nt"
  204.   "xor %%o3, %%l5, %%o3nt"
  205.   "ldd [%3 + 0x18], %%l4nt"
  206.   "xor %%g2, %%o4, %%g2nt"
  207.   "xor %%g3, %%o5, %%g3nt"
  208.   "ldd [%4 + 0x00], %%o4nt"
  209.   "xor %%g4, %%l0, %%g4nt"
  210.   "xor %%g5, %%l1, %%g5nt"
  211.   "ldd [%4 + 0x08], %%l0nt"
  212.   "xor %%o0, %%l2, %%o0nt"
  213.   "xor %%o1, %%l3, %%o1nt"
  214.   "ldd [%4 + 0x10], %%l2nt"
  215.   "xor %%o2, %%l4, %%o2nt"
  216.   "xor %%o3, %%l5, %%o3nt"
  217.   "ldd [%4 + 0x18], %%l4nt"
  218.   "xor %%g2, %%o4, %%g2nt"
  219.   "xor %%g3, %%o5, %%g3nt"
  220.   "xor %%g4, %%l0, %%g4nt"
  221.   "xor %%g5, %%l1, %%g5nt"
  222.   "xor %%o0, %%l2, %%o0nt"
  223.   "xor %%o1, %%l3, %%o1nt"
  224.   "xor %%o2, %%l4, %%o2nt"
  225.   "xor %%o3, %%l5, %%o3nt"
  226.   "std %%g2, [%0 + 0x00]nt"
  227.   "std %%g4, [%0 + 0x08]nt"
  228.   "std %%o0, [%0 + 0x10]nt"
  229.   "std %%o2, [%0 + 0x18]n"
  230. :
  231. : "r" (p1), "r" (p2), "r" (p3), "r" (p4), "r" (p5)
  232. : "g2", "g3", "g4", "g5",
  233.   "o0", "o1", "o2", "o3", "o4", "o5",
  234.   "l0", "l1", "l2", "l3", "l4", "l5");
  235. p1 += 8;
  236. p2 += 8;
  237. p3 += 8;
  238. p4 += 8;
  239. p5 += 8;
  240. } while (--lines > 0);
  241. }
  242. static struct xor_block_template xor_block_SPARC = {
  243. name: "SPARC",
  244. do_2: sparc_2,
  245. do_3: sparc_3,
  246. do_4: sparc_4,
  247. do_5: sparc_5,
  248. };
  249. /* For grins, also test the generic routines.  */
  250. #include <asm-generic/xor.h>
  251. #undef XOR_TRY_TEMPLATES
  252. #define XOR_TRY_TEMPLATES
  253. do {
  254. xor_speed(&xor_block_8regs);
  255. xor_speed(&xor_block_32regs);
  256. xor_speed(&xor_block_SPARC);
  257. } while (0)