xref: /linux/lib/raid/xor/arm64/xor-neon.c (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
13786f2adSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-only
23786f2adSChristoph Hellwig /*
33786f2adSChristoph Hellwig  * Authors: Jackie Liu <liuyun01@kylinos.cn>
43786f2adSChristoph Hellwig  * Copyright (C) 2018,Tianjin KYLIN Information Technology Co., Ltd.
53786f2adSChristoph Hellwig  */
63786f2adSChristoph Hellwig 
73786f2adSChristoph Hellwig #include <linux/cache.h>
83786f2adSChristoph Hellwig #include <asm/neon-intrinsics.h>
9e20043b4SChristoph Hellwig #include "xor_impl.h"
10e20043b4SChristoph Hellwig #include "xor_arch.h"
11352ebd06SChristoph Hellwig #include "xor-neon.h"
123786f2adSChristoph Hellwig 
13*80dcf0a7SChristoph Hellwig static void __xor_neon_2(unsigned long bytes, unsigned long * __restrict p1,
143786f2adSChristoph Hellwig 		const unsigned long * __restrict p2)
153786f2adSChristoph Hellwig {
163786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
173786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
183786f2adSChristoph Hellwig 
193786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
203786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
213786f2adSChristoph Hellwig 
223786f2adSChristoph Hellwig 	do {
233786f2adSChristoph Hellwig 		/* p1 ^= p2 */
243786f2adSChristoph Hellwig 		v0 = veorq_u64(vld1q_u64(dp1 +  0), vld1q_u64(dp2 +  0));
253786f2adSChristoph Hellwig 		v1 = veorq_u64(vld1q_u64(dp1 +  2), vld1q_u64(dp2 +  2));
263786f2adSChristoph Hellwig 		v2 = veorq_u64(vld1q_u64(dp1 +  4), vld1q_u64(dp2 +  4));
273786f2adSChristoph Hellwig 		v3 = veorq_u64(vld1q_u64(dp1 +  6), vld1q_u64(dp2 +  6));
283786f2adSChristoph Hellwig 
293786f2adSChristoph Hellwig 		/* store */
303786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  0, v0);
313786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  2, v1);
323786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  4, v2);
333786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  6, v3);
343786f2adSChristoph Hellwig 
353786f2adSChristoph Hellwig 		dp1 += 8;
363786f2adSChristoph Hellwig 		dp2 += 8;
373786f2adSChristoph Hellwig 	} while (--lines > 0);
383786f2adSChristoph Hellwig }
393786f2adSChristoph Hellwig 
40*80dcf0a7SChristoph Hellwig static void __xor_neon_3(unsigned long bytes, unsigned long * __restrict p1,
413786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
423786f2adSChristoph Hellwig 		const unsigned long * __restrict p3)
433786f2adSChristoph Hellwig {
443786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
453786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
463786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
473786f2adSChristoph Hellwig 
483786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
493786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
503786f2adSChristoph Hellwig 
513786f2adSChristoph Hellwig 	do {
523786f2adSChristoph Hellwig 		/* p1 ^= p2 */
533786f2adSChristoph Hellwig 		v0 = veorq_u64(vld1q_u64(dp1 +  0), vld1q_u64(dp2 +  0));
543786f2adSChristoph Hellwig 		v1 = veorq_u64(vld1q_u64(dp1 +  2), vld1q_u64(dp2 +  2));
553786f2adSChristoph Hellwig 		v2 = veorq_u64(vld1q_u64(dp1 +  4), vld1q_u64(dp2 +  4));
563786f2adSChristoph Hellwig 		v3 = veorq_u64(vld1q_u64(dp1 +  6), vld1q_u64(dp2 +  6));
573786f2adSChristoph Hellwig 
583786f2adSChristoph Hellwig 		/* p1 ^= p3 */
593786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp3 +  0));
603786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp3 +  2));
613786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp3 +  4));
623786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp3 +  6));
633786f2adSChristoph Hellwig 
643786f2adSChristoph Hellwig 		/* store */
653786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  0, v0);
663786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  2, v1);
673786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  4, v2);
683786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  6, v3);
693786f2adSChristoph Hellwig 
703786f2adSChristoph Hellwig 		dp1 += 8;
713786f2adSChristoph Hellwig 		dp2 += 8;
723786f2adSChristoph Hellwig 		dp3 += 8;
733786f2adSChristoph Hellwig 	} while (--lines > 0);
743786f2adSChristoph Hellwig }
753786f2adSChristoph Hellwig 
76*80dcf0a7SChristoph Hellwig static void __xor_neon_4(unsigned long bytes, unsigned long * __restrict p1,
773786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
783786f2adSChristoph Hellwig 		const unsigned long * __restrict p3,
793786f2adSChristoph Hellwig 		const unsigned long * __restrict p4)
803786f2adSChristoph Hellwig {
813786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
823786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
833786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
843786f2adSChristoph Hellwig 	uint64_t *dp4 = (uint64_t *)p4;
853786f2adSChristoph Hellwig 
863786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
873786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
883786f2adSChristoph Hellwig 
893786f2adSChristoph Hellwig 	do {
903786f2adSChristoph Hellwig 		/* p1 ^= p2 */
913786f2adSChristoph Hellwig 		v0 = veorq_u64(vld1q_u64(dp1 +  0), vld1q_u64(dp2 +  0));
923786f2adSChristoph Hellwig 		v1 = veorq_u64(vld1q_u64(dp1 +  2), vld1q_u64(dp2 +  2));
933786f2adSChristoph Hellwig 		v2 = veorq_u64(vld1q_u64(dp1 +  4), vld1q_u64(dp2 +  4));
943786f2adSChristoph Hellwig 		v3 = veorq_u64(vld1q_u64(dp1 +  6), vld1q_u64(dp2 +  6));
953786f2adSChristoph Hellwig 
963786f2adSChristoph Hellwig 		/* p1 ^= p3 */
973786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp3 +  0));
983786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp3 +  2));
993786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp3 +  4));
1003786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp3 +  6));
1013786f2adSChristoph Hellwig 
1023786f2adSChristoph Hellwig 		/* p1 ^= p4 */
1033786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp4 +  0));
1043786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp4 +  2));
1053786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp4 +  4));
1063786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp4 +  6));
1073786f2adSChristoph Hellwig 
1083786f2adSChristoph Hellwig 		/* store */
1093786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  0, v0);
1103786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  2, v1);
1113786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  4, v2);
1123786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  6, v3);
1133786f2adSChristoph Hellwig 
1143786f2adSChristoph Hellwig 		dp1 += 8;
1153786f2adSChristoph Hellwig 		dp2 += 8;
1163786f2adSChristoph Hellwig 		dp3 += 8;
1173786f2adSChristoph Hellwig 		dp4 += 8;
1183786f2adSChristoph Hellwig 	} while (--lines > 0);
1193786f2adSChristoph Hellwig }
1203786f2adSChristoph Hellwig 
121*80dcf0a7SChristoph Hellwig static void __xor_neon_5(unsigned long bytes, unsigned long * __restrict p1,
1223786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
1233786f2adSChristoph Hellwig 		const unsigned long * __restrict p3,
1243786f2adSChristoph Hellwig 		const unsigned long * __restrict p4,
1253786f2adSChristoph Hellwig 		const unsigned long * __restrict p5)
1263786f2adSChristoph Hellwig {
1273786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
1283786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
1293786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
1303786f2adSChristoph Hellwig 	uint64_t *dp4 = (uint64_t *)p4;
1313786f2adSChristoph Hellwig 	uint64_t *dp5 = (uint64_t *)p5;
1323786f2adSChristoph Hellwig 
1333786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
1343786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
1353786f2adSChristoph Hellwig 
1363786f2adSChristoph Hellwig 	do {
1373786f2adSChristoph Hellwig 		/* p1 ^= p2 */
1383786f2adSChristoph Hellwig 		v0 = veorq_u64(vld1q_u64(dp1 +  0), vld1q_u64(dp2 +  0));
1393786f2adSChristoph Hellwig 		v1 = veorq_u64(vld1q_u64(dp1 +  2), vld1q_u64(dp2 +  2));
1403786f2adSChristoph Hellwig 		v2 = veorq_u64(vld1q_u64(dp1 +  4), vld1q_u64(dp2 +  4));
1413786f2adSChristoph Hellwig 		v3 = veorq_u64(vld1q_u64(dp1 +  6), vld1q_u64(dp2 +  6));
1423786f2adSChristoph Hellwig 
1433786f2adSChristoph Hellwig 		/* p1 ^= p3 */
1443786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp3 +  0));
1453786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp3 +  2));
1463786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp3 +  4));
1473786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp3 +  6));
1483786f2adSChristoph Hellwig 
1493786f2adSChristoph Hellwig 		/* p1 ^= p4 */
1503786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp4 +  0));
1513786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp4 +  2));
1523786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp4 +  4));
1533786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp4 +  6));
1543786f2adSChristoph Hellwig 
1553786f2adSChristoph Hellwig 		/* p1 ^= p5 */
1563786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp5 +  0));
1573786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp5 +  2));
1583786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp5 +  4));
1593786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp5 +  6));
1603786f2adSChristoph Hellwig 
1613786f2adSChristoph Hellwig 		/* store */
1623786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  0, v0);
1633786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  2, v1);
1643786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  4, v2);
1653786f2adSChristoph Hellwig 		vst1q_u64(dp1 +  6, v3);
1663786f2adSChristoph Hellwig 
1673786f2adSChristoph Hellwig 		dp1 += 8;
1683786f2adSChristoph Hellwig 		dp2 += 8;
1693786f2adSChristoph Hellwig 		dp3 += 8;
1703786f2adSChristoph Hellwig 		dp4 += 8;
1713786f2adSChristoph Hellwig 		dp5 += 8;
1723786f2adSChristoph Hellwig 	} while (--lines > 0);
1733786f2adSChristoph Hellwig }
1743786f2adSChristoph Hellwig 
175*80dcf0a7SChristoph Hellwig __DO_XOR_BLOCKS(neon_inner, __xor_neon_2, __xor_neon_3, __xor_neon_4,
176*80dcf0a7SChristoph Hellwig 		__xor_neon_5);
177*80dcf0a7SChristoph Hellwig 
1783786f2adSChristoph Hellwig static inline uint64x2_t eor3(uint64x2_t p, uint64x2_t q, uint64x2_t r)
1793786f2adSChristoph Hellwig {
1803786f2adSChristoph Hellwig 	uint64x2_t res;
1813786f2adSChristoph Hellwig 
1823786f2adSChristoph Hellwig 	asm(ARM64_ASM_PREAMBLE ".arch_extension sha3\n"
1833786f2adSChristoph Hellwig 	    "eor3 %0.16b, %1.16b, %2.16b, %3.16b"
1843786f2adSChristoph Hellwig 	    : "=w"(res) : "w"(p), "w"(q), "w"(r));
1853786f2adSChristoph Hellwig 	return res;
1863786f2adSChristoph Hellwig }
1873786f2adSChristoph Hellwig 
188*80dcf0a7SChristoph Hellwig static void __xor_eor3_3(unsigned long bytes, unsigned long * __restrict p1,
1893786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
1903786f2adSChristoph Hellwig 		const unsigned long * __restrict p3)
1913786f2adSChristoph Hellwig {
1923786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
1933786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
1943786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
1953786f2adSChristoph Hellwig 
1963786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
1973786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
1983786f2adSChristoph Hellwig 
1993786f2adSChristoph Hellwig 	do {
2003786f2adSChristoph Hellwig 		/* p1 ^= p2 ^ p3 */
2013786f2adSChristoph Hellwig 		v0 = eor3(vld1q_u64(dp1 + 0), vld1q_u64(dp2 + 0),
2023786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 0));
2033786f2adSChristoph Hellwig 		v1 = eor3(vld1q_u64(dp1 + 2), vld1q_u64(dp2 + 2),
2043786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 2));
2053786f2adSChristoph Hellwig 		v2 = eor3(vld1q_u64(dp1 + 4), vld1q_u64(dp2 + 4),
2063786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 4));
2073786f2adSChristoph Hellwig 		v3 = eor3(vld1q_u64(dp1 + 6), vld1q_u64(dp2 + 6),
2083786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 6));
2093786f2adSChristoph Hellwig 
2103786f2adSChristoph Hellwig 		/* store */
2113786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 0, v0);
2123786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 2, v1);
2133786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 4, v2);
2143786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 6, v3);
2153786f2adSChristoph Hellwig 
2163786f2adSChristoph Hellwig 		dp1 += 8;
2173786f2adSChristoph Hellwig 		dp2 += 8;
2183786f2adSChristoph Hellwig 		dp3 += 8;
2193786f2adSChristoph Hellwig 	} while (--lines > 0);
2203786f2adSChristoph Hellwig }
2213786f2adSChristoph Hellwig 
222*80dcf0a7SChristoph Hellwig static void __xor_eor3_4(unsigned long bytes, unsigned long * __restrict p1,
2233786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
2243786f2adSChristoph Hellwig 		const unsigned long * __restrict p3,
2253786f2adSChristoph Hellwig 		const unsigned long * __restrict p4)
2263786f2adSChristoph Hellwig {
2273786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
2283786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
2293786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
2303786f2adSChristoph Hellwig 	uint64_t *dp4 = (uint64_t *)p4;
2313786f2adSChristoph Hellwig 
2323786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
2333786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
2343786f2adSChristoph Hellwig 
2353786f2adSChristoph Hellwig 	do {
2363786f2adSChristoph Hellwig 		/* p1 ^= p2 ^ p3 */
2373786f2adSChristoph Hellwig 		v0 = eor3(vld1q_u64(dp1 + 0), vld1q_u64(dp2 + 0),
2383786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 0));
2393786f2adSChristoph Hellwig 		v1 = eor3(vld1q_u64(dp1 + 2), vld1q_u64(dp2 + 2),
2403786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 2));
2413786f2adSChristoph Hellwig 		v2 = eor3(vld1q_u64(dp1 + 4), vld1q_u64(dp2 + 4),
2423786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 4));
2433786f2adSChristoph Hellwig 		v3 = eor3(vld1q_u64(dp1 + 6), vld1q_u64(dp2 + 6),
2443786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 6));
2453786f2adSChristoph Hellwig 
2463786f2adSChristoph Hellwig 		/* p1 ^= p4 */
2473786f2adSChristoph Hellwig 		v0 = veorq_u64(v0, vld1q_u64(dp4 + 0));
2483786f2adSChristoph Hellwig 		v1 = veorq_u64(v1, vld1q_u64(dp4 + 2));
2493786f2adSChristoph Hellwig 		v2 = veorq_u64(v2, vld1q_u64(dp4 + 4));
2503786f2adSChristoph Hellwig 		v3 = veorq_u64(v3, vld1q_u64(dp4 + 6));
2513786f2adSChristoph Hellwig 
2523786f2adSChristoph Hellwig 		/* store */
2533786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 0, v0);
2543786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 2, v1);
2553786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 4, v2);
2563786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 6, v3);
2573786f2adSChristoph Hellwig 
2583786f2adSChristoph Hellwig 		dp1 += 8;
2593786f2adSChristoph Hellwig 		dp2 += 8;
2603786f2adSChristoph Hellwig 		dp3 += 8;
2613786f2adSChristoph Hellwig 		dp4 += 8;
2623786f2adSChristoph Hellwig 	} while (--lines > 0);
2633786f2adSChristoph Hellwig }
2643786f2adSChristoph Hellwig 
265*80dcf0a7SChristoph Hellwig static void __xor_eor3_5(unsigned long bytes, unsigned long * __restrict p1,
2663786f2adSChristoph Hellwig 		const unsigned long * __restrict p2,
2673786f2adSChristoph Hellwig 		const unsigned long * __restrict p3,
2683786f2adSChristoph Hellwig 		const unsigned long * __restrict p4,
2693786f2adSChristoph Hellwig 		const unsigned long * __restrict p5)
2703786f2adSChristoph Hellwig {
2713786f2adSChristoph Hellwig 	uint64_t *dp1 = (uint64_t *)p1;
2723786f2adSChristoph Hellwig 	uint64_t *dp2 = (uint64_t *)p2;
2733786f2adSChristoph Hellwig 	uint64_t *dp3 = (uint64_t *)p3;
2743786f2adSChristoph Hellwig 	uint64_t *dp4 = (uint64_t *)p4;
2753786f2adSChristoph Hellwig 	uint64_t *dp5 = (uint64_t *)p5;
2763786f2adSChristoph Hellwig 
2773786f2adSChristoph Hellwig 	register uint64x2_t v0, v1, v2, v3;
2783786f2adSChristoph Hellwig 	long lines = bytes / (sizeof(uint64x2_t) * 4);
2793786f2adSChristoph Hellwig 
2803786f2adSChristoph Hellwig 	do {
2813786f2adSChristoph Hellwig 		/* p1 ^= p2 ^ p3 */
2823786f2adSChristoph Hellwig 		v0 = eor3(vld1q_u64(dp1 + 0), vld1q_u64(dp2 + 0),
2833786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 0));
2843786f2adSChristoph Hellwig 		v1 = eor3(vld1q_u64(dp1 + 2), vld1q_u64(dp2 + 2),
2853786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 2));
2863786f2adSChristoph Hellwig 		v2 = eor3(vld1q_u64(dp1 + 4), vld1q_u64(dp2 + 4),
2873786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 4));
2883786f2adSChristoph Hellwig 		v3 = eor3(vld1q_u64(dp1 + 6), vld1q_u64(dp2 + 6),
2893786f2adSChristoph Hellwig 			  vld1q_u64(dp3 + 6));
2903786f2adSChristoph Hellwig 
2913786f2adSChristoph Hellwig 		/* p1 ^= p4 ^ p5 */
2923786f2adSChristoph Hellwig 		v0 = eor3(v0, vld1q_u64(dp4 + 0), vld1q_u64(dp5 + 0));
2933786f2adSChristoph Hellwig 		v1 = eor3(v1, vld1q_u64(dp4 + 2), vld1q_u64(dp5 + 2));
2943786f2adSChristoph Hellwig 		v2 = eor3(v2, vld1q_u64(dp4 + 4), vld1q_u64(dp5 + 4));
2953786f2adSChristoph Hellwig 		v3 = eor3(v3, vld1q_u64(dp4 + 6), vld1q_u64(dp5 + 6));
2963786f2adSChristoph Hellwig 
2973786f2adSChristoph Hellwig 		/* store */
2983786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 0, v0);
2993786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 2, v1);
3003786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 4, v2);
3013786f2adSChristoph Hellwig 		vst1q_u64(dp1 + 6, v3);
3023786f2adSChristoph Hellwig 
3033786f2adSChristoph Hellwig 		dp1 += 8;
3043786f2adSChristoph Hellwig 		dp2 += 8;
3053786f2adSChristoph Hellwig 		dp3 += 8;
3063786f2adSChristoph Hellwig 		dp4 += 8;
3073786f2adSChristoph Hellwig 		dp5 += 8;
3083786f2adSChristoph Hellwig 	} while (--lines > 0);
3093786f2adSChristoph Hellwig }
310*80dcf0a7SChristoph Hellwig 
311*80dcf0a7SChristoph Hellwig __DO_XOR_BLOCKS(eor3_inner, __xor_neon_2, __xor_eor3_3, __xor_eor3_4,
312*80dcf0a7SChristoph Hellwig 		__xor_eor3_5);
313