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