xref: /linux/lib/raid/raid6/riscv/rvv.c (revision 2e05544060b9fef5d4d0e0172944e6956c55080f)
1*3626738bSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later
2*3626738bSChristoph Hellwig /*
3*3626738bSChristoph Hellwig  * RAID-6 syndrome calculation using RISC-V vector instructions
4*3626738bSChristoph Hellwig  *
5*3626738bSChristoph Hellwig  * Copyright 2024 Institute of Software, CAS.
6*3626738bSChristoph Hellwig  * Author: Chunyan Zhang <zhangchunyan@iscas.ac.cn>
7*3626738bSChristoph Hellwig  *
8*3626738bSChristoph Hellwig  * Based on neon.uc:
9*3626738bSChristoph Hellwig  *	Copyright 2002-2004 H. Peter Anvin
10*3626738bSChristoph Hellwig  */
11*3626738bSChristoph Hellwig 
12*3626738bSChristoph Hellwig #include "rvv.h"
13*3626738bSChristoph Hellwig 
14*3626738bSChristoph Hellwig #ifdef __riscv_vector
15*3626738bSChristoph Hellwig #error "This code must be built without compiler support for vector"
16*3626738bSChristoph Hellwig #endif
17*3626738bSChristoph Hellwig 
18*3626738bSChristoph Hellwig static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
19*3626738bSChristoph Hellwig {
20*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
21*3626738bSChristoph Hellwig 	u8 *p, *q;
22*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
23*3626738bSChristoph Hellwig 	int z, z0;
24*3626738bSChristoph Hellwig 
25*3626738bSChristoph Hellwig 	z0 = disks - 3;		/* Highest data disk */
26*3626738bSChristoph Hellwig 	p = dptr[z0 + 1];		/* XOR parity */
27*3626738bSChristoph Hellwig 	q = dptr[z0 + 2];		/* RS syndrome */
28*3626738bSChristoph Hellwig 
29*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
30*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
31*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
32*3626738bSChristoph Hellwig 		      ".option	pop\n"
33*3626738bSChristoph Hellwig 		      : "=&r" (vl)
34*3626738bSChristoph Hellwig 	);
35*3626738bSChristoph Hellwig 
36*3626738bSChristoph Hellwig 	nsize = vl;
37*3626738bSChristoph Hellwig 
38*3626738bSChristoph Hellwig 	 /* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
39*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 1) {
40*3626738bSChristoph Hellwig 		/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
41*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
42*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
43*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
44*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
45*3626738bSChristoph Hellwig 			      ".option	pop\n"
46*3626738bSChristoph Hellwig 			      : :
47*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize])
48*3626738bSChristoph Hellwig 		);
49*3626738bSChristoph Hellwig 
50*3626738bSChristoph Hellwig 		for (z = z0 - 1 ; z >= 0 ; z--) {
51*3626738bSChristoph Hellwig 			/*
52*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
53*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
54*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
55*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
56*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
57*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
58*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
59*3626738bSChristoph Hellwig 			 */
60*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
61*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
62*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
63*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
64*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
65*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
66*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
67*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
68*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
69*3626738bSChristoph Hellwig 				      ".option	pop\n"
70*3626738bSChristoph Hellwig 				      : :
71*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
72*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
73*3626738bSChristoph Hellwig 			);
74*3626738bSChristoph Hellwig 		}
75*3626738bSChristoph Hellwig 
76*3626738bSChristoph Hellwig 		/*
77*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] = wp$$;
78*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] = wq$$;
79*3626738bSChristoph Hellwig 		 */
80*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
81*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
82*3626738bSChristoph Hellwig 			      "vse8.v	v0, (%[wp0])\n"
83*3626738bSChristoph Hellwig 			      "vse8.v	v1, (%[wq0])\n"
84*3626738bSChristoph Hellwig 			      ".option	pop\n"
85*3626738bSChristoph Hellwig 			      : :
86*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
87*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0])
88*3626738bSChristoph Hellwig 		);
89*3626738bSChristoph Hellwig 	}
90*3626738bSChristoph Hellwig }
91*3626738bSChristoph Hellwig 
92*3626738bSChristoph Hellwig static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop,
93*3626738bSChristoph Hellwig 					 unsigned long bytes, void **ptrs)
94*3626738bSChristoph Hellwig {
95*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
96*3626738bSChristoph Hellwig 	u8 *p, *q;
97*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
98*3626738bSChristoph Hellwig 	int z, z0;
99*3626738bSChristoph Hellwig 
100*3626738bSChristoph Hellwig 	z0 = stop;		/* P/Q right side optimization */
101*3626738bSChristoph Hellwig 	p = dptr[disks - 2];	/* XOR parity */
102*3626738bSChristoph Hellwig 	q = dptr[disks - 1];	/* RS syndrome */
103*3626738bSChristoph Hellwig 
104*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
105*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
106*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
107*3626738bSChristoph Hellwig 		      ".option	pop\n"
108*3626738bSChristoph Hellwig 		      : "=&r" (vl)
109*3626738bSChristoph Hellwig 	);
110*3626738bSChristoph Hellwig 
111*3626738bSChristoph Hellwig 	nsize = vl;
112*3626738bSChristoph Hellwig 
113*3626738bSChristoph Hellwig 	/* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */
114*3626738bSChristoph Hellwig 	for (d = 0 ; d < bytes ; d += nsize * 1) {
115*3626738bSChristoph Hellwig 		/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
116*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
117*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
118*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
119*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
120*3626738bSChristoph Hellwig 			      ".option	pop\n"
121*3626738bSChristoph Hellwig 			      : :
122*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize])
123*3626738bSChristoph Hellwig 		);
124*3626738bSChristoph Hellwig 
125*3626738bSChristoph Hellwig 		/* P/Q data pages */
126*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= start; z--) {
127*3626738bSChristoph Hellwig 			/*
128*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
129*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
130*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
131*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
132*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
133*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
134*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
135*3626738bSChristoph Hellwig 			 */
136*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
137*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
138*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
139*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
140*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
141*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
142*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
143*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
144*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
145*3626738bSChristoph Hellwig 				      ".option	pop\n"
146*3626738bSChristoph Hellwig 				      : :
147*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
148*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
149*3626738bSChristoph Hellwig 			);
150*3626738bSChristoph Hellwig 		}
151*3626738bSChristoph Hellwig 
152*3626738bSChristoph Hellwig 		/* P/Q left side optimization */
153*3626738bSChristoph Hellwig 		for (z = start - 1; z >= 0; z--) {
154*3626738bSChristoph Hellwig 			/*
155*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
156*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
157*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
158*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ w2$$;
159*3626738bSChristoph Hellwig 			 */
160*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
161*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
162*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
163*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
164*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
165*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
166*3626738bSChristoph Hellwig 				      ".option	pop\n"
167*3626738bSChristoph Hellwig 				      : :
168*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
169*3626738bSChristoph Hellwig 			);
170*3626738bSChristoph Hellwig 		}
171*3626738bSChristoph Hellwig 
172*3626738bSChristoph Hellwig 		/*
173*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] ^= wp$$;
174*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] ^= wq$$;
175*3626738bSChristoph Hellwig 		 * v0:wp0, v1:wq0, v2:p0, v3:q0
176*3626738bSChristoph Hellwig 		 */
177*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
178*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
179*3626738bSChristoph Hellwig 			      "vle8.v	v2, (%[wp0])\n"
180*3626738bSChristoph Hellwig 			      "vle8.v	v3, (%[wq0])\n"
181*3626738bSChristoph Hellwig 			      "vxor.vv	v2, v2, v0\n"
182*3626738bSChristoph Hellwig 			      "vxor.vv	v3, v3, v1\n"
183*3626738bSChristoph Hellwig 			      "vse8.v	v2, (%[wp0])\n"
184*3626738bSChristoph Hellwig 			      "vse8.v	v3, (%[wq0])\n"
185*3626738bSChristoph Hellwig 			      ".option	pop\n"
186*3626738bSChristoph Hellwig 			      : :
187*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
188*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0])
189*3626738bSChristoph Hellwig 		);
190*3626738bSChristoph Hellwig 	}
191*3626738bSChristoph Hellwig }
192*3626738bSChristoph Hellwig 
193*3626738bSChristoph Hellwig static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
194*3626738bSChristoph Hellwig {
195*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
196*3626738bSChristoph Hellwig 	u8 *p, *q;
197*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
198*3626738bSChristoph Hellwig 	int z, z0;
199*3626738bSChristoph Hellwig 
200*3626738bSChristoph Hellwig 	z0 = disks - 3;		/* Highest data disk */
201*3626738bSChristoph Hellwig 	p = dptr[z0 + 1];		/* XOR parity */
202*3626738bSChristoph Hellwig 	q = dptr[z0 + 2];		/* RS syndrome */
203*3626738bSChristoph Hellwig 
204*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
205*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
206*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
207*3626738bSChristoph Hellwig 		      ".option	pop\n"
208*3626738bSChristoph Hellwig 		      : "=&r" (vl)
209*3626738bSChristoph Hellwig 	);
210*3626738bSChristoph Hellwig 
211*3626738bSChristoph Hellwig 	nsize = vl;
212*3626738bSChristoph Hellwig 
213*3626738bSChristoph Hellwig 	/*
214*3626738bSChristoph Hellwig 	 * v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
215*3626738bSChristoph Hellwig 	 * v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
216*3626738bSChristoph Hellwig 	 */
217*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 2) {
218*3626738bSChristoph Hellwig 		/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
219*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
220*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
221*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
222*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
223*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
224*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
225*3626738bSChristoph Hellwig 			      ".option	pop\n"
226*3626738bSChristoph Hellwig 			      : :
227*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
228*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize])
229*3626738bSChristoph Hellwig 		);
230*3626738bSChristoph Hellwig 
231*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= 0; z--) {
232*3626738bSChristoph Hellwig 			/*
233*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
234*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
235*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
236*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
237*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
238*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
239*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
240*3626738bSChristoph Hellwig 			 */
241*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
242*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
243*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
244*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
245*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
246*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
247*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
248*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
249*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
250*3626738bSChristoph Hellwig 
251*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
252*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
253*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
254*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
255*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
256*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
257*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
258*3626738bSChristoph Hellwig 				      ".option	pop\n"
259*3626738bSChristoph Hellwig 				      : :
260*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
261*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
262*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
263*3626738bSChristoph Hellwig 			);
264*3626738bSChristoph Hellwig 		}
265*3626738bSChristoph Hellwig 
266*3626738bSChristoph Hellwig 		/*
267*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] = wp$$;
268*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] = wq$$;
269*3626738bSChristoph Hellwig 		 */
270*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
271*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
272*3626738bSChristoph Hellwig 			      "vse8.v	v0, (%[wp0])\n"
273*3626738bSChristoph Hellwig 			      "vse8.v	v1, (%[wq0])\n"
274*3626738bSChristoph Hellwig 			      "vse8.v	v4, (%[wp1])\n"
275*3626738bSChristoph Hellwig 			      "vse8.v	v5, (%[wq1])\n"
276*3626738bSChristoph Hellwig 			      ".option	pop\n"
277*3626738bSChristoph Hellwig 			      : :
278*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
279*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
280*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
281*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1])
282*3626738bSChristoph Hellwig 		);
283*3626738bSChristoph Hellwig 	}
284*3626738bSChristoph Hellwig }
285*3626738bSChristoph Hellwig 
286*3626738bSChristoph Hellwig static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop,
287*3626738bSChristoph Hellwig 					 unsigned long bytes, void **ptrs)
288*3626738bSChristoph Hellwig {
289*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
290*3626738bSChristoph Hellwig 	u8 *p, *q;
291*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
292*3626738bSChristoph Hellwig 	int z, z0;
293*3626738bSChristoph Hellwig 
294*3626738bSChristoph Hellwig 	z0 = stop;		/* P/Q right side optimization */
295*3626738bSChristoph Hellwig 	p = dptr[disks - 2];	/* XOR parity */
296*3626738bSChristoph Hellwig 	q = dptr[disks - 1];	/* RS syndrome */
297*3626738bSChristoph Hellwig 
298*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
299*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
300*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
301*3626738bSChristoph Hellwig 		      ".option	pop\n"
302*3626738bSChristoph Hellwig 		      : "=&r" (vl)
303*3626738bSChristoph Hellwig 	);
304*3626738bSChristoph Hellwig 
305*3626738bSChristoph Hellwig 	nsize = vl;
306*3626738bSChristoph Hellwig 
307*3626738bSChristoph Hellwig 	/*
308*3626738bSChristoph Hellwig 	 * v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
309*3626738bSChristoph Hellwig 	 * v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
310*3626738bSChristoph Hellwig 	 */
311*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 2) {
312*3626738bSChristoph Hellwig 		 /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
313*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
314*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
315*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
316*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
317*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
318*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
319*3626738bSChristoph Hellwig 			      ".option	pop\n"
320*3626738bSChristoph Hellwig 			      : :
321*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
322*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize])
323*3626738bSChristoph Hellwig 		);
324*3626738bSChristoph Hellwig 
325*3626738bSChristoph Hellwig 		/* P/Q data pages */
326*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= start; z--) {
327*3626738bSChristoph Hellwig 			/*
328*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
329*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
330*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
331*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
332*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
333*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
334*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
335*3626738bSChristoph Hellwig 			 */
336*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
337*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
338*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
339*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
340*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
341*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
342*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
343*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
344*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
345*3626738bSChristoph Hellwig 
346*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
347*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
348*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
349*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
350*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
351*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
352*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
353*3626738bSChristoph Hellwig 				      ".option	pop\n"
354*3626738bSChristoph Hellwig 				      : :
355*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
356*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
357*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
358*3626738bSChristoph Hellwig 			);
359*3626738bSChristoph Hellwig 		}
360*3626738bSChristoph Hellwig 
361*3626738bSChristoph Hellwig 		/* P/Q left side optimization */
362*3626738bSChristoph Hellwig 		for (z = start - 1; z >= 0; z--) {
363*3626738bSChristoph Hellwig 			/*
364*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
365*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
366*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
367*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ w2$$;
368*3626738bSChristoph Hellwig 			 */
369*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
370*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
371*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
372*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
373*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
374*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
375*3626738bSChristoph Hellwig 
376*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
377*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
378*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
379*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
380*3626738bSChristoph Hellwig 				      ".option	pop\n"
381*3626738bSChristoph Hellwig 				      : :
382*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
383*3626738bSChristoph Hellwig 			);
384*3626738bSChristoph Hellwig 		}
385*3626738bSChristoph Hellwig 
386*3626738bSChristoph Hellwig 		/*
387*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] ^= wp$$;
388*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] ^= wq$$;
389*3626738bSChristoph Hellwig 		 * v0:wp0, v1:wq0, v2:p0, v3:q0
390*3626738bSChristoph Hellwig 		 * v4:wp1, v5:wq1, v6:p1, v7:q1
391*3626738bSChristoph Hellwig 		 */
392*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
393*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
394*3626738bSChristoph Hellwig 			      "vle8.v	v2, (%[wp0])\n"
395*3626738bSChristoph Hellwig 			      "vle8.v	v3, (%[wq0])\n"
396*3626738bSChristoph Hellwig 			      "vxor.vv	v2, v2, v0\n"
397*3626738bSChristoph Hellwig 			      "vxor.vv	v3, v3, v1\n"
398*3626738bSChristoph Hellwig 			      "vse8.v	v2, (%[wp0])\n"
399*3626738bSChristoph Hellwig 			      "vse8.v	v3, (%[wq0])\n"
400*3626738bSChristoph Hellwig 
401*3626738bSChristoph Hellwig 			      "vle8.v	v6, (%[wp1])\n"
402*3626738bSChristoph Hellwig 			      "vle8.v	v7, (%[wq1])\n"
403*3626738bSChristoph Hellwig 			      "vxor.vv	v6, v6, v4\n"
404*3626738bSChristoph Hellwig 			      "vxor.vv	v7, v7, v5\n"
405*3626738bSChristoph Hellwig 			      "vse8.v	v6, (%[wp1])\n"
406*3626738bSChristoph Hellwig 			      "vse8.v	v7, (%[wq1])\n"
407*3626738bSChristoph Hellwig 			      ".option	pop\n"
408*3626738bSChristoph Hellwig 			      : :
409*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
410*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
411*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
412*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1])
413*3626738bSChristoph Hellwig 		);
414*3626738bSChristoph Hellwig 	}
415*3626738bSChristoph Hellwig }
416*3626738bSChristoph Hellwig 
417*3626738bSChristoph Hellwig static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
418*3626738bSChristoph Hellwig {
419*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
420*3626738bSChristoph Hellwig 	u8 *p, *q;
421*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
422*3626738bSChristoph Hellwig 	int z, z0;
423*3626738bSChristoph Hellwig 
424*3626738bSChristoph Hellwig 	z0 = disks - 3;	/* Highest data disk */
425*3626738bSChristoph Hellwig 	p = dptr[z0 + 1];	/* XOR parity */
426*3626738bSChristoph Hellwig 	q = dptr[z0 + 2];	/* RS syndrome */
427*3626738bSChristoph Hellwig 
428*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
429*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
430*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
431*3626738bSChristoph Hellwig 		      ".option	pop\n"
432*3626738bSChristoph Hellwig 		      : "=&r" (vl)
433*3626738bSChristoph Hellwig 	);
434*3626738bSChristoph Hellwig 
435*3626738bSChristoph Hellwig 	nsize = vl;
436*3626738bSChristoph Hellwig 
437*3626738bSChristoph Hellwig 	/*
438*3626738bSChristoph Hellwig 	 * v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
439*3626738bSChristoph Hellwig 	 * v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
440*3626738bSChristoph Hellwig 	 * v8:wp2, v9:wq2, v10:wd2/w22, v11:w12
441*3626738bSChristoph Hellwig 	 * v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
442*3626738bSChristoph Hellwig 	 */
443*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 4) {
444*3626738bSChristoph Hellwig 		/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
445*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
446*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
447*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
448*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
449*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
450*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
451*3626738bSChristoph Hellwig 			      "vle8.v	v8, (%[wp2])\n"
452*3626738bSChristoph Hellwig 			      "vmv.v.v	v9, v8\n"
453*3626738bSChristoph Hellwig 			      "vle8.v	v12, (%[wp3])\n"
454*3626738bSChristoph Hellwig 			      "vmv.v.v	v13, v12\n"
455*3626738bSChristoph Hellwig 			      ".option	pop\n"
456*3626738bSChristoph Hellwig 			      : :
457*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
458*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize]),
459*3626738bSChristoph Hellwig 			      [wp2]"r"(&dptr[z0][d + 2 * nsize]),
460*3626738bSChristoph Hellwig 			      [wp3]"r"(&dptr[z0][d + 3 * nsize])
461*3626738bSChristoph Hellwig 		);
462*3626738bSChristoph Hellwig 
463*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= 0; z--) {
464*3626738bSChristoph Hellwig 			/*
465*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
466*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
467*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
468*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
469*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
470*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
471*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
472*3626738bSChristoph Hellwig 			 */
473*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
474*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
475*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
476*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
477*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
478*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
479*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
480*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
481*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
482*3626738bSChristoph Hellwig 
483*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
484*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
485*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
486*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
487*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
488*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
489*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
490*3626738bSChristoph Hellwig 
491*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
492*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
493*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
494*3626738bSChristoph Hellwig 				      "vxor.vv	v11, v11, v10\n"
495*3626738bSChristoph Hellwig 				      "vle8.v	v10, (%[wd2])\n"
496*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
497*3626738bSChristoph Hellwig 				      "vxor.vv	v8, v8, v10\n"
498*3626738bSChristoph Hellwig 
499*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
500*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
501*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
502*3626738bSChristoph Hellwig 				      "vxor.vv	v15, v15, v14\n"
503*3626738bSChristoph Hellwig 				      "vle8.v	v14, (%[wd3])\n"
504*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
505*3626738bSChristoph Hellwig 				      "vxor.vv	v12, v12, v14\n"
506*3626738bSChristoph Hellwig 				      ".option	pop\n"
507*3626738bSChristoph Hellwig 				      : :
508*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
509*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
510*3626738bSChristoph Hellwig 				      [wd2]"r"(&dptr[z][d + 2 * nsize]),
511*3626738bSChristoph Hellwig 				      [wd3]"r"(&dptr[z][d + 3 * nsize]),
512*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
513*3626738bSChristoph Hellwig 			);
514*3626738bSChristoph Hellwig 		}
515*3626738bSChristoph Hellwig 
516*3626738bSChristoph Hellwig 		/*
517*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] = wp$$;
518*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] = wq$$;
519*3626738bSChristoph Hellwig 		 */
520*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
521*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
522*3626738bSChristoph Hellwig 			      "vse8.v	v0, (%[wp0])\n"
523*3626738bSChristoph Hellwig 			      "vse8.v	v1, (%[wq0])\n"
524*3626738bSChristoph Hellwig 			      "vse8.v	v4, (%[wp1])\n"
525*3626738bSChristoph Hellwig 			      "vse8.v	v5, (%[wq1])\n"
526*3626738bSChristoph Hellwig 			      "vse8.v	v8, (%[wp2])\n"
527*3626738bSChristoph Hellwig 			      "vse8.v	v9, (%[wq2])\n"
528*3626738bSChristoph Hellwig 			      "vse8.v	v12, (%[wp3])\n"
529*3626738bSChristoph Hellwig 			      "vse8.v	v13, (%[wq3])\n"
530*3626738bSChristoph Hellwig 			      ".option	pop\n"
531*3626738bSChristoph Hellwig 			      : :
532*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
533*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
534*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
535*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1]),
536*3626738bSChristoph Hellwig 			      [wp2]"r"(&p[d + nsize * 2]),
537*3626738bSChristoph Hellwig 			      [wq2]"r"(&q[d + nsize * 2]),
538*3626738bSChristoph Hellwig 			      [wp3]"r"(&p[d + nsize * 3]),
539*3626738bSChristoph Hellwig 			      [wq3]"r"(&q[d + nsize * 3])
540*3626738bSChristoph Hellwig 		);
541*3626738bSChristoph Hellwig 	}
542*3626738bSChristoph Hellwig }
543*3626738bSChristoph Hellwig 
544*3626738bSChristoph Hellwig static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop,
545*3626738bSChristoph Hellwig 					 unsigned long bytes, void **ptrs)
546*3626738bSChristoph Hellwig {
547*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
548*3626738bSChristoph Hellwig 	u8 *p, *q;
549*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
550*3626738bSChristoph Hellwig 	int z, z0;
551*3626738bSChristoph Hellwig 
552*3626738bSChristoph Hellwig 	z0 = stop;		/* P/Q right side optimization */
553*3626738bSChristoph Hellwig 	p = dptr[disks - 2];	/* XOR parity */
554*3626738bSChristoph Hellwig 	q = dptr[disks - 1];	/* RS syndrome */
555*3626738bSChristoph Hellwig 
556*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
557*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
558*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
559*3626738bSChristoph Hellwig 		      ".option	pop\n"
560*3626738bSChristoph Hellwig 		      : "=&r" (vl)
561*3626738bSChristoph Hellwig 	);
562*3626738bSChristoph Hellwig 
563*3626738bSChristoph Hellwig 	nsize = vl;
564*3626738bSChristoph Hellwig 
565*3626738bSChristoph Hellwig 	/*
566*3626738bSChristoph Hellwig 	 * v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
567*3626738bSChristoph Hellwig 	 * v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
568*3626738bSChristoph Hellwig 	 * v8:wp2, v9:wq2, v10:wd2/w22, v11:w12
569*3626738bSChristoph Hellwig 	 * v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
570*3626738bSChristoph Hellwig 	 */
571*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 4) {
572*3626738bSChristoph Hellwig 		 /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
573*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
574*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
575*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
576*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
577*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
578*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
579*3626738bSChristoph Hellwig 			      "vle8.v	v8, (%[wp2])\n"
580*3626738bSChristoph Hellwig 			      "vmv.v.v	v9, v8\n"
581*3626738bSChristoph Hellwig 			      "vle8.v	v12, (%[wp3])\n"
582*3626738bSChristoph Hellwig 			      "vmv.v.v	v13, v12\n"
583*3626738bSChristoph Hellwig 			      ".option	pop\n"
584*3626738bSChristoph Hellwig 			      : :
585*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
586*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize]),
587*3626738bSChristoph Hellwig 			      [wp2]"r"(&dptr[z0][d + 2 * nsize]),
588*3626738bSChristoph Hellwig 			      [wp3]"r"(&dptr[z0][d + 3 * nsize])
589*3626738bSChristoph Hellwig 		);
590*3626738bSChristoph Hellwig 
591*3626738bSChristoph Hellwig 		/* P/Q data pages */
592*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= start; z--) {
593*3626738bSChristoph Hellwig 			/*
594*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
595*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
596*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
597*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
598*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
599*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
600*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
601*3626738bSChristoph Hellwig 			 */
602*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
603*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
604*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
605*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
606*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
607*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
608*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
609*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
610*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
611*3626738bSChristoph Hellwig 
612*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
613*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
614*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
615*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
616*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
617*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
618*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
619*3626738bSChristoph Hellwig 
620*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
621*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
622*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
623*3626738bSChristoph Hellwig 				      "vxor.vv	v11, v11, v10\n"
624*3626738bSChristoph Hellwig 				      "vle8.v	v10, (%[wd2])\n"
625*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
626*3626738bSChristoph Hellwig 				      "vxor.vv	v8, v8, v10\n"
627*3626738bSChristoph Hellwig 
628*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
629*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
630*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
631*3626738bSChristoph Hellwig 				      "vxor.vv	v15, v15, v14\n"
632*3626738bSChristoph Hellwig 				      "vle8.v	v14, (%[wd3])\n"
633*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
634*3626738bSChristoph Hellwig 				      "vxor.vv	v12, v12, v14\n"
635*3626738bSChristoph Hellwig 				      ".option	pop\n"
636*3626738bSChristoph Hellwig 				      : :
637*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
638*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
639*3626738bSChristoph Hellwig 				      [wd2]"r"(&dptr[z][d + 2 * nsize]),
640*3626738bSChristoph Hellwig 				      [wd3]"r"(&dptr[z][d + 3 * nsize]),
641*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
642*3626738bSChristoph Hellwig 			);
643*3626738bSChristoph Hellwig 		}
644*3626738bSChristoph Hellwig 
645*3626738bSChristoph Hellwig 		/* P/Q left side optimization */
646*3626738bSChristoph Hellwig 		for (z = start - 1; z >= 0; z--) {
647*3626738bSChristoph Hellwig 			/*
648*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
649*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
650*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
651*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ w2$$;
652*3626738bSChristoph Hellwig 			 */
653*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
654*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
655*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
656*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
657*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
658*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
659*3626738bSChristoph Hellwig 
660*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
661*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
662*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
663*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
664*3626738bSChristoph Hellwig 
665*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
666*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
667*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
668*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
669*3626738bSChristoph Hellwig 
670*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
671*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
672*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
673*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
674*3626738bSChristoph Hellwig 				      ".option	pop\n"
675*3626738bSChristoph Hellwig 				      : :
676*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
677*3626738bSChristoph Hellwig 			);
678*3626738bSChristoph Hellwig 		}
679*3626738bSChristoph Hellwig 
680*3626738bSChristoph Hellwig 		/*
681*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] ^= wp$$;
682*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] ^= wq$$;
683*3626738bSChristoph Hellwig 		 * v0:wp0, v1:wq0, v2:p0, v3:q0
684*3626738bSChristoph Hellwig 		 * v4:wp1, v5:wq1, v6:p1, v7:q1
685*3626738bSChristoph Hellwig 		 * v8:wp2, v9:wq2, v10:p2, v11:q2
686*3626738bSChristoph Hellwig 		 * v12:wp3, v13:wq3, v14:p3, v15:q3
687*3626738bSChristoph Hellwig 		 */
688*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
689*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
690*3626738bSChristoph Hellwig 			      "vle8.v	v2, (%[wp0])\n"
691*3626738bSChristoph Hellwig 			      "vle8.v	v3, (%[wq0])\n"
692*3626738bSChristoph Hellwig 			      "vxor.vv	v2, v2, v0\n"
693*3626738bSChristoph Hellwig 			      "vxor.vv	v3, v3, v1\n"
694*3626738bSChristoph Hellwig 			      "vse8.v	v2, (%[wp0])\n"
695*3626738bSChristoph Hellwig 			      "vse8.v	v3, (%[wq0])\n"
696*3626738bSChristoph Hellwig 
697*3626738bSChristoph Hellwig 			      "vle8.v	v6, (%[wp1])\n"
698*3626738bSChristoph Hellwig 			      "vle8.v	v7, (%[wq1])\n"
699*3626738bSChristoph Hellwig 			      "vxor.vv	v6, v6, v4\n"
700*3626738bSChristoph Hellwig 			      "vxor.vv	v7, v7, v5\n"
701*3626738bSChristoph Hellwig 			      "vse8.v	v6, (%[wp1])\n"
702*3626738bSChristoph Hellwig 			      "vse8.v	v7, (%[wq1])\n"
703*3626738bSChristoph Hellwig 
704*3626738bSChristoph Hellwig 			      "vle8.v	v10, (%[wp2])\n"
705*3626738bSChristoph Hellwig 			      "vle8.v	v11, (%[wq2])\n"
706*3626738bSChristoph Hellwig 			      "vxor.vv	v10, v10, v8\n"
707*3626738bSChristoph Hellwig 			      "vxor.vv	v11, v11, v9\n"
708*3626738bSChristoph Hellwig 			      "vse8.v	v10, (%[wp2])\n"
709*3626738bSChristoph Hellwig 			      "vse8.v	v11, (%[wq2])\n"
710*3626738bSChristoph Hellwig 
711*3626738bSChristoph Hellwig 			      "vle8.v	v14, (%[wp3])\n"
712*3626738bSChristoph Hellwig 			      "vle8.v	v15, (%[wq3])\n"
713*3626738bSChristoph Hellwig 			      "vxor.vv	v14, v14, v12\n"
714*3626738bSChristoph Hellwig 			      "vxor.vv	v15, v15, v13\n"
715*3626738bSChristoph Hellwig 			      "vse8.v	v14, (%[wp3])\n"
716*3626738bSChristoph Hellwig 			      "vse8.v	v15, (%[wq3])\n"
717*3626738bSChristoph Hellwig 			      ".option	pop\n"
718*3626738bSChristoph Hellwig 			      : :
719*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
720*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
721*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
722*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1]),
723*3626738bSChristoph Hellwig 			      [wp2]"r"(&p[d + nsize * 2]),
724*3626738bSChristoph Hellwig 			      [wq2]"r"(&q[d + nsize * 2]),
725*3626738bSChristoph Hellwig 			      [wp3]"r"(&p[d + nsize * 3]),
726*3626738bSChristoph Hellwig 			      [wq3]"r"(&q[d + nsize * 3])
727*3626738bSChristoph Hellwig 		);
728*3626738bSChristoph Hellwig 	}
729*3626738bSChristoph Hellwig }
730*3626738bSChristoph Hellwig 
731*3626738bSChristoph Hellwig static void raid6_rvv8_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
732*3626738bSChristoph Hellwig {
733*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
734*3626738bSChristoph Hellwig 	u8 *p, *q;
735*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
736*3626738bSChristoph Hellwig 	int z, z0;
737*3626738bSChristoph Hellwig 
738*3626738bSChristoph Hellwig 	z0 = disks - 3;	/* Highest data disk */
739*3626738bSChristoph Hellwig 	p = dptr[z0 + 1];	/* XOR parity */
740*3626738bSChristoph Hellwig 	q = dptr[z0 + 2];	/* RS syndrome */
741*3626738bSChristoph Hellwig 
742*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
743*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
744*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
745*3626738bSChristoph Hellwig 		      ".option	pop\n"
746*3626738bSChristoph Hellwig 		      : "=&r" (vl)
747*3626738bSChristoph Hellwig 	);
748*3626738bSChristoph Hellwig 
749*3626738bSChristoph Hellwig 	nsize = vl;
750*3626738bSChristoph Hellwig 
751*3626738bSChristoph Hellwig 	/*
752*3626738bSChristoph Hellwig 	 * v0:wp0,   v1:wq0,  v2:wd0/w20,  v3:w10
753*3626738bSChristoph Hellwig 	 * v4:wp1,   v5:wq1,  v6:wd1/w21,  v7:w11
754*3626738bSChristoph Hellwig 	 * v8:wp2,   v9:wq2, v10:wd2/w22, v11:w12
755*3626738bSChristoph Hellwig 	 * v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
756*3626738bSChristoph Hellwig 	 * v16:wp4, v17:wq4, v18:wd4/w24, v19:w14
757*3626738bSChristoph Hellwig 	 * v20:wp5, v21:wq5, v22:wd5/w25, v23:w15
758*3626738bSChristoph Hellwig 	 * v24:wp6, v25:wq6, v26:wd6/w26, v27:w16
759*3626738bSChristoph Hellwig 	 * v28:wp7, v29:wq7, v30:wd7/w27, v31:w17
760*3626738bSChristoph Hellwig 	 */
761*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 8) {
762*3626738bSChristoph Hellwig 		/* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
763*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
764*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
765*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
766*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
767*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
768*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
769*3626738bSChristoph Hellwig 			      "vle8.v	v8, (%[wp2])\n"
770*3626738bSChristoph Hellwig 			      "vmv.v.v	v9, v8\n"
771*3626738bSChristoph Hellwig 			      "vle8.v	v12, (%[wp3])\n"
772*3626738bSChristoph Hellwig 			      "vmv.v.v	v13, v12\n"
773*3626738bSChristoph Hellwig 			      "vle8.v	v16, (%[wp4])\n"
774*3626738bSChristoph Hellwig 			      "vmv.v.v	v17, v16\n"
775*3626738bSChristoph Hellwig 			      "vle8.v	v20, (%[wp5])\n"
776*3626738bSChristoph Hellwig 			      "vmv.v.v	v21, v20\n"
777*3626738bSChristoph Hellwig 			      "vle8.v	v24, (%[wp6])\n"
778*3626738bSChristoph Hellwig 			      "vmv.v.v	v25, v24\n"
779*3626738bSChristoph Hellwig 			      "vle8.v	v28, (%[wp7])\n"
780*3626738bSChristoph Hellwig 			      "vmv.v.v	v29, v28\n"
781*3626738bSChristoph Hellwig 			      ".option	pop\n"
782*3626738bSChristoph Hellwig 			      : :
783*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
784*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize]),
785*3626738bSChristoph Hellwig 			      [wp2]"r"(&dptr[z0][d + 2 * nsize]),
786*3626738bSChristoph Hellwig 			      [wp3]"r"(&dptr[z0][d + 3 * nsize]),
787*3626738bSChristoph Hellwig 			      [wp4]"r"(&dptr[z0][d + 4 * nsize]),
788*3626738bSChristoph Hellwig 			      [wp5]"r"(&dptr[z0][d + 5 * nsize]),
789*3626738bSChristoph Hellwig 			      [wp6]"r"(&dptr[z0][d + 6 * nsize]),
790*3626738bSChristoph Hellwig 			      [wp7]"r"(&dptr[z0][d + 7 * nsize])
791*3626738bSChristoph Hellwig 		);
792*3626738bSChristoph Hellwig 
793*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= 0; z--) {
794*3626738bSChristoph Hellwig 			/*
795*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
796*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
797*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
798*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
799*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
800*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
801*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
802*3626738bSChristoph Hellwig 			 */
803*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
804*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
805*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
806*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
807*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
808*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
809*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
810*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
811*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
812*3626738bSChristoph Hellwig 
813*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
814*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
815*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
816*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
817*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
818*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
819*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
820*3626738bSChristoph Hellwig 
821*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
822*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
823*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
824*3626738bSChristoph Hellwig 				      "vxor.vv	v11, v11, v10\n"
825*3626738bSChristoph Hellwig 				      "vle8.v	v10, (%[wd2])\n"
826*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
827*3626738bSChristoph Hellwig 				      "vxor.vv	v8, v8, v10\n"
828*3626738bSChristoph Hellwig 
829*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
830*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
831*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
832*3626738bSChristoph Hellwig 				      "vxor.vv	v15, v15, v14\n"
833*3626738bSChristoph Hellwig 				      "vle8.v	v14, (%[wd3])\n"
834*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
835*3626738bSChristoph Hellwig 				      "vxor.vv	v12, v12, v14\n"
836*3626738bSChristoph Hellwig 
837*3626738bSChristoph Hellwig 				      "vsra.vi	v18, v17, 7\n"
838*3626738bSChristoph Hellwig 				      "vsll.vi	v19, v17, 1\n"
839*3626738bSChristoph Hellwig 				      "vand.vx	v18, v18, %[x1d]\n"
840*3626738bSChristoph Hellwig 				      "vxor.vv	v19, v19, v18\n"
841*3626738bSChristoph Hellwig 				      "vle8.v	v18, (%[wd4])\n"
842*3626738bSChristoph Hellwig 				      "vxor.vv	v17, v19, v18\n"
843*3626738bSChristoph Hellwig 				      "vxor.vv	v16, v16, v18\n"
844*3626738bSChristoph Hellwig 
845*3626738bSChristoph Hellwig 				      "vsra.vi	v22, v21, 7\n"
846*3626738bSChristoph Hellwig 				      "vsll.vi	v23, v21, 1\n"
847*3626738bSChristoph Hellwig 				      "vand.vx	v22, v22, %[x1d]\n"
848*3626738bSChristoph Hellwig 				      "vxor.vv	v23, v23, v22\n"
849*3626738bSChristoph Hellwig 				      "vle8.v	v22, (%[wd5])\n"
850*3626738bSChristoph Hellwig 				      "vxor.vv	v21, v23, v22\n"
851*3626738bSChristoph Hellwig 				      "vxor.vv	v20, v20, v22\n"
852*3626738bSChristoph Hellwig 
853*3626738bSChristoph Hellwig 				      "vsra.vi	v26, v25, 7\n"
854*3626738bSChristoph Hellwig 				      "vsll.vi	v27, v25, 1\n"
855*3626738bSChristoph Hellwig 				      "vand.vx	v26, v26, %[x1d]\n"
856*3626738bSChristoph Hellwig 				      "vxor.vv	v27, v27, v26\n"
857*3626738bSChristoph Hellwig 				      "vle8.v	v26, (%[wd6])\n"
858*3626738bSChristoph Hellwig 				      "vxor.vv	v25, v27, v26\n"
859*3626738bSChristoph Hellwig 				      "vxor.vv	v24, v24, v26\n"
860*3626738bSChristoph Hellwig 
861*3626738bSChristoph Hellwig 				      "vsra.vi	v30, v29, 7\n"
862*3626738bSChristoph Hellwig 				      "vsll.vi	v31, v29, 1\n"
863*3626738bSChristoph Hellwig 				      "vand.vx	v30, v30, %[x1d]\n"
864*3626738bSChristoph Hellwig 				      "vxor.vv	v31, v31, v30\n"
865*3626738bSChristoph Hellwig 				      "vle8.v	v30, (%[wd7])\n"
866*3626738bSChristoph Hellwig 				      "vxor.vv	v29, v31, v30\n"
867*3626738bSChristoph Hellwig 				      "vxor.vv	v28, v28, v30\n"
868*3626738bSChristoph Hellwig 				      ".option	pop\n"
869*3626738bSChristoph Hellwig 				      : :
870*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
871*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
872*3626738bSChristoph Hellwig 				      [wd2]"r"(&dptr[z][d + 2 * nsize]),
873*3626738bSChristoph Hellwig 				      [wd3]"r"(&dptr[z][d + 3 * nsize]),
874*3626738bSChristoph Hellwig 				      [wd4]"r"(&dptr[z][d + 4 * nsize]),
875*3626738bSChristoph Hellwig 				      [wd5]"r"(&dptr[z][d + 5 * nsize]),
876*3626738bSChristoph Hellwig 				      [wd6]"r"(&dptr[z][d + 6 * nsize]),
877*3626738bSChristoph Hellwig 				      [wd7]"r"(&dptr[z][d + 7 * nsize]),
878*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
879*3626738bSChristoph Hellwig 			);
880*3626738bSChristoph Hellwig 		}
881*3626738bSChristoph Hellwig 
882*3626738bSChristoph Hellwig 		/*
883*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] = wp$$;
884*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] = wq$$;
885*3626738bSChristoph Hellwig 		 */
886*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
887*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
888*3626738bSChristoph Hellwig 			      "vse8.v	v0, (%[wp0])\n"
889*3626738bSChristoph Hellwig 			      "vse8.v	v1, (%[wq0])\n"
890*3626738bSChristoph Hellwig 			      "vse8.v	v4, (%[wp1])\n"
891*3626738bSChristoph Hellwig 			      "vse8.v	v5, (%[wq1])\n"
892*3626738bSChristoph Hellwig 			      "vse8.v	v8, (%[wp2])\n"
893*3626738bSChristoph Hellwig 			      "vse8.v	v9, (%[wq2])\n"
894*3626738bSChristoph Hellwig 			      "vse8.v	v12, (%[wp3])\n"
895*3626738bSChristoph Hellwig 			      "vse8.v	v13, (%[wq3])\n"
896*3626738bSChristoph Hellwig 			      "vse8.v	v16, (%[wp4])\n"
897*3626738bSChristoph Hellwig 			      "vse8.v	v17, (%[wq4])\n"
898*3626738bSChristoph Hellwig 			      "vse8.v	v20, (%[wp5])\n"
899*3626738bSChristoph Hellwig 			      "vse8.v	v21, (%[wq5])\n"
900*3626738bSChristoph Hellwig 			      "vse8.v	v24, (%[wp6])\n"
901*3626738bSChristoph Hellwig 			      "vse8.v	v25, (%[wq6])\n"
902*3626738bSChristoph Hellwig 			      "vse8.v	v28, (%[wp7])\n"
903*3626738bSChristoph Hellwig 			      "vse8.v	v29, (%[wq7])\n"
904*3626738bSChristoph Hellwig 			      ".option	pop\n"
905*3626738bSChristoph Hellwig 			      : :
906*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
907*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
908*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
909*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1]),
910*3626738bSChristoph Hellwig 			      [wp2]"r"(&p[d + nsize * 2]),
911*3626738bSChristoph Hellwig 			      [wq2]"r"(&q[d + nsize * 2]),
912*3626738bSChristoph Hellwig 			      [wp3]"r"(&p[d + nsize * 3]),
913*3626738bSChristoph Hellwig 			      [wq3]"r"(&q[d + nsize * 3]),
914*3626738bSChristoph Hellwig 			      [wp4]"r"(&p[d + nsize * 4]),
915*3626738bSChristoph Hellwig 			      [wq4]"r"(&q[d + nsize * 4]),
916*3626738bSChristoph Hellwig 			      [wp5]"r"(&p[d + nsize * 5]),
917*3626738bSChristoph Hellwig 			      [wq5]"r"(&q[d + nsize * 5]),
918*3626738bSChristoph Hellwig 			      [wp6]"r"(&p[d + nsize * 6]),
919*3626738bSChristoph Hellwig 			      [wq6]"r"(&q[d + nsize * 6]),
920*3626738bSChristoph Hellwig 			      [wp7]"r"(&p[d + nsize * 7]),
921*3626738bSChristoph Hellwig 			      [wq7]"r"(&q[d + nsize * 7])
922*3626738bSChristoph Hellwig 		);
923*3626738bSChristoph Hellwig 	}
924*3626738bSChristoph Hellwig }
925*3626738bSChristoph Hellwig 
926*3626738bSChristoph Hellwig static void raid6_rvv8_xor_syndrome_real(int disks, int start, int stop,
927*3626738bSChristoph Hellwig 					 unsigned long bytes, void **ptrs)
928*3626738bSChristoph Hellwig {
929*3626738bSChristoph Hellwig 	u8 **dptr = (u8 **)ptrs;
930*3626738bSChristoph Hellwig 	u8 *p, *q;
931*3626738bSChristoph Hellwig 	unsigned long vl, d, nsize;
932*3626738bSChristoph Hellwig 	int z, z0;
933*3626738bSChristoph Hellwig 
934*3626738bSChristoph Hellwig 	z0 = stop;		/* P/Q right side optimization */
935*3626738bSChristoph Hellwig 	p = dptr[disks - 2];	/* XOR parity */
936*3626738bSChristoph Hellwig 	q = dptr[disks - 1];	/* RS syndrome */
937*3626738bSChristoph Hellwig 
938*3626738bSChristoph Hellwig 	asm volatile (".option	push\n"
939*3626738bSChristoph Hellwig 		      ".option	arch,+v\n"
940*3626738bSChristoph Hellwig 		      "vsetvli	%0, x0, e8, m1, ta, ma\n"
941*3626738bSChristoph Hellwig 		      ".option	pop\n"
942*3626738bSChristoph Hellwig 		      : "=&r" (vl)
943*3626738bSChristoph Hellwig 	);
944*3626738bSChristoph Hellwig 
945*3626738bSChristoph Hellwig 	nsize = vl;
946*3626738bSChristoph Hellwig 
947*3626738bSChristoph Hellwig 	/*
948*3626738bSChristoph Hellwig 	 * v0:wp0, v1:wq0, v2:wd0/w20, v3:w10
949*3626738bSChristoph Hellwig 	 * v4:wp1, v5:wq1, v6:wd1/w21, v7:w11
950*3626738bSChristoph Hellwig 	 * v8:wp2, v9:wq2, v10:wd2/w22, v11:w12
951*3626738bSChristoph Hellwig 	 * v12:wp3, v13:wq3, v14:wd3/w23, v15:w13
952*3626738bSChristoph Hellwig 	 * v16:wp4, v17:wq4, v18:wd4/w24, v19:w14
953*3626738bSChristoph Hellwig 	 * v20:wp5, v21:wq5, v22:wd5/w25, v23:w15
954*3626738bSChristoph Hellwig 	 * v24:wp6, v25:wq6, v26:wd6/w26, v27:w16
955*3626738bSChristoph Hellwig 	 * v28:wp7, v29:wq7, v30:wd7/w27, v31:w17
956*3626738bSChristoph Hellwig 	 */
957*3626738bSChristoph Hellwig 	for (d = 0; d < bytes; d += nsize * 8) {
958*3626738bSChristoph Hellwig 		 /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */
959*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
960*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
961*3626738bSChristoph Hellwig 			      "vle8.v	v0, (%[wp0])\n"
962*3626738bSChristoph Hellwig 			      "vmv.v.v	v1, v0\n"
963*3626738bSChristoph Hellwig 			      "vle8.v	v4, (%[wp1])\n"
964*3626738bSChristoph Hellwig 			      "vmv.v.v	v5, v4\n"
965*3626738bSChristoph Hellwig 			      "vle8.v	v8, (%[wp2])\n"
966*3626738bSChristoph Hellwig 			      "vmv.v.v	v9, v8\n"
967*3626738bSChristoph Hellwig 			      "vle8.v	v12, (%[wp3])\n"
968*3626738bSChristoph Hellwig 			      "vmv.v.v	v13, v12\n"
969*3626738bSChristoph Hellwig 			      "vle8.v	v16, (%[wp4])\n"
970*3626738bSChristoph Hellwig 			      "vmv.v.v	v17, v16\n"
971*3626738bSChristoph Hellwig 			      "vle8.v	v20, (%[wp5])\n"
972*3626738bSChristoph Hellwig 			      "vmv.v.v	v21, v20\n"
973*3626738bSChristoph Hellwig 			      "vle8.v	v24, (%[wp6])\n"
974*3626738bSChristoph Hellwig 			      "vmv.v.v	v25, v24\n"
975*3626738bSChristoph Hellwig 			      "vle8.v	v28, (%[wp7])\n"
976*3626738bSChristoph Hellwig 			      "vmv.v.v	v29, v28\n"
977*3626738bSChristoph Hellwig 			      ".option	pop\n"
978*3626738bSChristoph Hellwig 			      : :
979*3626738bSChristoph Hellwig 			      [wp0]"r"(&dptr[z0][d + 0 * nsize]),
980*3626738bSChristoph Hellwig 			      [wp1]"r"(&dptr[z0][d + 1 * nsize]),
981*3626738bSChristoph Hellwig 			      [wp2]"r"(&dptr[z0][d + 2 * nsize]),
982*3626738bSChristoph Hellwig 			      [wp3]"r"(&dptr[z0][d + 3 * nsize]),
983*3626738bSChristoph Hellwig 			      [wp4]"r"(&dptr[z0][d + 4 * nsize]),
984*3626738bSChristoph Hellwig 			      [wp5]"r"(&dptr[z0][d + 5 * nsize]),
985*3626738bSChristoph Hellwig 			      [wp6]"r"(&dptr[z0][d + 6 * nsize]),
986*3626738bSChristoph Hellwig 			      [wp7]"r"(&dptr[z0][d + 7 * nsize])
987*3626738bSChristoph Hellwig 		);
988*3626738bSChristoph Hellwig 
989*3626738bSChristoph Hellwig 		/* P/Q data pages */
990*3626738bSChristoph Hellwig 		for (z = z0 - 1; z >= start; z--) {
991*3626738bSChristoph Hellwig 			/*
992*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
993*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
994*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
995*3626738bSChristoph Hellwig 			 * w1$$ ^= w2$$;
996*3626738bSChristoph Hellwig 			 * wd$$ = *(unative_t *)&dptr[z][d+$$*NSIZE];
997*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ wd$$;
998*3626738bSChristoph Hellwig 			 * wp$$ ^= wd$$;
999*3626738bSChristoph Hellwig 			 */
1000*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
1001*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
1002*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
1003*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
1004*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
1005*3626738bSChristoph Hellwig 				      "vxor.vv	v3, v3, v2\n"
1006*3626738bSChristoph Hellwig 				      "vle8.v	v2, (%[wd0])\n"
1007*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
1008*3626738bSChristoph Hellwig 				      "vxor.vv	v0, v0, v2\n"
1009*3626738bSChristoph Hellwig 
1010*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
1011*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
1012*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
1013*3626738bSChristoph Hellwig 				      "vxor.vv	v7, v7, v6\n"
1014*3626738bSChristoph Hellwig 				      "vle8.v	v6, (%[wd1])\n"
1015*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
1016*3626738bSChristoph Hellwig 				      "vxor.vv	v4, v4, v6\n"
1017*3626738bSChristoph Hellwig 
1018*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
1019*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
1020*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
1021*3626738bSChristoph Hellwig 				      "vxor.vv	v11, v11, v10\n"
1022*3626738bSChristoph Hellwig 				      "vle8.v	v10, (%[wd2])\n"
1023*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
1024*3626738bSChristoph Hellwig 				      "vxor.vv	v8, v8, v10\n"
1025*3626738bSChristoph Hellwig 
1026*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
1027*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
1028*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
1029*3626738bSChristoph Hellwig 				      "vxor.vv	v15, v15, v14\n"
1030*3626738bSChristoph Hellwig 				      "vle8.v	v14, (%[wd3])\n"
1031*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
1032*3626738bSChristoph Hellwig 				      "vxor.vv	v12, v12, v14\n"
1033*3626738bSChristoph Hellwig 
1034*3626738bSChristoph Hellwig 				      "vsra.vi	v18, v17, 7\n"
1035*3626738bSChristoph Hellwig 				      "vsll.vi	v19, v17, 1\n"
1036*3626738bSChristoph Hellwig 				      "vand.vx	v18, v18, %[x1d]\n"
1037*3626738bSChristoph Hellwig 				      "vxor.vv	v19, v19, v18\n"
1038*3626738bSChristoph Hellwig 				      "vle8.v	v18, (%[wd4])\n"
1039*3626738bSChristoph Hellwig 				      "vxor.vv	v17, v19, v18\n"
1040*3626738bSChristoph Hellwig 				      "vxor.vv	v16, v16, v18\n"
1041*3626738bSChristoph Hellwig 
1042*3626738bSChristoph Hellwig 				      "vsra.vi	v22, v21, 7\n"
1043*3626738bSChristoph Hellwig 				      "vsll.vi	v23, v21, 1\n"
1044*3626738bSChristoph Hellwig 				      "vand.vx	v22, v22, %[x1d]\n"
1045*3626738bSChristoph Hellwig 				      "vxor.vv	v23, v23, v22\n"
1046*3626738bSChristoph Hellwig 				      "vle8.v	v22, (%[wd5])\n"
1047*3626738bSChristoph Hellwig 				      "vxor.vv	v21, v23, v22\n"
1048*3626738bSChristoph Hellwig 				      "vxor.vv	v20, v20, v22\n"
1049*3626738bSChristoph Hellwig 
1050*3626738bSChristoph Hellwig 				      "vsra.vi	v26, v25, 7\n"
1051*3626738bSChristoph Hellwig 				      "vsll.vi	v27, v25, 1\n"
1052*3626738bSChristoph Hellwig 				      "vand.vx	v26, v26, %[x1d]\n"
1053*3626738bSChristoph Hellwig 				      "vxor.vv	v27, v27, v26\n"
1054*3626738bSChristoph Hellwig 				      "vle8.v	v26, (%[wd6])\n"
1055*3626738bSChristoph Hellwig 				      "vxor.vv	v25, v27, v26\n"
1056*3626738bSChristoph Hellwig 				      "vxor.vv	v24, v24, v26\n"
1057*3626738bSChristoph Hellwig 
1058*3626738bSChristoph Hellwig 				      "vsra.vi	v30, v29, 7\n"
1059*3626738bSChristoph Hellwig 				      "vsll.vi	v31, v29, 1\n"
1060*3626738bSChristoph Hellwig 				      "vand.vx	v30, v30, %[x1d]\n"
1061*3626738bSChristoph Hellwig 				      "vxor.vv	v31, v31, v30\n"
1062*3626738bSChristoph Hellwig 				      "vle8.v	v30, (%[wd7])\n"
1063*3626738bSChristoph Hellwig 				      "vxor.vv	v29, v31, v30\n"
1064*3626738bSChristoph Hellwig 				      "vxor.vv	v28, v28, v30\n"
1065*3626738bSChristoph Hellwig 				      ".option	pop\n"
1066*3626738bSChristoph Hellwig 				      : :
1067*3626738bSChristoph Hellwig 				      [wd0]"r"(&dptr[z][d + 0 * nsize]),
1068*3626738bSChristoph Hellwig 				      [wd1]"r"(&dptr[z][d + 1 * nsize]),
1069*3626738bSChristoph Hellwig 				      [wd2]"r"(&dptr[z][d + 2 * nsize]),
1070*3626738bSChristoph Hellwig 				      [wd3]"r"(&dptr[z][d + 3 * nsize]),
1071*3626738bSChristoph Hellwig 				      [wd4]"r"(&dptr[z][d + 4 * nsize]),
1072*3626738bSChristoph Hellwig 				      [wd5]"r"(&dptr[z][d + 5 * nsize]),
1073*3626738bSChristoph Hellwig 				      [wd6]"r"(&dptr[z][d + 6 * nsize]),
1074*3626738bSChristoph Hellwig 				      [wd7]"r"(&dptr[z][d + 7 * nsize]),
1075*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
1076*3626738bSChristoph Hellwig 			);
1077*3626738bSChristoph Hellwig 		}
1078*3626738bSChristoph Hellwig 
1079*3626738bSChristoph Hellwig 		/* P/Q left side optimization */
1080*3626738bSChristoph Hellwig 		for (z = start - 1; z >= 0; z--) {
1081*3626738bSChristoph Hellwig 			/*
1082*3626738bSChristoph Hellwig 			 * w2$$ = MASK(wq$$);
1083*3626738bSChristoph Hellwig 			 * w1$$ = SHLBYTE(wq$$);
1084*3626738bSChristoph Hellwig 			 * w2$$ &= NBYTES(0x1d);
1085*3626738bSChristoph Hellwig 			 * wq$$ = w1$$ ^ w2$$;
1086*3626738bSChristoph Hellwig 			 */
1087*3626738bSChristoph Hellwig 			asm volatile (".option	push\n"
1088*3626738bSChristoph Hellwig 				      ".option	arch,+v\n"
1089*3626738bSChristoph Hellwig 				      "vsra.vi	v2, v1, 7\n"
1090*3626738bSChristoph Hellwig 				      "vsll.vi	v3, v1, 1\n"
1091*3626738bSChristoph Hellwig 				      "vand.vx	v2, v2, %[x1d]\n"
1092*3626738bSChristoph Hellwig 				      "vxor.vv	v1, v3, v2\n"
1093*3626738bSChristoph Hellwig 
1094*3626738bSChristoph Hellwig 				      "vsra.vi	v6, v5, 7\n"
1095*3626738bSChristoph Hellwig 				      "vsll.vi	v7, v5, 1\n"
1096*3626738bSChristoph Hellwig 				      "vand.vx	v6, v6, %[x1d]\n"
1097*3626738bSChristoph Hellwig 				      "vxor.vv	v5, v7, v6\n"
1098*3626738bSChristoph Hellwig 
1099*3626738bSChristoph Hellwig 				      "vsra.vi	v10, v9, 7\n"
1100*3626738bSChristoph Hellwig 				      "vsll.vi	v11, v9, 1\n"
1101*3626738bSChristoph Hellwig 				      "vand.vx	v10, v10, %[x1d]\n"
1102*3626738bSChristoph Hellwig 				      "vxor.vv	v9, v11, v10\n"
1103*3626738bSChristoph Hellwig 
1104*3626738bSChristoph Hellwig 				      "vsra.vi	v14, v13, 7\n"
1105*3626738bSChristoph Hellwig 				      "vsll.vi	v15, v13, 1\n"
1106*3626738bSChristoph Hellwig 				      "vand.vx	v14, v14, %[x1d]\n"
1107*3626738bSChristoph Hellwig 				      "vxor.vv	v13, v15, v14\n"
1108*3626738bSChristoph Hellwig 
1109*3626738bSChristoph Hellwig 				      "vsra.vi	v18, v17, 7\n"
1110*3626738bSChristoph Hellwig 				      "vsll.vi	v19, v17, 1\n"
1111*3626738bSChristoph Hellwig 				      "vand.vx	v18, v18, %[x1d]\n"
1112*3626738bSChristoph Hellwig 				      "vxor.vv	v17, v19, v18\n"
1113*3626738bSChristoph Hellwig 
1114*3626738bSChristoph Hellwig 				      "vsra.vi	v22, v21, 7\n"
1115*3626738bSChristoph Hellwig 				      "vsll.vi	v23, v21, 1\n"
1116*3626738bSChristoph Hellwig 				      "vand.vx	v22, v22, %[x1d]\n"
1117*3626738bSChristoph Hellwig 				      "vxor.vv	v21, v23, v22\n"
1118*3626738bSChristoph Hellwig 
1119*3626738bSChristoph Hellwig 				      "vsra.vi	v26, v25, 7\n"
1120*3626738bSChristoph Hellwig 				      "vsll.vi	v27, v25, 1\n"
1121*3626738bSChristoph Hellwig 				      "vand.vx	v26, v26, %[x1d]\n"
1122*3626738bSChristoph Hellwig 				      "vxor.vv	v25, v27, v26\n"
1123*3626738bSChristoph Hellwig 
1124*3626738bSChristoph Hellwig 				      "vsra.vi	v30, v29, 7\n"
1125*3626738bSChristoph Hellwig 				      "vsll.vi	v31, v29, 1\n"
1126*3626738bSChristoph Hellwig 				      "vand.vx	v30, v30, %[x1d]\n"
1127*3626738bSChristoph Hellwig 				      "vxor.vv	v29, v31, v30\n"
1128*3626738bSChristoph Hellwig 				      ".option	pop\n"
1129*3626738bSChristoph Hellwig 				      : :
1130*3626738bSChristoph Hellwig 				      [x1d]"r"(0x1d)
1131*3626738bSChristoph Hellwig 			);
1132*3626738bSChristoph Hellwig 		}
1133*3626738bSChristoph Hellwig 
1134*3626738bSChristoph Hellwig 		/*
1135*3626738bSChristoph Hellwig 		 * *(unative_t *)&p[d+NSIZE*$$] ^= wp$$;
1136*3626738bSChristoph Hellwig 		 * *(unative_t *)&q[d+NSIZE*$$] ^= wq$$;
1137*3626738bSChristoph Hellwig 		 * v0:wp0, v1:wq0, v2:p0, v3:q0
1138*3626738bSChristoph Hellwig 		 * v4:wp1, v5:wq1, v6:p1, v7:q1
1139*3626738bSChristoph Hellwig 		 * v8:wp2, v9:wq2, v10:p2, v11:q2
1140*3626738bSChristoph Hellwig 		 * v12:wp3, v13:wq3, v14:p3, v15:q3
1141*3626738bSChristoph Hellwig 		 * v16:wp4, v17:wq4, v18:p4, v19:q4
1142*3626738bSChristoph Hellwig 		 * v20:wp5, v21:wq5, v22:p5, v23:q5
1143*3626738bSChristoph Hellwig 		 * v24:wp6, v25:wq6, v26:p6, v27:q6
1144*3626738bSChristoph Hellwig 		 * v28:wp7, v29:wq7, v30:p7, v31:q7
1145*3626738bSChristoph Hellwig 		 */
1146*3626738bSChristoph Hellwig 		asm volatile (".option	push\n"
1147*3626738bSChristoph Hellwig 			      ".option	arch,+v\n"
1148*3626738bSChristoph Hellwig 			      "vle8.v	v2, (%[wp0])\n"
1149*3626738bSChristoph Hellwig 			      "vle8.v	v3, (%[wq0])\n"
1150*3626738bSChristoph Hellwig 			      "vxor.vv	v2, v2, v0\n"
1151*3626738bSChristoph Hellwig 			      "vxor.vv	v3, v3, v1\n"
1152*3626738bSChristoph Hellwig 			      "vse8.v	v2, (%[wp0])\n"
1153*3626738bSChristoph Hellwig 			      "vse8.v	v3, (%[wq0])\n"
1154*3626738bSChristoph Hellwig 
1155*3626738bSChristoph Hellwig 			      "vle8.v	v6, (%[wp1])\n"
1156*3626738bSChristoph Hellwig 			      "vle8.v	v7, (%[wq1])\n"
1157*3626738bSChristoph Hellwig 			      "vxor.vv	v6, v6, v4\n"
1158*3626738bSChristoph Hellwig 			      "vxor.vv	v7, v7, v5\n"
1159*3626738bSChristoph Hellwig 			      "vse8.v	v6, (%[wp1])\n"
1160*3626738bSChristoph Hellwig 			      "vse8.v	v7, (%[wq1])\n"
1161*3626738bSChristoph Hellwig 
1162*3626738bSChristoph Hellwig 			      "vle8.v	v10, (%[wp2])\n"
1163*3626738bSChristoph Hellwig 			      "vle8.v	v11, (%[wq2])\n"
1164*3626738bSChristoph Hellwig 			      "vxor.vv	v10, v10, v8\n"
1165*3626738bSChristoph Hellwig 			      "vxor.vv	v11, v11, v9\n"
1166*3626738bSChristoph Hellwig 			      "vse8.v	v10, (%[wp2])\n"
1167*3626738bSChristoph Hellwig 			      "vse8.v	v11, (%[wq2])\n"
1168*3626738bSChristoph Hellwig 
1169*3626738bSChristoph Hellwig 			      "vle8.v	v14, (%[wp3])\n"
1170*3626738bSChristoph Hellwig 			      "vle8.v	v15, (%[wq3])\n"
1171*3626738bSChristoph Hellwig 			      "vxor.vv	v14, v14, v12\n"
1172*3626738bSChristoph Hellwig 			      "vxor.vv	v15, v15, v13\n"
1173*3626738bSChristoph Hellwig 			      "vse8.v	v14, (%[wp3])\n"
1174*3626738bSChristoph Hellwig 			      "vse8.v	v15, (%[wq3])\n"
1175*3626738bSChristoph Hellwig 
1176*3626738bSChristoph Hellwig 			      "vle8.v	v18, (%[wp4])\n"
1177*3626738bSChristoph Hellwig 			      "vle8.v	v19, (%[wq4])\n"
1178*3626738bSChristoph Hellwig 			      "vxor.vv	v18, v18, v16\n"
1179*3626738bSChristoph Hellwig 			      "vxor.vv	v19, v19, v17\n"
1180*3626738bSChristoph Hellwig 			      "vse8.v	v18, (%[wp4])\n"
1181*3626738bSChristoph Hellwig 			      "vse8.v	v19, (%[wq4])\n"
1182*3626738bSChristoph Hellwig 
1183*3626738bSChristoph Hellwig 			      "vle8.v	v22, (%[wp5])\n"
1184*3626738bSChristoph Hellwig 			      "vle8.v	v23, (%[wq5])\n"
1185*3626738bSChristoph Hellwig 			      "vxor.vv	v22, v22, v20\n"
1186*3626738bSChristoph Hellwig 			      "vxor.vv	v23, v23, v21\n"
1187*3626738bSChristoph Hellwig 			      "vse8.v	v22, (%[wp5])\n"
1188*3626738bSChristoph Hellwig 			      "vse8.v	v23, (%[wq5])\n"
1189*3626738bSChristoph Hellwig 
1190*3626738bSChristoph Hellwig 			      "vle8.v	v26, (%[wp6])\n"
1191*3626738bSChristoph Hellwig 			      "vle8.v	v27, (%[wq6])\n"
1192*3626738bSChristoph Hellwig 			      "vxor.vv	v26, v26, v24\n"
1193*3626738bSChristoph Hellwig 			      "vxor.vv	v27, v27, v25\n"
1194*3626738bSChristoph Hellwig 			      "vse8.v	v26, (%[wp6])\n"
1195*3626738bSChristoph Hellwig 			      "vse8.v	v27, (%[wq6])\n"
1196*3626738bSChristoph Hellwig 
1197*3626738bSChristoph Hellwig 			      "vle8.v	v30, (%[wp7])\n"
1198*3626738bSChristoph Hellwig 			      "vle8.v	v31, (%[wq7])\n"
1199*3626738bSChristoph Hellwig 			      "vxor.vv	v30, v30, v28\n"
1200*3626738bSChristoph Hellwig 			      "vxor.vv	v31, v31, v29\n"
1201*3626738bSChristoph Hellwig 			      "vse8.v	v30, (%[wp7])\n"
1202*3626738bSChristoph Hellwig 			      "vse8.v	v31, (%[wq7])\n"
1203*3626738bSChristoph Hellwig 			      ".option	pop\n"
1204*3626738bSChristoph Hellwig 			      : :
1205*3626738bSChristoph Hellwig 			      [wp0]"r"(&p[d + nsize * 0]),
1206*3626738bSChristoph Hellwig 			      [wq0]"r"(&q[d + nsize * 0]),
1207*3626738bSChristoph Hellwig 			      [wp1]"r"(&p[d + nsize * 1]),
1208*3626738bSChristoph Hellwig 			      [wq1]"r"(&q[d + nsize * 1]),
1209*3626738bSChristoph Hellwig 			      [wp2]"r"(&p[d + nsize * 2]),
1210*3626738bSChristoph Hellwig 			      [wq2]"r"(&q[d + nsize * 2]),
1211*3626738bSChristoph Hellwig 			      [wp3]"r"(&p[d + nsize * 3]),
1212*3626738bSChristoph Hellwig 			      [wq3]"r"(&q[d + nsize * 3]),
1213*3626738bSChristoph Hellwig 			      [wp4]"r"(&p[d + nsize * 4]),
1214*3626738bSChristoph Hellwig 			      [wq4]"r"(&q[d + nsize * 4]),
1215*3626738bSChristoph Hellwig 			      [wp5]"r"(&p[d + nsize * 5]),
1216*3626738bSChristoph Hellwig 			      [wq5]"r"(&q[d + nsize * 5]),
1217*3626738bSChristoph Hellwig 			      [wp6]"r"(&p[d + nsize * 6]),
1218*3626738bSChristoph Hellwig 			      [wq6]"r"(&q[d + nsize * 6]),
1219*3626738bSChristoph Hellwig 			      [wp7]"r"(&p[d + nsize * 7]),
1220*3626738bSChristoph Hellwig 			      [wq7]"r"(&q[d + nsize * 7])
1221*3626738bSChristoph Hellwig 		);
1222*3626738bSChristoph Hellwig 	}
1223*3626738bSChristoph Hellwig }
1224*3626738bSChristoph Hellwig 
1225*3626738bSChristoph Hellwig RAID6_RVV_WRAPPER(1);
1226*3626738bSChristoph Hellwig RAID6_RVV_WRAPPER(2);
1227*3626738bSChristoph Hellwig RAID6_RVV_WRAPPER(4);
1228*3626738bSChristoph Hellwig RAID6_RVV_WRAPPER(8);
1229