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