1c46928fdSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-or-later 2e20043b4SChristoph Hellwig #include "xor_impl.h" 3c46928fdSChristoph Hellwig 4c46928fdSChristoph Hellwig static void 5c46928fdSChristoph Hellwig xor_32regs_2(unsigned long bytes, unsigned long * __restrict p1, 6c46928fdSChristoph Hellwig const unsigned long * __restrict p2) 7c46928fdSChristoph Hellwig { 8c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8; 9c46928fdSChristoph Hellwig 10c46928fdSChristoph Hellwig do { 11c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 12c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 13c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 14c46928fdSChristoph Hellwig d2 = p1[2]; 15c46928fdSChristoph Hellwig d3 = p1[3]; 16c46928fdSChristoph Hellwig d4 = p1[4]; 17c46928fdSChristoph Hellwig d5 = p1[5]; 18c46928fdSChristoph Hellwig d6 = p1[6]; 19c46928fdSChristoph Hellwig d7 = p1[7]; 20c46928fdSChristoph Hellwig d0 ^= p2[0]; 21c46928fdSChristoph Hellwig d1 ^= p2[1]; 22c46928fdSChristoph Hellwig d2 ^= p2[2]; 23c46928fdSChristoph Hellwig d3 ^= p2[3]; 24c46928fdSChristoph Hellwig d4 ^= p2[4]; 25c46928fdSChristoph Hellwig d5 ^= p2[5]; 26c46928fdSChristoph Hellwig d6 ^= p2[6]; 27c46928fdSChristoph Hellwig d7 ^= p2[7]; 28c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 29c46928fdSChristoph Hellwig p1[1] = d1; 30c46928fdSChristoph Hellwig p1[2] = d2; 31c46928fdSChristoph Hellwig p1[3] = d3; 32c46928fdSChristoph Hellwig p1[4] = d4; 33c46928fdSChristoph Hellwig p1[5] = d5; 34c46928fdSChristoph Hellwig p1[6] = d6; 35c46928fdSChristoph Hellwig p1[7] = d7; 36c46928fdSChristoph Hellwig p1 += 8; 37c46928fdSChristoph Hellwig p2 += 8; 38c46928fdSChristoph Hellwig } while (--lines > 0); 39c46928fdSChristoph Hellwig } 40c46928fdSChristoph Hellwig 41c46928fdSChristoph Hellwig static void 42c46928fdSChristoph Hellwig xor_32regs_3(unsigned long bytes, unsigned long * __restrict p1, 43c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 44c46928fdSChristoph Hellwig const unsigned long * __restrict p3) 45c46928fdSChristoph Hellwig { 46c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8; 47c46928fdSChristoph Hellwig 48c46928fdSChristoph Hellwig do { 49c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 50c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 51c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 52c46928fdSChristoph Hellwig d2 = p1[2]; 53c46928fdSChristoph Hellwig d3 = p1[3]; 54c46928fdSChristoph Hellwig d4 = p1[4]; 55c46928fdSChristoph Hellwig d5 = p1[5]; 56c46928fdSChristoph Hellwig d6 = p1[6]; 57c46928fdSChristoph Hellwig d7 = p1[7]; 58c46928fdSChristoph Hellwig d0 ^= p2[0]; 59c46928fdSChristoph Hellwig d1 ^= p2[1]; 60c46928fdSChristoph Hellwig d2 ^= p2[2]; 61c46928fdSChristoph Hellwig d3 ^= p2[3]; 62c46928fdSChristoph Hellwig d4 ^= p2[4]; 63c46928fdSChristoph Hellwig d5 ^= p2[5]; 64c46928fdSChristoph Hellwig d6 ^= p2[6]; 65c46928fdSChristoph Hellwig d7 ^= p2[7]; 66c46928fdSChristoph Hellwig d0 ^= p3[0]; 67c46928fdSChristoph Hellwig d1 ^= p3[1]; 68c46928fdSChristoph Hellwig d2 ^= p3[2]; 69c46928fdSChristoph Hellwig d3 ^= p3[3]; 70c46928fdSChristoph Hellwig d4 ^= p3[4]; 71c46928fdSChristoph Hellwig d5 ^= p3[5]; 72c46928fdSChristoph Hellwig d6 ^= p3[6]; 73c46928fdSChristoph Hellwig d7 ^= p3[7]; 74c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 75c46928fdSChristoph Hellwig p1[1] = d1; 76c46928fdSChristoph Hellwig p1[2] = d2; 77c46928fdSChristoph Hellwig p1[3] = d3; 78c46928fdSChristoph Hellwig p1[4] = d4; 79c46928fdSChristoph Hellwig p1[5] = d5; 80c46928fdSChristoph Hellwig p1[6] = d6; 81c46928fdSChristoph Hellwig p1[7] = d7; 82c46928fdSChristoph Hellwig p1 += 8; 83c46928fdSChristoph Hellwig p2 += 8; 84c46928fdSChristoph Hellwig p3 += 8; 85c46928fdSChristoph Hellwig } while (--lines > 0); 86c46928fdSChristoph Hellwig } 87c46928fdSChristoph Hellwig 88c46928fdSChristoph Hellwig static void 89c46928fdSChristoph Hellwig xor_32regs_4(unsigned long bytes, unsigned long * __restrict p1, 90c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 91c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 92c46928fdSChristoph Hellwig const unsigned long * __restrict p4) 93c46928fdSChristoph Hellwig { 94c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8; 95c46928fdSChristoph Hellwig 96c46928fdSChristoph Hellwig do { 97c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 98c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 99c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 100c46928fdSChristoph Hellwig d2 = p1[2]; 101c46928fdSChristoph Hellwig d3 = p1[3]; 102c46928fdSChristoph Hellwig d4 = p1[4]; 103c46928fdSChristoph Hellwig d5 = p1[5]; 104c46928fdSChristoph Hellwig d6 = p1[6]; 105c46928fdSChristoph Hellwig d7 = p1[7]; 106c46928fdSChristoph Hellwig d0 ^= p2[0]; 107c46928fdSChristoph Hellwig d1 ^= p2[1]; 108c46928fdSChristoph Hellwig d2 ^= p2[2]; 109c46928fdSChristoph Hellwig d3 ^= p2[3]; 110c46928fdSChristoph Hellwig d4 ^= p2[4]; 111c46928fdSChristoph Hellwig d5 ^= p2[5]; 112c46928fdSChristoph Hellwig d6 ^= p2[6]; 113c46928fdSChristoph Hellwig d7 ^= p2[7]; 114c46928fdSChristoph Hellwig d0 ^= p3[0]; 115c46928fdSChristoph Hellwig d1 ^= p3[1]; 116c46928fdSChristoph Hellwig d2 ^= p3[2]; 117c46928fdSChristoph Hellwig d3 ^= p3[3]; 118c46928fdSChristoph Hellwig d4 ^= p3[4]; 119c46928fdSChristoph Hellwig d5 ^= p3[5]; 120c46928fdSChristoph Hellwig d6 ^= p3[6]; 121c46928fdSChristoph Hellwig d7 ^= p3[7]; 122c46928fdSChristoph Hellwig d0 ^= p4[0]; 123c46928fdSChristoph Hellwig d1 ^= p4[1]; 124c46928fdSChristoph Hellwig d2 ^= p4[2]; 125c46928fdSChristoph Hellwig d3 ^= p4[3]; 126c46928fdSChristoph Hellwig d4 ^= p4[4]; 127c46928fdSChristoph Hellwig d5 ^= p4[5]; 128c46928fdSChristoph Hellwig d6 ^= p4[6]; 129c46928fdSChristoph Hellwig d7 ^= p4[7]; 130c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 131c46928fdSChristoph Hellwig p1[1] = d1; 132c46928fdSChristoph Hellwig p1[2] = d2; 133c46928fdSChristoph Hellwig p1[3] = d3; 134c46928fdSChristoph Hellwig p1[4] = d4; 135c46928fdSChristoph Hellwig p1[5] = d5; 136c46928fdSChristoph Hellwig p1[6] = d6; 137c46928fdSChristoph Hellwig p1[7] = d7; 138c46928fdSChristoph Hellwig p1 += 8; 139c46928fdSChristoph Hellwig p2 += 8; 140c46928fdSChristoph Hellwig p3 += 8; 141c46928fdSChristoph Hellwig p4 += 8; 142c46928fdSChristoph Hellwig } while (--lines > 0); 143c46928fdSChristoph Hellwig } 144c46928fdSChristoph Hellwig 145c46928fdSChristoph Hellwig static void 146c46928fdSChristoph Hellwig xor_32regs_5(unsigned long bytes, unsigned long * __restrict p1, 147c46928fdSChristoph Hellwig const unsigned long * __restrict p2, 148c46928fdSChristoph Hellwig const unsigned long * __restrict p3, 149c46928fdSChristoph Hellwig const unsigned long * __restrict p4, 150c46928fdSChristoph Hellwig const unsigned long * __restrict p5) 151c46928fdSChristoph Hellwig { 152c46928fdSChristoph Hellwig long lines = bytes / (sizeof (long)) / 8; 153c46928fdSChristoph Hellwig 154c46928fdSChristoph Hellwig do { 155c46928fdSChristoph Hellwig register long d0, d1, d2, d3, d4, d5, d6, d7; 156c46928fdSChristoph Hellwig d0 = p1[0]; /* Pull the stuff into registers */ 157c46928fdSChristoph Hellwig d1 = p1[1]; /* ... in bursts, if possible. */ 158c46928fdSChristoph Hellwig d2 = p1[2]; 159c46928fdSChristoph Hellwig d3 = p1[3]; 160c46928fdSChristoph Hellwig d4 = p1[4]; 161c46928fdSChristoph Hellwig d5 = p1[5]; 162c46928fdSChristoph Hellwig d6 = p1[6]; 163c46928fdSChristoph Hellwig d7 = p1[7]; 164c46928fdSChristoph Hellwig d0 ^= p2[0]; 165c46928fdSChristoph Hellwig d1 ^= p2[1]; 166c46928fdSChristoph Hellwig d2 ^= p2[2]; 167c46928fdSChristoph Hellwig d3 ^= p2[3]; 168c46928fdSChristoph Hellwig d4 ^= p2[4]; 169c46928fdSChristoph Hellwig d5 ^= p2[5]; 170c46928fdSChristoph Hellwig d6 ^= p2[6]; 171c46928fdSChristoph Hellwig d7 ^= p2[7]; 172c46928fdSChristoph Hellwig d0 ^= p3[0]; 173c46928fdSChristoph Hellwig d1 ^= p3[1]; 174c46928fdSChristoph Hellwig d2 ^= p3[2]; 175c46928fdSChristoph Hellwig d3 ^= p3[3]; 176c46928fdSChristoph Hellwig d4 ^= p3[4]; 177c46928fdSChristoph Hellwig d5 ^= p3[5]; 178c46928fdSChristoph Hellwig d6 ^= p3[6]; 179c46928fdSChristoph Hellwig d7 ^= p3[7]; 180c46928fdSChristoph Hellwig d0 ^= p4[0]; 181c46928fdSChristoph Hellwig d1 ^= p4[1]; 182c46928fdSChristoph Hellwig d2 ^= p4[2]; 183c46928fdSChristoph Hellwig d3 ^= p4[3]; 184c46928fdSChristoph Hellwig d4 ^= p4[4]; 185c46928fdSChristoph Hellwig d5 ^= p4[5]; 186c46928fdSChristoph Hellwig d6 ^= p4[6]; 187c46928fdSChristoph Hellwig d7 ^= p4[7]; 188c46928fdSChristoph Hellwig d0 ^= p5[0]; 189c46928fdSChristoph Hellwig d1 ^= p5[1]; 190c46928fdSChristoph Hellwig d2 ^= p5[2]; 191c46928fdSChristoph Hellwig d3 ^= p5[3]; 192c46928fdSChristoph Hellwig d4 ^= p5[4]; 193c46928fdSChristoph Hellwig d5 ^= p5[5]; 194c46928fdSChristoph Hellwig d6 ^= p5[6]; 195c46928fdSChristoph Hellwig d7 ^= p5[7]; 196c46928fdSChristoph Hellwig p1[0] = d0; /* Store the result (in bursts) */ 197c46928fdSChristoph Hellwig p1[1] = d1; 198c46928fdSChristoph Hellwig p1[2] = d2; 199c46928fdSChristoph Hellwig p1[3] = d3; 200c46928fdSChristoph Hellwig p1[4] = d4; 201c46928fdSChristoph Hellwig p1[5] = d5; 202c46928fdSChristoph Hellwig p1[6] = d6; 203c46928fdSChristoph Hellwig p1[7] = d7; 204c46928fdSChristoph Hellwig p1 += 8; 205c46928fdSChristoph Hellwig p2 += 8; 206c46928fdSChristoph Hellwig p3 += 8; 207c46928fdSChristoph Hellwig p4 += 8; 208c46928fdSChristoph Hellwig p5 += 8; 209c46928fdSChristoph Hellwig } while (--lines > 0); 210c46928fdSChristoph Hellwig } 211c46928fdSChristoph Hellwig 212*80dcf0a7SChristoph Hellwig DO_XOR_BLOCKS(32regs, xor_32regs_2, xor_32regs_3, xor_32regs_4, xor_32regs_5); 213*80dcf0a7SChristoph Hellwig 214c46928fdSChristoph Hellwig struct xor_block_template xor_block_32regs = { 215c46928fdSChristoph Hellwig .name = "32regs", 216*80dcf0a7SChristoph Hellwig .xor_gen = xor_gen_32regs, 217c46928fdSChristoph Hellwig }; 218