1c46928fdSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later 2c46928fdSChristoph Hellwig #include <linux/prefetch.h> 3e20043b4SChristoph Hellwig #include "xor_impl.h" 4c46928fdSChristoph Hellwig 5c46928fdSChristoph Hellwig static void 6c46928fdSChristoph Hellwig xor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1, 7c46928fdSChristoph Hellwig const unsigned long * __restrict p2) 8c46928fdSChristoph Hellwig { 9c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 10c46928fdSChristoph Hellwig prefetchw(p1); 11c46928fdSChristoph Hellwig prefetch(p2); 12c46928fdSChristoph Hellwig 13c46928fdSChristoph Hellwig do { 14c46928fdSChristoph Hellwig prefetchw(p1+8); 15c46928fdSChristoph Hellwig prefetch(p2+8); 16c46928fdSChristoph Hellwig once_more: 17c46928fdSChristoph Hellwig p1[0] ^= p2[0]; 18c46928fdSChristoph Hellwig p1[1] ^= p2[1]; 19c46928fdSChristoph Hellwig p1[2] ^= p2[2]; 20c46928fdSChristoph Hellwig p1[3] ^= p2[3]; 21c46928fdSChristoph Hellwig p1[4] ^= p2[4]; 22c46928fdSChristoph Hellwig p1[5] ^= p2[5]; 23c46928fdSChristoph Hellwig p1[6] ^= p2[6]; 24c46928fdSChristoph Hellwig p1[7] ^= p2[7]; 25c46928fdSChristoph Hellwig p1 += 8; 26c46928fdSChristoph Hellwig p2 += 8; 27c46928fdSChristoph Hellwig } while (--lines > 0); 28c46928fdSChristoph Hellwig if (lines == 0) 29c46928fdSChristoph Hellwig goto once_more; 30c46928fdSChristoph Hellwig } 31c46928fdSChristoph Hellwig 32c46928fdSChristoph Hellwig static void 33c46928fdSChristoph Hellwig xor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 34c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 35c46928fdSChristoph Hellwig const unsigned long * __restrict p3) 36c46928fdSChristoph Hellwig { 37c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 38c46928fdSChristoph Hellwig prefetchw(p1); 39c46928fdSChristoph Hellwig prefetch(p2); 40c46928fdSChristoph Hellwig prefetch(p3); 41c46928fdSChristoph Hellwig 42c46928fdSChristoph Hellwig do { 43c46928fdSChristoph Hellwig prefetchw(p1+8); 44c46928fdSChristoph Hellwig prefetch(p2+8); 45c46928fdSChristoph Hellwig prefetch(p3+8); 46c46928fdSChristoph Hellwig once_more: 47c46928fdSChristoph Hellwig p1[0] ^= p2[0] ^ p3[0]; 48c46928fdSChristoph Hellwig p1[1] ^= p2[1] ^ p3[1]; 49c46928fdSChristoph Hellwig p1[2] ^= p2[2] ^ p3[2]; 50c46928fdSChristoph Hellwig p1[3] ^= p2[3] ^ p3[3]; 51c46928fdSChristoph Hellwig p1[4] ^= p2[4] ^ p3[4]; 52c46928fdSChristoph Hellwig p1[5] ^= p2[5] ^ p3[5]; 53c46928fdSChristoph Hellwig p1[6] ^= p2[6] ^ p3[6]; 54c46928fdSChristoph Hellwig p1[7] ^= p2[7] ^ p3[7]; 55c46928fdSChristoph Hellwig p1 += 8; 56c46928fdSChristoph Hellwig p2 += 8; 57c46928fdSChristoph Hellwig p3 += 8; 58c46928fdSChristoph Hellwig } while (--lines > 0); 59c46928fdSChristoph Hellwig if (lines == 0) 60c46928fdSChristoph Hellwig goto once_more; 61c46928fdSChristoph Hellwig } 62c46928fdSChristoph Hellwig 63c46928fdSChristoph Hellwig static void 64c46928fdSChristoph Hellwig xor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 65c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 66c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 67c46928fdSChristoph Hellwig const unsigned long * __restrict p4) 68c46928fdSChristoph Hellwig { 69c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 70c46928fdSChristoph Hellwig 71c46928fdSChristoph Hellwig prefetchw(p1); 72c46928fdSChristoph Hellwig prefetch(p2); 73c46928fdSChristoph Hellwig prefetch(p3); 74c46928fdSChristoph Hellwig prefetch(p4); 75c46928fdSChristoph Hellwig 76c46928fdSChristoph Hellwig do { 77c46928fdSChristoph Hellwig prefetchw(p1+8); 78c46928fdSChristoph Hellwig prefetch(p2+8); 79c46928fdSChristoph Hellwig prefetch(p3+8); 80c46928fdSChristoph Hellwig prefetch(p4+8); 81c46928fdSChristoph Hellwig once_more: 82c46928fdSChristoph Hellwig p1[0] ^= p2[0] ^ p3[0] ^ p4[0]; 83c46928fdSChristoph Hellwig p1[1] ^= p2[1] ^ p3[1] ^ p4[1]; 84c46928fdSChristoph Hellwig p1[2] ^= p2[2] ^ p3[2] ^ p4[2]; 85c46928fdSChristoph Hellwig p1[3] ^= p2[3] ^ p3[3] ^ p4[3]; 86c46928fdSChristoph Hellwig p1[4] ^= p2[4] ^ p3[4] ^ p4[4]; 87c46928fdSChristoph Hellwig p1[5] ^= p2[5] ^ p3[5] ^ p4[5]; 88c46928fdSChristoph Hellwig p1[6] ^= p2[6] ^ p3[6] ^ p4[6]; 89c46928fdSChristoph Hellwig p1[7] ^= p2[7] ^ p3[7] ^ p4[7]; 90c46928fdSChristoph Hellwig p1 += 8; 91c46928fdSChristoph Hellwig p2 += 8; 92c46928fdSChristoph Hellwig p3 += 8; 93c46928fdSChristoph Hellwig p4 += 8; 94c46928fdSChristoph Hellwig } while (--lines > 0); 95c46928fdSChristoph Hellwig if (lines == 0) 96c46928fdSChristoph Hellwig goto once_more; 97c46928fdSChristoph Hellwig } 98c46928fdSChristoph Hellwig 99c46928fdSChristoph Hellwig static void 100c46928fdSChristoph Hellwig xor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 101c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 102c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 103c46928fdSChristoph Hellwig const unsigned long * __restrict p4, 104c46928fdSChristoph Hellwig const unsigned long * __restrict p5) 105c46928fdSChristoph Hellwig { 106c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 107c46928fdSChristoph Hellwig 108c46928fdSChristoph Hellwig prefetchw(p1); 109c46928fdSChristoph Hellwig prefetch(p2); 110c46928fdSChristoph Hellwig prefetch(p3); 111c46928fdSChristoph Hellwig prefetch(p4); 112c46928fdSChristoph Hellwig prefetch(p5); 113c46928fdSChristoph Hellwig 114c46928fdSChristoph Hellwig do { 115c46928fdSChristoph Hellwig prefetchw(p1+8); 116c46928fdSChristoph Hellwig prefetch(p2+8); 117c46928fdSChristoph Hellwig prefetch(p3+8); 118c46928fdSChristoph Hellwig prefetch(p4+8); 119c46928fdSChristoph Hellwig prefetch(p5+8); 120c46928fdSChristoph Hellwig once_more: 121c46928fdSChristoph Hellwig p1[0] ^= p2[0] ^ p3[0] ^ p4[0] ^ p5[0]; 122c46928fdSChristoph Hellwig p1[1] ^= p2[1] ^ p3[1] ^ p4[1] ^ p5[1]; 123c46928fdSChristoph Hellwig p1[2] ^= p2[2] ^ p3[2] ^ p4[2] ^ p5[2]; 124c46928fdSChristoph Hellwig p1[3] ^= p2[3] ^ p3[3] ^ p4[3] ^ p5[3]; 125c46928fdSChristoph Hellwig p1[4] ^= p2[4] ^ p3[4] ^ p4[4] ^ p5[4]; 126c46928fdSChristoph Hellwig p1[5] ^= p2[5] ^ p3[5] ^ p4[5] ^ p5[5]; 127c46928fdSChristoph Hellwig p1[6] ^= p2[6] ^ p3[6] ^ p4[6] ^ p5[6]; 128c46928fdSChristoph Hellwig p1[7] ^= p2[7] ^ p3[7] ^ p4[7] ^ p5[7]; 129c46928fdSChristoph Hellwig p1 += 8; 130c46928fdSChristoph Hellwig p2 += 8; 131c46928fdSChristoph Hellwig p3 += 8; 132c46928fdSChristoph Hellwig p4 += 8; 133c46928fdSChristoph Hellwig p5 += 8; 134c46928fdSChristoph Hellwig } while (--lines > 0); 135c46928fdSChristoph Hellwig if (lines == 0) 136c46928fdSChristoph Hellwig goto once_more; 137c46928fdSChristoph Hellwig } 138c46928fdSChristoph Hellwig 139*80dcf0a7SChristoph Hellwig 140*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(8regs_p, xor_8regs_p_2, xor_8regs_p_3, xor_8regs_p_4, 141*80dcf0a7SChristoph Hellwig xor_8regs_p_5); 142*80dcf0a7SChristoph Hellwig 143c46928fdSChristoph Hellwig struct xor_block_template xor_block_8regs_p = { 144c46928fdSChristoph Hellwig .name = "8regs_prefetch", 145*80dcf0a7SChristoph Hellwig .xor_gen = xor_gen_8regs_p, 146c46928fdSChristoph Hellwig }; 147