home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-sparc / xor.h < prev   
Encoding:
C/C++ Source or Header  |  2006-08-11  |  7.3 KB  |  270 lines

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