|
|
@@ -3,6 +3,7 @@
|
|
|
* neon.uc - RAID-6 syndrome calculation using ARM NEON instructions
|
|
|
*
|
|
|
* Copyright (C) 2012 Rob Herring
|
|
|
+ * Copyright (C) 2015 Linaro Ltd. <ard.biesheuvel@linaro.org>
|
|
|
*
|
|
|
* Based on altivec.uc:
|
|
|
* Copyright 2002-2004 H. Peter Anvin - All Rights Reserved
|
|
|
@@ -78,3 +79,48 @@ void raid6_neon$#_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs)
|
|
|
vst1q_u8(&q[d+NSIZE*$$], wq$$);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+void raid6_neon$#_xor_syndrome_real(int disks, int start, int stop,
|
|
|
+ unsigned long bytes, void **ptrs)
|
|
|
+{
|
|
|
+ uint8_t **dptr = (uint8_t **)ptrs;
|
|
|
+ uint8_t *p, *q;
|
|
|
+ int d, z, z0;
|
|
|
+
|
|
|
+ register unative_t wd$$, wq$$, wp$$, w1$$, w2$$;
|
|
|
+ const unative_t x1d = NBYTES(0x1d);
|
|
|
+
|
|
|
+ z0 = stop; /* P/Q right side optimization */
|
|
|
+ p = dptr[disks-2]; /* XOR parity */
|
|
|
+ q = dptr[disks-1]; /* RS syndrome */
|
|
|
+
|
|
|
+ for ( d = 0 ; d < bytes ; d += NSIZE*$# ) {
|
|
|
+ wq$$ = vld1q_u8(&dptr[z0][d+$$*NSIZE]);
|
|
|
+ wp$$ = veorq_u8(vld1q_u8(&p[d+$$*NSIZE]), wq$$);
|
|
|
+
|
|
|
+ /* P/Q data pages */
|
|
|
+ for ( z = z0-1 ; z >= start ; z-- ) {
|
|
|
+ wd$$ = vld1q_u8(&dptr[z][d+$$*NSIZE]);
|
|
|
+ wp$$ = veorq_u8(wp$$, wd$$);
|
|
|
+ w2$$ = MASK(wq$$);
|
|
|
+ w1$$ = SHLBYTE(wq$$);
|
|
|
+
|
|
|
+ w2$$ = vandq_u8(w2$$, x1d);
|
|
|
+ w1$$ = veorq_u8(w1$$, w2$$);
|
|
|
+ wq$$ = veorq_u8(w1$$, wd$$);
|
|
|
+ }
|
|
|
+ /* P/Q left side optimization */
|
|
|
+ for ( z = start-1 ; z >= 0 ; z-- ) {
|
|
|
+ w2$$ = MASK(wq$$);
|
|
|
+ w1$$ = SHLBYTE(wq$$);
|
|
|
+
|
|
|
+ w2$$ = vandq_u8(w2$$, x1d);
|
|
|
+ wq$$ = veorq_u8(w1$$, w2$$);
|
|
|
+ }
|
|
|
+ w1$$ = vld1q_u8(&q[d+NSIZE*$$]);
|
|
|
+ wq$$ = veorq_u8(wq$$, w1$$);
|
|
|
+
|
|
|
+ vst1q_u8(&p[d+NSIZE*$$], wp$$);
|
|
|
+ vst1q_u8(&q[d+NSIZE*$$], wq$$);
|
|
|
+ }
|
|
|
+}
|