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_32regs_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 11c46928fdSChristoph Hellwig prefetchw(p1); 12c46928fdSChristoph Hellwig prefetch(p2); 13c46928fdSChristoph Hellwig 14c46928fdSChristoph Hellwig do { 15c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 16c46928fdSChristoph Hellwig 17c46928fdSChristoph Hellwig prefetchw(p1+8); 18c46928fdSChristoph Hellwig prefetch(p2+8); 19c46928fdSChristoph Hellwig once_more: 20c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 21c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 22c46928fdSChristoph Hellwig d2 = p1[2]; 23c46928fdSChristoph Hellwig d3 = p1[3]; 24c46928fdSChristoph Hellwig d4 = p1[4]; 25c46928fdSChristoph Hellwig d5 = p1[5]; 26c46928fdSChristoph Hellwig d6 = p1[6]; 27c46928fdSChristoph Hellwig d7 = p1[7]; 28c46928fdSChristoph Hellwig d0 ^= p2[0]; 29c46928fdSChristoph Hellwig d1 ^= p2[1]; 30c46928fdSChristoph Hellwig d2 ^= p2[2]; 31c46928fdSChristoph Hellwig d3 ^= p2[3]; 32c46928fdSChristoph Hellwig d4 ^= p2[4]; 33c46928fdSChristoph Hellwig d5 ^= p2[5]; 34c46928fdSChristoph Hellwig d6 ^= p2[6]; 35c46928fdSChristoph Hellwig d7 ^= p2[7]; 36c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 37c46928fdSChristoph Hellwig p1[1] = d1; 38c46928fdSChristoph Hellwig p1[2] = d2; 39c46928fdSChristoph Hellwig p1[3] = d3; 40c46928fdSChristoph Hellwig p1[4] = d4; 41c46928fdSChristoph Hellwig p1[5] = d5; 42c46928fdSChristoph Hellwig p1[6] = d6; 43c46928fdSChristoph Hellwig p1[7] = d7; 44c46928fdSChristoph Hellwig p1 += 8; 45c46928fdSChristoph Hellwig p2 += 8; 46c46928fdSChristoph Hellwig } while (--lines > 0); 47c46928fdSChristoph Hellwig if (lines == 0) 48c46928fdSChristoph Hellwig goto once_more; 49c46928fdSChristoph Hellwig } 50c46928fdSChristoph Hellwig 51c46928fdSChristoph Hellwig static void 52c46928fdSChristoph Hellwig xor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 53c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 54c46928fdSChristoph Hellwig const unsigned long * __restrict p3) 55c46928fdSChristoph Hellwig { 56c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 57c46928fdSChristoph Hellwig 58c46928fdSChristoph Hellwig prefetchw(p1); 59c46928fdSChristoph Hellwig prefetch(p2); 60c46928fdSChristoph Hellwig prefetch(p3); 61c46928fdSChristoph Hellwig 62c46928fdSChristoph Hellwig do { 63c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 64c46928fdSChristoph Hellwig 65c46928fdSChristoph Hellwig prefetchw(p1+8); 66c46928fdSChristoph Hellwig prefetch(p2+8); 67c46928fdSChristoph Hellwig prefetch(p3+8); 68c46928fdSChristoph Hellwig once_more: 69c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 70c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 71c46928fdSChristoph Hellwig d2 = p1[2]; 72c46928fdSChristoph Hellwig d3 = p1[3]; 73c46928fdSChristoph Hellwig d4 = p1[4]; 74c46928fdSChristoph Hellwig d5 = p1[5]; 75c46928fdSChristoph Hellwig d6 = p1[6]; 76c46928fdSChristoph Hellwig d7 = p1[7]; 77c46928fdSChristoph Hellwig d0 ^= p2[0]; 78c46928fdSChristoph Hellwig d1 ^= p2[1]; 79c46928fdSChristoph Hellwig d2 ^= p2[2]; 80c46928fdSChristoph Hellwig d3 ^= p2[3]; 81c46928fdSChristoph Hellwig d4 ^= p2[4]; 82c46928fdSChristoph Hellwig d5 ^= p2[5]; 83c46928fdSChristoph Hellwig d6 ^= p2[6]; 84c46928fdSChristoph Hellwig d7 ^= p2[7]; 85c46928fdSChristoph Hellwig d0 ^= p3[0]; 86c46928fdSChristoph Hellwig d1 ^= p3[1]; 87c46928fdSChristoph Hellwig d2 ^= p3[2]; 88c46928fdSChristoph Hellwig d3 ^= p3[3]; 89c46928fdSChristoph Hellwig d4 ^= p3[4]; 90c46928fdSChristoph Hellwig d5 ^= p3[5]; 91c46928fdSChristoph Hellwig d6 ^= p3[6]; 92c46928fdSChristoph Hellwig d7 ^= p3[7]; 93c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 94c46928fdSChristoph Hellwig p1[1] = d1; 95c46928fdSChristoph Hellwig p1[2] = d2; 96c46928fdSChristoph Hellwig p1[3] = d3; 97c46928fdSChristoph Hellwig p1[4] = d4; 98c46928fdSChristoph Hellwig p1[5] = d5; 99c46928fdSChristoph Hellwig p1[6] = d6; 100c46928fdSChristoph Hellwig p1[7] = d7; 101c46928fdSChristoph Hellwig p1 += 8; 102c46928fdSChristoph Hellwig p2 += 8; 103c46928fdSChristoph Hellwig p3 += 8; 104c46928fdSChristoph Hellwig } while (--lines > 0); 105c46928fdSChristoph Hellwig if (lines == 0) 106c46928fdSChristoph Hellwig goto once_more; 107c46928fdSChristoph Hellwig } 108c46928fdSChristoph Hellwig 109c46928fdSChristoph Hellwig static void 110c46928fdSChristoph Hellwig xor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 111c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 112c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 113c46928fdSChristoph Hellwig const unsigned long * __restrict p4) 114c46928fdSChristoph Hellwig { 115c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 116c46928fdSChristoph Hellwig 117c46928fdSChristoph Hellwig prefetchw(p1); 118c46928fdSChristoph Hellwig prefetch(p2); 119c46928fdSChristoph Hellwig prefetch(p3); 120c46928fdSChristoph Hellwig prefetch(p4); 121c46928fdSChristoph Hellwig 122c46928fdSChristoph Hellwig do { 123c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 124c46928fdSChristoph Hellwig 125c46928fdSChristoph Hellwig prefetchw(p1+8); 126c46928fdSChristoph Hellwig prefetch(p2+8); 127c46928fdSChristoph Hellwig prefetch(p3+8); 128c46928fdSChristoph Hellwig prefetch(p4+8); 129c46928fdSChristoph Hellwig once_more: 130c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 131c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 132c46928fdSChristoph Hellwig d2 = p1[2]; 133c46928fdSChristoph Hellwig d3 = p1[3]; 134c46928fdSChristoph Hellwig d4 = p1[4]; 135c46928fdSChristoph Hellwig d5 = p1[5]; 136c46928fdSChristoph Hellwig d6 = p1[6]; 137c46928fdSChristoph Hellwig d7 = p1[7]; 138c46928fdSChristoph Hellwig d0 ^= p2[0]; 139c46928fdSChristoph Hellwig d1 ^= p2[1]; 140c46928fdSChristoph Hellwig d2 ^= p2[2]; 141c46928fdSChristoph Hellwig d3 ^= p2[3]; 142c46928fdSChristoph Hellwig d4 ^= p2[4]; 143c46928fdSChristoph Hellwig d5 ^= p2[5]; 144c46928fdSChristoph Hellwig d6 ^= p2[6]; 145c46928fdSChristoph Hellwig d7 ^= p2[7]; 146c46928fdSChristoph Hellwig d0 ^= p3[0]; 147c46928fdSChristoph Hellwig d1 ^= p3[1]; 148c46928fdSChristoph Hellwig d2 ^= p3[2]; 149c46928fdSChristoph Hellwig d3 ^= p3[3]; 150c46928fdSChristoph Hellwig d4 ^= p3[4]; 151c46928fdSChristoph Hellwig d5 ^= p3[5]; 152c46928fdSChristoph Hellwig d6 ^= p3[6]; 153c46928fdSChristoph Hellwig d7 ^= p3[7]; 154c46928fdSChristoph Hellwig d0 ^= p4[0]; 155c46928fdSChristoph Hellwig d1 ^= p4[1]; 156c46928fdSChristoph Hellwig d2 ^= p4[2]; 157c46928fdSChristoph Hellwig d3 ^= p4[3]; 158c46928fdSChristoph Hellwig d4 ^= p4[4]; 159c46928fdSChristoph Hellwig d5 ^= p4[5]; 160c46928fdSChristoph Hellwig d6 ^= p4[6]; 161c46928fdSChristoph Hellwig d7 ^= p4[7]; 162c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 163c46928fdSChristoph Hellwig p1[1] = d1; 164c46928fdSChristoph Hellwig p1[2] = d2; 165c46928fdSChristoph Hellwig p1[3] = d3; 166c46928fdSChristoph Hellwig p1[4] = d4; 167c46928fdSChristoph Hellwig p1[5] = d5; 168c46928fdSChristoph Hellwig p1[6] = d6; 169c46928fdSChristoph Hellwig p1[7] = d7; 170c46928fdSChristoph Hellwig p1 += 8; 171c46928fdSChristoph Hellwig p2 += 8; 172c46928fdSChristoph Hellwig p3 += 8; 173c46928fdSChristoph Hellwig p4 += 8; 174c46928fdSChristoph Hellwig } while (--lines > 0); 175c46928fdSChristoph Hellwig if (lines == 0) 176c46928fdSChristoph Hellwig goto once_more; 177c46928fdSChristoph Hellwig } 178c46928fdSChristoph Hellwig 179c46928fdSChristoph Hellwig static void 180c46928fdSChristoph Hellwig xor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 181c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 182c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 183c46928fdSChristoph Hellwig const unsigned long * __restrict p4, 184c46928fdSChristoph Hellwig const unsigned long * __restrict p5) 185c46928fdSChristoph Hellwig { 186c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8 - 1; 187c46928fdSChristoph Hellwig 188c46928fdSChristoph Hellwig prefetchw(p1); 189c46928fdSChristoph Hellwig prefetch(p2); 190c46928fdSChristoph Hellwig prefetch(p3); 191c46928fdSChristoph Hellwig prefetch(p4); 192c46928fdSChristoph Hellwig prefetch(p5); 193c46928fdSChristoph Hellwig 194c46928fdSChristoph Hellwig do { 195c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 196c46928fdSChristoph Hellwig 197c46928fdSChristoph Hellwig prefetchw(p1+8); 198c46928fdSChristoph Hellwig prefetch(p2+8); 199c46928fdSChristoph Hellwig prefetch(p3+8); 200c46928fdSChristoph Hellwig prefetch(p4+8); 201c46928fdSChristoph Hellwig prefetch(p5+8); 202c46928fdSChristoph Hellwig once_more: 203c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 204c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 205c46928fdSChristoph Hellwig d2 = p1[2]; 206c46928fdSChristoph Hellwig d3 = p1[3]; 207c46928fdSChristoph Hellwig d4 = p1[4]; 208c46928fdSChristoph Hellwig d5 = p1[5]; 209c46928fdSChristoph Hellwig d6 = p1[6]; 210c46928fdSChristoph Hellwig d7 = p1[7]; 211c46928fdSChristoph Hellwig d0 ^= p2[0]; 212c46928fdSChristoph Hellwig d1 ^= p2[1]; 213c46928fdSChristoph Hellwig d2 ^= p2[2]; 214c46928fdSChristoph Hellwig d3 ^= p2[3]; 215c46928fdSChristoph Hellwig d4 ^= p2[4]; 216c46928fdSChristoph Hellwig d5 ^= p2[5]; 217c46928fdSChristoph Hellwig d6 ^= p2[6]; 218c46928fdSChristoph Hellwig d7 ^= p2[7]; 219c46928fdSChristoph Hellwig d0 ^= p3[0]; 220c46928fdSChristoph Hellwig d1 ^= p3[1]; 221c46928fdSChristoph Hellwig d2 ^= p3[2]; 222c46928fdSChristoph Hellwig d3 ^= p3[3]; 223c46928fdSChristoph Hellwig d4 ^= p3[4]; 224c46928fdSChristoph Hellwig d5 ^= p3[5]; 225c46928fdSChristoph Hellwig d6 ^= p3[6]; 226c46928fdSChristoph Hellwig d7 ^= p3[7]; 227c46928fdSChristoph Hellwig d0 ^= p4[0]; 228c46928fdSChristoph Hellwig d1 ^= p4[1]; 229c46928fdSChristoph Hellwig d2 ^= p4[2]; 230c46928fdSChristoph Hellwig d3 ^= p4[3]; 231c46928fdSChristoph Hellwig d4 ^= p4[4]; 232c46928fdSChristoph Hellwig d5 ^= p4[5]; 233c46928fdSChristoph Hellwig d6 ^= p4[6]; 234c46928fdSChristoph Hellwig d7 ^= p4[7]; 235c46928fdSChristoph Hellwig d0 ^= p5[0]; 236c46928fdSChristoph Hellwig d1 ^= p5[1]; 237c46928fdSChristoph Hellwig d2 ^= p5[2]; 238c46928fdSChristoph Hellwig d3 ^= p5[3]; 239c46928fdSChristoph Hellwig d4 ^= p5[4]; 240c46928fdSChristoph Hellwig d5 ^= p5[5]; 241c46928fdSChristoph Hellwig d6 ^= p5[6]; 242c46928fdSChristoph Hellwig d7 ^= p5[7]; 243c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 244c46928fdSChristoph Hellwig p1[1] = d1; 245c46928fdSChristoph Hellwig p1[2] = d2; 246c46928fdSChristoph Hellwig p1[3] = d3; 247c46928fdSChristoph Hellwig p1[4] = d4; 248c46928fdSChristoph Hellwig p1[5] = d5; 249c46928fdSChristoph Hellwig p1[6] = d6; 250c46928fdSChristoph Hellwig p1[7] = d7; 251c46928fdSChristoph Hellwig p1 += 8; 252c46928fdSChristoph Hellwig p2 += 8; 253c46928fdSChristoph Hellwig p3 += 8; 254c46928fdSChristoph Hellwig p4 += 8; 255c46928fdSChristoph Hellwig p5 += 8; 256c46928fdSChristoph Hellwig } while (--lines > 0); 257c46928fdSChristoph Hellwig if (lines == 0) 258c46928fdSChristoph Hellwig goto once_more; 259c46928fdSChristoph Hellwig } 260c46928fdSChristoph Hellwig 261*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(32regs_p, xor_32regs_p_2, xor_32regs_p_3, xor_32regs_p_4, 262*80dcf0a7SChristoph Hellwig xor_32regs_p_5); 263*80dcf0a7SChristoph Hellwig 264c46928fdSChristoph Hellwig struct xor_block_template xor_block_32regs_p = { 265c46928fdSChristoph Hellwig .name = "32regs_prefetch", 266*80dcf0a7SChristoph Hellwig .xor_gen = xor_gen_32regs_p, 267c46928fdSChristoph Hellwig }; 268