1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * High speed xor_block operation for RAID4/5 utilizing the 4 * ldd/std SPARC instructions. 5 * 6 * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz) 7 */ 8 #include "xor_impl.h" 9 #include "xor_arch.h" 10 11 static void 12 sparc_2(unsigned long bytes, unsigned long * __restrict p1, 13 const unsigned long * __restrict p2) 14 { 15 int lines = bytes / (sizeof (long)) / 8; 16 17 do { 18 __asm__ __volatile__( 19 "ldd [%0 + 0x00], %%g2\n\t" 20 "ldd [%0 + 0x08], %%g4\n\t" 21 "ldd [%0 + 0x10], %%o0\n\t" 22 "ldd [%0 + 0x18], %%o2\n\t" 23 "ldd [%1 + 0x00], %%o4\n\t" 24 "ldd [%1 + 0x08], %%l0\n\t" 25 "ldd [%1 + 0x10], %%l2\n\t" 26 "ldd [%1 + 0x18], %%l4\n\t" 27 "xor %%g2, %%o4, %%g2\n\t" 28 "xor %%g3, %%o5, %%g3\n\t" 29 "xor %%g4, %%l0, %%g4\n\t" 30 "xor %%g5, %%l1, %%g5\n\t" 31 "xor %%o0, %%l2, %%o0\n\t" 32 "xor %%o1, %%l3, %%o1\n\t" 33 "xor %%o2, %%l4, %%o2\n\t" 34 "xor %%o3, %%l5, %%o3\n\t" 35 "std %%g2, [%0 + 0x00]\n\t" 36 "std %%g4, [%0 + 0x08]\n\t" 37 "std %%o0, [%0 + 0x10]\n\t" 38 "std %%o2, [%0 + 0x18]\n" 39 : 40 : "r" (p1), "r" (p2) 41 : "g2", "g3", "g4", "g5", 42 "o0", "o1", "o2", "o3", "o4", "o5", 43 "l0", "l1", "l2", "l3", "l4", "l5"); 44 p1 += 8; 45 p2 += 8; 46 } while (--lines > 0); 47 } 48 49 static void 50 sparc_3(unsigned long bytes, unsigned long * __restrict p1, 51 const unsigned long * __restrict p2, 52 const unsigned long * __restrict p3) 53 { 54 int lines = bytes / (sizeof (long)) / 8; 55 56 do { 57 __asm__ __volatile__( 58 "ldd [%0 + 0x00], %%g2\n\t" 59 "ldd [%0 + 0x08], %%g4\n\t" 60 "ldd [%0 + 0x10], %%o0\n\t" 61 "ldd [%0 + 0x18], %%o2\n\t" 62 "ldd [%1 + 0x00], %%o4\n\t" 63 "ldd [%1 + 0x08], %%l0\n\t" 64 "ldd [%1 + 0x10], %%l2\n\t" 65 "ldd [%1 + 0x18], %%l4\n\t" 66 "xor %%g2, %%o4, %%g2\n\t" 67 "xor %%g3, %%o5, %%g3\n\t" 68 "ldd [%2 + 0x00], %%o4\n\t" 69 "xor %%g4, %%l0, %%g4\n\t" 70 "xor %%g5, %%l1, %%g5\n\t" 71 "ldd [%2 + 0x08], %%l0\n\t" 72 "xor %%o0, %%l2, %%o0\n\t" 73 "xor %%o1, %%l3, %%o1\n\t" 74 "ldd [%2 + 0x10], %%l2\n\t" 75 "xor %%o2, %%l4, %%o2\n\t" 76 "xor %%o3, %%l5, %%o3\n\t" 77 "ldd [%2 + 0x18], %%l4\n\t" 78 "xor %%g2, %%o4, %%g2\n\t" 79 "xor %%g3, %%o5, %%g3\n\t" 80 "xor %%g4, %%l0, %%g4\n\t" 81 "xor %%g5, %%l1, %%g5\n\t" 82 "xor %%o0, %%l2, %%o0\n\t" 83 "xor %%o1, %%l3, %%o1\n\t" 84 "xor %%o2, %%l4, %%o2\n\t" 85 "xor %%o3, %%l5, %%o3\n\t" 86 "std %%g2, [%0 + 0x00]\n\t" 87 "std %%g4, [%0 + 0x08]\n\t" 88 "std %%o0, [%0 + 0x10]\n\t" 89 "std %%o2, [%0 + 0x18]\n" 90 : 91 : "r" (p1), "r" (p2), "r" (p3) 92 : "g2", "g3", "g4", "g5", 93 "o0", "o1", "o2", "o3", "o4", "o5", 94 "l0", "l1", "l2", "l3", "l4", "l5"); 95 p1 += 8; 96 p2 += 8; 97 p3 += 8; 98 } while (--lines > 0); 99 } 100 101 static void 102 sparc_4(unsigned long bytes, unsigned long * __restrict p1, 103 const unsigned long * __restrict p2, 104 const unsigned long * __restrict p3, 105 const unsigned long * __restrict p4) 106 { 107 int lines = bytes / (sizeof (long)) / 8; 108 109 do { 110 __asm__ __volatile__( 111 "ldd [%0 + 0x00], %%g2\n\t" 112 "ldd [%0 + 0x08], %%g4\n\t" 113 "ldd [%0 + 0x10], %%o0\n\t" 114 "ldd [%0 + 0x18], %%o2\n\t" 115 "ldd [%1 + 0x00], %%o4\n\t" 116 "ldd [%1 + 0x08], %%l0\n\t" 117 "ldd [%1 + 0x10], %%l2\n\t" 118 "ldd [%1 + 0x18], %%l4\n\t" 119 "xor %%g2, %%o4, %%g2\n\t" 120 "xor %%g3, %%o5, %%g3\n\t" 121 "ldd [%2 + 0x00], %%o4\n\t" 122 "xor %%g4, %%l0, %%g4\n\t" 123 "xor %%g5, %%l1, %%g5\n\t" 124 "ldd [%2 + 0x08], %%l0\n\t" 125 "xor %%o0, %%l2, %%o0\n\t" 126 "xor %%o1, %%l3, %%o1\n\t" 127 "ldd [%2 + 0x10], %%l2\n\t" 128 "xor %%o2, %%l4, %%o2\n\t" 129 "xor %%o3, %%l5, %%o3\n\t" 130 "ldd [%2 + 0x18], %%l4\n\t" 131 "xor %%g2, %%o4, %%g2\n\t" 132 "xor %%g3, %%o5, %%g3\n\t" 133 "ldd [%3 + 0x00], %%o4\n\t" 134 "xor %%g4, %%l0, %%g4\n\t" 135 "xor %%g5, %%l1, %%g5\n\t" 136 "ldd [%3 + 0x08], %%l0\n\t" 137 "xor %%o0, %%l2, %%o0\n\t" 138 "xor %%o1, %%l3, %%o1\n\t" 139 "ldd [%3 + 0x10], %%l2\n\t" 140 "xor %%o2, %%l4, %%o2\n\t" 141 "xor %%o3, %%l5, %%o3\n\t" 142 "ldd [%3 + 0x18], %%l4\n\t" 143 "xor %%g2, %%o4, %%g2\n\t" 144 "xor %%g3, %%o5, %%g3\n\t" 145 "xor %%g4, %%l0, %%g4\n\t" 146 "xor %%g5, %%l1, %%g5\n\t" 147 "xor %%o0, %%l2, %%o0\n\t" 148 "xor %%o1, %%l3, %%o1\n\t" 149 "xor %%o2, %%l4, %%o2\n\t" 150 "xor %%o3, %%l5, %%o3\n\t" 151 "std %%g2, [%0 + 0x00]\n\t" 152 "std %%g4, [%0 + 0x08]\n\t" 153 "std %%o0, [%0 + 0x10]\n\t" 154 "std %%o2, [%0 + 0x18]\n" 155 : 156 : "r" (p1), "r" (p2), "r" (p3), "r" (p4) 157 : "g2", "g3", "g4", "g5", 158 "o0", "o1", "o2", "o3", "o4", "o5", 159 "l0", "l1", "l2", "l3", "l4", "l5"); 160 p1 += 8; 161 p2 += 8; 162 p3 += 8; 163 p4 += 8; 164 } while (--lines > 0); 165 } 166 167 static void 168 sparc_5(unsigned long bytes, unsigned long * __restrict p1, 169 const unsigned long * __restrict p2, 170 const unsigned long * __restrict p3, 171 const unsigned long * __restrict p4, 172 const unsigned long * __restrict p5) 173 { 174 int lines = bytes / (sizeof (long)) / 8; 175 176 do { 177 __asm__ __volatile__( 178 "ldd [%0 + 0x00], %%g2\n\t" 179 "ldd [%0 + 0x08], %%g4\n\t" 180 "ldd [%0 + 0x10], %%o0\n\t" 181 "ldd [%0 + 0x18], %%o2\n\t" 182 "ldd [%1 + 0x00], %%o4\n\t" 183 "ldd [%1 + 0x08], %%l0\n\t" 184 "ldd [%1 + 0x10], %%l2\n\t" 185 "ldd [%1 + 0x18], %%l4\n\t" 186 "xor %%g2, %%o4, %%g2\n\t" 187 "xor %%g3, %%o5, %%g3\n\t" 188 "ldd [%2 + 0x00], %%o4\n\t" 189 "xor %%g4, %%l0, %%g4\n\t" 190 "xor %%g5, %%l1, %%g5\n\t" 191 "ldd [%2 + 0x08], %%l0\n\t" 192 "xor %%o0, %%l2, %%o0\n\t" 193 "xor %%o1, %%l3, %%o1\n\t" 194 "ldd [%2 + 0x10], %%l2\n\t" 195 "xor %%o2, %%l4, %%o2\n\t" 196 "xor %%o3, %%l5, %%o3\n\t" 197 "ldd [%2 + 0x18], %%l4\n\t" 198 "xor %%g2, %%o4, %%g2\n\t" 199 "xor %%g3, %%o5, %%g3\n\t" 200 "ldd [%3 + 0x00], %%o4\n\t" 201 "xor %%g4, %%l0, %%g4\n\t" 202 "xor %%g5, %%l1, %%g5\n\t" 203 "ldd [%3 + 0x08], %%l0\n\t" 204 "xor %%o0, %%l2, %%o0\n\t" 205 "xor %%o1, %%l3, %%o1\n\t" 206 "ldd [%3 + 0x10], %%l2\n\t" 207 "xor %%o2, %%l4, %%o2\n\t" 208 "xor %%o3, %%l5, %%o3\n\t" 209 "ldd [%3 + 0x18], %%l4\n\t" 210 "xor %%g2, %%o4, %%g2\n\t" 211 "xor %%g3, %%o5, %%g3\n\t" 212 "ldd [%4 + 0x00], %%o4\n\t" 213 "xor %%g4, %%l0, %%g4\n\t" 214 "xor %%g5, %%l1, %%g5\n\t" 215 "ldd [%4 + 0x08], %%l0\n\t" 216 "xor %%o0, %%l2, %%o0\n\t" 217 "xor %%o1, %%l3, %%o1\n\t" 218 "ldd [%4 + 0x10], %%l2\n\t" 219 "xor %%o2, %%l4, %%o2\n\t" 220 "xor %%o3, %%l5, %%o3\n\t" 221 "ldd [%4 + 0x18], %%l4\n\t" 222 "xor %%g2, %%o4, %%g2\n\t" 223 "xor %%g3, %%o5, %%g3\n\t" 224 "xor %%g4, %%l0, %%g4\n\t" 225 "xor %%g5, %%l1, %%g5\n\t" 226 "xor %%o0, %%l2, %%o0\n\t" 227 "xor %%o1, %%l3, %%o1\n\t" 228 "xor %%o2, %%l4, %%o2\n\t" 229 "xor %%o3, %%l5, %%o3\n\t" 230 "std %%g2, [%0 + 0x00]\n\t" 231 "std %%g4, [%0 + 0x08]\n\t" 232 "std %%o0, [%0 + 0x10]\n\t" 233 "std %%o2, [%0 + 0x18]\n" 234 : 235 : "r" (p1), "r" (p2), "r" (p3), "r" (p4), "r" (p5) 236 : "g2", "g3", "g4", "g5", 237 "o0", "o1", "o2", "o3", "o4", "o5", 238 "l0", "l1", "l2", "l3", "l4", "l5"); 239 p1 += 8; 240 p2 += 8; 241 p3 += 8; 242 p4 += 8; 243 p5 += 8; 244 } while (--lines > 0); 245 } 246 247 DO_XOR_BLOCKS(sparc32, sparc_2, sparc_3, sparc_4, sparc_5); 248 249 struct xor_block_template xor_block_SPARC = { 250 .name = "SPARC", 251 .xor_gen = xor_gen_sparc32, 252 }; 253