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
This page was automatically generated by the
LXR engine.
Visit the LXR main site for more
information.