xref: /linux/lib/raid/xor/sparc/xor-sparc32.c (revision 440d6635b20037bc9ad46b20817d7b61cef0fc1b)
17f963623SChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later
27f963623SChristoph Hellwig /*
37f963623SChristoph Hellwig  * High speed xor_block operation for RAID4/5 utilizing the
47f963623SChristoph Hellwig  * ldd/std SPARC instructions.
57f963623SChristoph Hellwig  *
67f963623SChristoph Hellwig  * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
77f963623SChristoph Hellwig  */
8e20043b4SChristoph Hellwig #include "xor_impl.h"
9e20043b4SChristoph Hellwig #include "xor_arch.h"
107f963623SChristoph Hellwig 
117f963623SChristoph Hellwig static void
127f963623SChristoph Hellwig sparc_2(unsigned long bytes, unsigned long * __restrict p1,
137f963623SChristoph Hellwig 	const unsigned long * __restrict p2)
147f963623SChristoph Hellwig {
157f963623SChristoph Hellwig 	int lines = bytes / (sizeof (long)) / 8;
167f963623SChristoph Hellwig 
177f963623SChristoph Hellwig 	do {
187f963623SChristoph Hellwig 		__asm__ __volatile__(
197f963623SChristoph Hellwig 		  "ldd [%0 + 0x00], %%g2\n\t"
207f963623SChristoph Hellwig 		  "ldd [%0 + 0x08], %%g4\n\t"
217f963623SChristoph Hellwig 		  "ldd [%0 + 0x10], %%o0\n\t"
227f963623SChristoph Hellwig 		  "ldd [%0 + 0x18], %%o2\n\t"
237f963623SChristoph Hellwig 		  "ldd [%1 + 0x00], %%o4\n\t"
247f963623SChristoph Hellwig 		  "ldd [%1 + 0x08], %%l0\n\t"
257f963623SChristoph Hellwig 		  "ldd [%1 + 0x10], %%l2\n\t"
267f963623SChristoph Hellwig 		  "ldd [%1 + 0x18], %%l4\n\t"
277f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
287f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
297f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
307f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
317f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
327f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
337f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
347f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
357f963623SChristoph Hellwig 		  "std %%g2, [%0 + 0x00]\n\t"
367f963623SChristoph Hellwig 		  "std %%g4, [%0 + 0x08]\n\t"
377f963623SChristoph Hellwig 		  "std %%o0, [%0 + 0x10]\n\t"
387f963623SChristoph Hellwig 		  "std %%o2, [%0 + 0x18]\n"
397f963623SChristoph Hellwig 		:
407f963623SChristoph Hellwig 		: "r" (p1), "r" (p2)
417f963623SChristoph Hellwig 		: "g2", "g3", "g4", "g5",
427f963623SChristoph Hellwig 		  "o0", "o1", "o2", "o3", "o4", "o5",
437f963623SChristoph Hellwig 		  "l0", "l1", "l2", "l3", "l4", "l5");
447f963623SChristoph Hellwig 		p1 += 8;
457f963623SChristoph Hellwig 		p2 += 8;
467f963623SChristoph Hellwig 	} while (--lines > 0);
477f963623SChristoph Hellwig }
487f963623SChristoph Hellwig 
497f963623SChristoph Hellwig static void
507f963623SChristoph Hellwig sparc_3(unsigned long bytes, unsigned long * __restrict p1,
517f963623SChristoph Hellwig 	const unsigned long * __restrict p2,
527f963623SChristoph Hellwig 	const unsigned long * __restrict p3)
537f963623SChristoph Hellwig {
547f963623SChristoph Hellwig 	int lines = bytes / (sizeof (long)) / 8;
557f963623SChristoph Hellwig 
567f963623SChristoph Hellwig 	do {
577f963623SChristoph Hellwig 		__asm__ __volatile__(
587f963623SChristoph Hellwig 		  "ldd [%0 + 0x00], %%g2\n\t"
597f963623SChristoph Hellwig 		  "ldd [%0 + 0x08], %%g4\n\t"
607f963623SChristoph Hellwig 		  "ldd [%0 + 0x10], %%o0\n\t"
617f963623SChristoph Hellwig 		  "ldd [%0 + 0x18], %%o2\n\t"
627f963623SChristoph Hellwig 		  "ldd [%1 + 0x00], %%o4\n\t"
637f963623SChristoph Hellwig 		  "ldd [%1 + 0x08], %%l0\n\t"
647f963623SChristoph Hellwig 		  "ldd [%1 + 0x10], %%l2\n\t"
657f963623SChristoph Hellwig 		  "ldd [%1 + 0x18], %%l4\n\t"
667f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
677f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
687f963623SChristoph Hellwig 		  "ldd [%2 + 0x00], %%o4\n\t"
697f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
707f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
717f963623SChristoph Hellwig 		  "ldd [%2 + 0x08], %%l0\n\t"
727f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
737f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
747f963623SChristoph Hellwig 		  "ldd [%2 + 0x10], %%l2\n\t"
757f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
767f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
777f963623SChristoph Hellwig 		  "ldd [%2 + 0x18], %%l4\n\t"
787f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
797f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
807f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
817f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
827f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
837f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
847f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
857f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
867f963623SChristoph Hellwig 		  "std %%g2, [%0 + 0x00]\n\t"
877f963623SChristoph Hellwig 		  "std %%g4, [%0 + 0x08]\n\t"
887f963623SChristoph Hellwig 		  "std %%o0, [%0 + 0x10]\n\t"
897f963623SChristoph Hellwig 		  "std %%o2, [%0 + 0x18]\n"
907f963623SChristoph Hellwig 		:
917f963623SChristoph Hellwig 		: "r" (p1), "r" (p2), "r" (p3)
927f963623SChristoph Hellwig 		: "g2", "g3", "g4", "g5",
937f963623SChristoph Hellwig 		  "o0", "o1", "o2", "o3", "o4", "o5",
947f963623SChristoph Hellwig 		  "l0", "l1", "l2", "l3", "l4", "l5");
957f963623SChristoph Hellwig 		p1 += 8;
967f963623SChristoph Hellwig 		p2 += 8;
977f963623SChristoph Hellwig 		p3 += 8;
987f963623SChristoph Hellwig 	} while (--lines > 0);
997f963623SChristoph Hellwig }
1007f963623SChristoph Hellwig 
1017f963623SChristoph Hellwig static void
1027f963623SChristoph Hellwig sparc_4(unsigned long bytes, unsigned long * __restrict p1,
1037f963623SChristoph Hellwig 	const unsigned long * __restrict p2,
1047f963623SChristoph Hellwig 	const unsigned long * __restrict p3,
1057f963623SChristoph Hellwig 	const unsigned long * __restrict p4)
1067f963623SChristoph Hellwig {
1077f963623SChristoph Hellwig 	int lines = bytes / (sizeof (long)) / 8;
1087f963623SChristoph Hellwig 
1097f963623SChristoph Hellwig 	do {
1107f963623SChristoph Hellwig 		__asm__ __volatile__(
1117f963623SChristoph Hellwig 		  "ldd [%0 + 0x00], %%g2\n\t"
1127f963623SChristoph Hellwig 		  "ldd [%0 + 0x08], %%g4\n\t"
1137f963623SChristoph Hellwig 		  "ldd [%0 + 0x10], %%o0\n\t"
1147f963623SChristoph Hellwig 		  "ldd [%0 + 0x18], %%o2\n\t"
1157f963623SChristoph Hellwig 		  "ldd [%1 + 0x00], %%o4\n\t"
1167f963623SChristoph Hellwig 		  "ldd [%1 + 0x08], %%l0\n\t"
1177f963623SChristoph Hellwig 		  "ldd [%1 + 0x10], %%l2\n\t"
1187f963623SChristoph Hellwig 		  "ldd [%1 + 0x18], %%l4\n\t"
1197f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
1207f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
1217f963623SChristoph Hellwig 		  "ldd [%2 + 0x00], %%o4\n\t"
1227f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
1237f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
1247f963623SChristoph Hellwig 		  "ldd [%2 + 0x08], %%l0\n\t"
1257f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
1267f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
1277f963623SChristoph Hellwig 		  "ldd [%2 + 0x10], %%l2\n\t"
1287f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
1297f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
1307f963623SChristoph Hellwig 		  "ldd [%2 + 0x18], %%l4\n\t"
1317f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
1327f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
1337f963623SChristoph Hellwig 		  "ldd [%3 + 0x00], %%o4\n\t"
1347f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
1357f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
1367f963623SChristoph Hellwig 		  "ldd [%3 + 0x08], %%l0\n\t"
1377f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
1387f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
1397f963623SChristoph Hellwig 		  "ldd [%3 + 0x10], %%l2\n\t"
1407f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
1417f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
1427f963623SChristoph Hellwig 		  "ldd [%3 + 0x18], %%l4\n\t"
1437f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
1447f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
1457f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
1467f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
1477f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
1487f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
1497f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
1507f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
1517f963623SChristoph Hellwig 		  "std %%g2, [%0 + 0x00]\n\t"
1527f963623SChristoph Hellwig 		  "std %%g4, [%0 + 0x08]\n\t"
1537f963623SChristoph Hellwig 		  "std %%o0, [%0 + 0x10]\n\t"
1547f963623SChristoph Hellwig 		  "std %%o2, [%0 + 0x18]\n"
1557f963623SChristoph Hellwig 		:
1567f963623SChristoph Hellwig 		: "r" (p1), "r" (p2), "r" (p3), "r" (p4)
1577f963623SChristoph Hellwig 		: "g2", "g3", "g4", "g5",
1587f963623SChristoph Hellwig 		  "o0", "o1", "o2", "o3", "o4", "o5",
1597f963623SChristoph Hellwig 		  "l0", "l1", "l2", "l3", "l4", "l5");
1607f963623SChristoph Hellwig 		p1 += 8;
1617f963623SChristoph Hellwig 		p2 += 8;
1627f963623SChristoph Hellwig 		p3 += 8;
1637f963623SChristoph Hellwig 		p4 += 8;
1647f963623SChristoph Hellwig 	} while (--lines > 0);
1657f963623SChristoph Hellwig }
1667f963623SChristoph Hellwig 
1677f963623SChristoph Hellwig static void
1687f963623SChristoph Hellwig sparc_5(unsigned long bytes, unsigned long * __restrict p1,
1697f963623SChristoph Hellwig 	const unsigned long * __restrict p2,
1707f963623SChristoph Hellwig 	const unsigned long * __restrict p3,
1717f963623SChristoph Hellwig 	const unsigned long * __restrict p4,
1727f963623SChristoph Hellwig 	const unsigned long * __restrict p5)
1737f963623SChristoph Hellwig {
1747f963623SChristoph Hellwig 	int lines = bytes / (sizeof (long)) / 8;
1757f963623SChristoph Hellwig 
1767f963623SChristoph Hellwig 	do {
1777f963623SChristoph Hellwig 		__asm__ __volatile__(
1787f963623SChristoph Hellwig 		  "ldd [%0 + 0x00], %%g2\n\t"
1797f963623SChristoph Hellwig 		  "ldd [%0 + 0x08], %%g4\n\t"
1807f963623SChristoph Hellwig 		  "ldd [%0 + 0x10], %%o0\n\t"
1817f963623SChristoph Hellwig 		  "ldd [%0 + 0x18], %%o2\n\t"
1827f963623SChristoph Hellwig 		  "ldd [%1 + 0x00], %%o4\n\t"
1837f963623SChristoph Hellwig 		  "ldd [%1 + 0x08], %%l0\n\t"
1847f963623SChristoph Hellwig 		  "ldd [%1 + 0x10], %%l2\n\t"
1857f963623SChristoph Hellwig 		  "ldd [%1 + 0x18], %%l4\n\t"
1867f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
1877f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
1887f963623SChristoph Hellwig 		  "ldd [%2 + 0x00], %%o4\n\t"
1897f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
1907f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
1917f963623SChristoph Hellwig 		  "ldd [%2 + 0x08], %%l0\n\t"
1927f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
1937f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
1947f963623SChristoph Hellwig 		  "ldd [%2 + 0x10], %%l2\n\t"
1957f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
1967f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
1977f963623SChristoph Hellwig 		  "ldd [%2 + 0x18], %%l4\n\t"
1987f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
1997f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
2007f963623SChristoph Hellwig 		  "ldd [%3 + 0x00], %%o4\n\t"
2017f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
2027f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
2037f963623SChristoph Hellwig 		  "ldd [%3 + 0x08], %%l0\n\t"
2047f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
2057f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
2067f963623SChristoph Hellwig 		  "ldd [%3 + 0x10], %%l2\n\t"
2077f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
2087f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
2097f963623SChristoph Hellwig 		  "ldd [%3 + 0x18], %%l4\n\t"
2107f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
2117f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
2127f963623SChristoph Hellwig 		  "ldd [%4 + 0x00], %%o4\n\t"
2137f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
2147f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
2157f963623SChristoph Hellwig 		  "ldd [%4 + 0x08], %%l0\n\t"
2167f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
2177f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
2187f963623SChristoph Hellwig 		  "ldd [%4 + 0x10], %%l2\n\t"
2197f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
2207f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
2217f963623SChristoph Hellwig 		  "ldd [%4 + 0x18], %%l4\n\t"
2227f963623SChristoph Hellwig 		  "xor %%g2, %%o4, %%g2\n\t"
2237f963623SChristoph Hellwig 		  "xor %%g3, %%o5, %%g3\n\t"
2247f963623SChristoph Hellwig 		  "xor %%g4, %%l0, %%g4\n\t"
2257f963623SChristoph Hellwig 		  "xor %%g5, %%l1, %%g5\n\t"
2267f963623SChristoph Hellwig 		  "xor %%o0, %%l2, %%o0\n\t"
2277f963623SChristoph Hellwig 		  "xor %%o1, %%l3, %%o1\n\t"
2287f963623SChristoph Hellwig 		  "xor %%o2, %%l4, %%o2\n\t"
2297f963623SChristoph Hellwig 		  "xor %%o3, %%l5, %%o3\n\t"
2307f963623SChristoph Hellwig 		  "std %%g2, [%0 + 0x00]\n\t"
2317f963623SChristoph Hellwig 		  "std %%g4, [%0 + 0x08]\n\t"
2327f963623SChristoph Hellwig 		  "std %%o0, [%0 + 0x10]\n\t"
2337f963623SChristoph Hellwig 		  "std %%o2, [%0 + 0x18]\n"
2347f963623SChristoph Hellwig 		:
2357f963623SChristoph Hellwig 		: "r" (p1), "r" (p2), "r" (p3), "r" (p4), "r" (p5)
2367f963623SChristoph Hellwig 		: "g2", "g3", "g4", "g5",
2377f963623SChristoph Hellwig 		  "o0", "o1", "o2", "o3", "o4", "o5",
2387f963623SChristoph Hellwig 		  "l0", "l1", "l2", "l3", "l4", "l5");
2397f963623SChristoph Hellwig 		p1 += 8;
2407f963623SChristoph Hellwig 		p2 += 8;
2417f963623SChristoph Hellwig 		p3 += 8;
2427f963623SChristoph Hellwig 		p4 += 8;
2437f963623SChristoph Hellwig 		p5 += 8;
2447f963623SChristoph Hellwig 	} while (--lines > 0);
2457f963623SChristoph Hellwig }
2467f963623SChristoph Hellwig 
247*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(sparc32, sparc_2, sparc_3, sparc_4, sparc_5);
248*80dcf0a7SChristoph Hellwig 
2497f963623SChristoph Hellwig struct xor_block_template xor_block_SPARC = {
2507f963623SChristoph Hellwig 	.name		= "SPARC",
251*80dcf0a7SChristoph Hellwig 	.xor_gen	= xor_gen_sparc32,
2527f963623SChristoph Hellwig };
253