~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

Linux Cross Reference
Linux/include/asm-sparc/xor.h

Version: ~ [ 2.4.0 ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~ [ freetext search ] ~ [ file search ] ~

This page was automatically generated by the LXR engine.
Visit the LXR main site for more information.