| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * arch/sparc64/lib/xor.S | 
|  | 3 | * | 
|  | 4 | * High speed xor_block operation for RAID4/5 utilizing the | 
| David S. Miller | 3634476 | 2006-02-25 17:16:29 -0800 | [diff] [blame] | 5 | * UltraSparc Visual Instruction Set and Niagara store-init/twin-load. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 6 | * | 
|  | 7 | * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz) | 
| David S. Miller | 3634476 | 2006-02-25 17:16:29 -0800 | [diff] [blame] | 8 | * Copyright (C) 2006 David S. Miller <davem@davemloft.net> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 9 | */ | 
|  | 10 |  | 
|  | 11 | #include <asm/visasm.h> | 
|  | 12 | #include <asm/asi.h> | 
|  | 13 | #include <asm/dcu.h> | 
|  | 14 | #include <asm/spitfire.h> | 
|  | 15 |  | 
|  | 16 | /* | 
|  | 17 | *	Requirements: | 
|  | 18 | *	!(((long)dest | (long)sourceN) & (64 - 1)) && | 
|  | 19 | *	!(len & 127) && len >= 256 | 
|  | 20 | */ | 
|  | 21 | .text | 
|  | 22 | .align	32 | 
| David S. Miller | 3634476 | 2006-02-25 17:16:29 -0800 | [diff] [blame] | 23 |  | 
|  | 24 | /* VIS versions. */ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 25 | .globl	xor_vis_2 | 
|  | 26 | .type	xor_vis_2,#function | 
|  | 27 | xor_vis_2: | 
|  | 28 | rd	%fprs, %o5 | 
|  | 29 | andcc	%o5, FPRS_FEF|FPRS_DU, %g0 | 
|  | 30 | be,pt	%icc, 0f | 
|  | 31 | sethi	%hi(VISenter), %g1 | 
|  | 32 | jmpl	%g1 + %lo(VISenter), %g7 | 
|  | 33 | add	%g7, 8, %g7 | 
|  | 34 | 0:	wr	%g0, FPRS_FEF, %fprs | 
|  | 35 | rd	%asi, %g1 | 
|  | 36 | wr	%g0, ASI_BLK_P, %asi | 
|  | 37 | membar	#LoadStore|#StoreLoad|#StoreStore | 
|  | 38 | sub	%o0, 128, %o0 | 
|  | 39 | ldda	[%o1] %asi, %f0 | 
|  | 40 | ldda	[%o2] %asi, %f16 | 
|  | 41 |  | 
|  | 42 | 2:	ldda	[%o1 + 64] %asi, %f32 | 
|  | 43 | fxor	%f0, %f16, %f16 | 
|  | 44 | fxor	%f2, %f18, %f18 | 
|  | 45 | fxor	%f4, %f20, %f20 | 
|  | 46 | fxor	%f6, %f22, %f22 | 
|  | 47 | fxor	%f8, %f24, %f24 | 
|  | 48 | fxor	%f10, %f26, %f26 | 
|  | 49 | fxor	%f12, %f28, %f28 | 
|  | 50 | fxor	%f14, %f30, %f30 | 
|  | 51 | stda	%f16, [%o1] %asi | 
|  | 52 | ldda	[%o2 + 64] %asi, %f48 | 
|  | 53 | ldda	[%o1 + 128] %asi, %f0 | 
|  | 54 | fxor	%f32, %f48, %f48 | 
|  | 55 | fxor	%f34, %f50, %f50 | 
|  | 56 | add	%o1, 128, %o1 | 
|  | 57 | fxor	%f36, %f52, %f52 | 
|  | 58 | add	%o2, 128, %o2 | 
|  | 59 | fxor	%f38, %f54, %f54 | 
|  | 60 | subcc	%o0, 128, %o0 | 
|  | 61 | fxor	%f40, %f56, %f56 | 
|  | 62 | fxor	%f42, %f58, %f58 | 
|  | 63 | fxor	%f44, %f60, %f60 | 
|  | 64 | fxor	%f46, %f62, %f62 | 
|  | 65 | stda	%f48, [%o1 - 64] %asi | 
|  | 66 | bne,pt	%xcc, 2b | 
|  | 67 | ldda	[%o2] %asi, %f16 | 
|  | 68 |  | 
|  | 69 | ldda	[%o1 + 64] %asi, %f32 | 
|  | 70 | fxor	%f0, %f16, %f16 | 
|  | 71 | fxor	%f2, %f18, %f18 | 
|  | 72 | fxor	%f4, %f20, %f20 | 
|  | 73 | fxor	%f6, %f22, %f22 | 
|  | 74 | fxor	%f8, %f24, %f24 | 
|  | 75 | fxor	%f10, %f26, %f26 | 
|  | 76 | fxor	%f12, %f28, %f28 | 
|  | 77 | fxor	%f14, %f30, %f30 | 
|  | 78 | stda	%f16, [%o1] %asi | 
|  | 79 | ldda	[%o2 + 64] %asi, %f48 | 
|  | 80 | membar	#Sync | 
|  | 81 | fxor	%f32, %f48, %f48 | 
|  | 82 | fxor	%f34, %f50, %f50 | 
|  | 83 | fxor	%f36, %f52, %f52 | 
|  | 84 | fxor	%f38, %f54, %f54 | 
|  | 85 | fxor	%f40, %f56, %f56 | 
|  | 86 | fxor	%f42, %f58, %f58 | 
|  | 87 | fxor	%f44, %f60, %f60 | 
|  | 88 | fxor	%f46, %f62, %f62 | 
|  | 89 | stda	%f48, [%o1 + 64] %asi | 
|  | 90 | membar	#Sync|#StoreStore|#StoreLoad | 
|  | 91 | wr	%g1, %g0, %asi | 
|  | 92 | retl | 
|  | 93 | wr	%g0, 0, %fprs | 
|  | 94 | .size	xor_vis_2, .-xor_vis_2 | 
|  | 95 |  | 
|  | 96 | .globl	xor_vis_3 | 
|  | 97 | .type	xor_vis_3,#function | 
|  | 98 | xor_vis_3: | 
|  | 99 | rd	%fprs, %o5 | 
|  | 100 | andcc	%o5, FPRS_FEF|FPRS_DU, %g0 | 
|  | 101 | be,pt	%icc, 0f | 
|  | 102 | sethi	%hi(VISenter), %g1 | 
|  | 103 | jmpl	%g1 + %lo(VISenter), %g7 | 
|  | 104 | add	%g7, 8, %g7 | 
|  | 105 | 0:	wr	%g0, FPRS_FEF, %fprs | 
|  | 106 | rd	%asi, %g1 | 
|  | 107 | wr	%g0, ASI_BLK_P, %asi | 
|  | 108 | membar	#LoadStore|#StoreLoad|#StoreStore | 
|  | 109 | sub	%o0, 64, %o0 | 
|  | 110 | ldda	[%o1] %asi, %f0 | 
|  | 111 | ldda	[%o2] %asi, %f16 | 
|  | 112 |  | 
|  | 113 | 3:	ldda	[%o3] %asi, %f32 | 
|  | 114 | fxor	%f0, %f16, %f48 | 
|  | 115 | fxor	%f2, %f18, %f50 | 
|  | 116 | add	%o1, 64, %o1 | 
|  | 117 | fxor	%f4, %f20, %f52 | 
|  | 118 | fxor	%f6, %f22, %f54 | 
|  | 119 | add	%o2, 64, %o2 | 
|  | 120 | fxor	%f8, %f24, %f56 | 
|  | 121 | fxor	%f10, %f26, %f58 | 
|  | 122 | fxor	%f12, %f28, %f60 | 
|  | 123 | fxor	%f14, %f30, %f62 | 
|  | 124 | ldda	[%o1] %asi, %f0 | 
|  | 125 | fxor	%f48, %f32, %f48 | 
|  | 126 | fxor	%f50, %f34, %f50 | 
|  | 127 | fxor	%f52, %f36, %f52 | 
|  | 128 | fxor	%f54, %f38, %f54 | 
|  | 129 | add	%o3, 64, %o3 | 
|  | 130 | fxor	%f56, %f40, %f56 | 
|  | 131 | fxor	%f58, %f42, %f58 | 
|  | 132 | subcc	%o0, 64, %o0 | 
|  | 133 | fxor	%f60, %f44, %f60 | 
|  | 134 | fxor	%f62, %f46, %f62 | 
|  | 135 | stda	%f48, [%o1 - 64] %asi | 
|  | 136 | bne,pt	%xcc, 3b | 
|  | 137 | ldda	[%o2] %asi, %f16 | 
|  | 138 |  | 
|  | 139 | ldda	[%o3] %asi, %f32 | 
|  | 140 | fxor	%f0, %f16, %f48 | 
|  | 141 | fxor	%f2, %f18, %f50 | 
|  | 142 | fxor	%f4, %f20, %f52 | 
|  | 143 | fxor	%f6, %f22, %f54 | 
|  | 144 | fxor	%f8, %f24, %f56 | 
|  | 145 | fxor	%f10, %f26, %f58 | 
|  | 146 | fxor	%f12, %f28, %f60 | 
|  | 147 | fxor	%f14, %f30, %f62 | 
|  | 148 | membar	#Sync | 
|  | 149 | fxor	%f48, %f32, %f48 | 
|  | 150 | fxor	%f50, %f34, %f50 | 
|  | 151 | fxor	%f52, %f36, %f52 | 
|  | 152 | fxor	%f54, %f38, %f54 | 
|  | 153 | fxor	%f56, %f40, %f56 | 
|  | 154 | fxor	%f58, %f42, %f58 | 
|  | 155 | fxor	%f60, %f44, %f60 | 
|  | 156 | fxor	%f62, %f46, %f62 | 
|  | 157 | stda	%f48, [%o1] %asi | 
|  | 158 | membar	#Sync|#StoreStore|#StoreLoad | 
|  | 159 | wr	%g1, %g0, %asi | 
|  | 160 | retl | 
|  | 161 | wr	%g0, 0, %fprs | 
|  | 162 | .size	xor_vis_3, .-xor_vis_3 | 
|  | 163 |  | 
|  | 164 | .globl	xor_vis_4 | 
|  | 165 | .type	xor_vis_4,#function | 
|  | 166 | xor_vis_4: | 
|  | 167 | rd	%fprs, %o5 | 
|  | 168 | andcc	%o5, FPRS_FEF|FPRS_DU, %g0 | 
|  | 169 | be,pt	%icc, 0f | 
|  | 170 | sethi	%hi(VISenter), %g1 | 
|  | 171 | jmpl	%g1 + %lo(VISenter), %g7 | 
|  | 172 | add	%g7, 8, %g7 | 
|  | 173 | 0:	wr	%g0, FPRS_FEF, %fprs | 
|  | 174 | rd	%asi, %g1 | 
|  | 175 | wr	%g0, ASI_BLK_P, %asi | 
|  | 176 | membar	#LoadStore|#StoreLoad|#StoreStore | 
|  | 177 | sub	%o0, 64, %o0 | 
|  | 178 | ldda	[%o1] %asi, %f0 | 
|  | 179 | ldda	[%o2] %asi, %f16 | 
|  | 180 |  | 
|  | 181 | 4:	ldda	[%o3] %asi, %f32 | 
|  | 182 | fxor	%f0, %f16, %f16 | 
|  | 183 | fxor	%f2, %f18, %f18 | 
|  | 184 | add	%o1, 64, %o1 | 
|  | 185 | fxor	%f4, %f20, %f20 | 
|  | 186 | fxor	%f6, %f22, %f22 | 
|  | 187 | add	%o2, 64, %o2 | 
|  | 188 | fxor	%f8, %f24, %f24 | 
|  | 189 | fxor	%f10, %f26, %f26 | 
|  | 190 | fxor	%f12, %f28, %f28 | 
|  | 191 | fxor	%f14, %f30, %f30 | 
|  | 192 | ldda	[%o4] %asi, %f48 | 
|  | 193 | fxor	%f16, %f32, %f32 | 
|  | 194 | fxor	%f18, %f34, %f34 | 
|  | 195 | fxor	%f20, %f36, %f36 | 
|  | 196 | fxor	%f22, %f38, %f38 | 
|  | 197 | add	%o3, 64, %o3 | 
|  | 198 | fxor	%f24, %f40, %f40 | 
|  | 199 | fxor	%f26, %f42, %f42 | 
|  | 200 | fxor	%f28, %f44, %f44 | 
|  | 201 | fxor	%f30, %f46, %f46 | 
|  | 202 | ldda	[%o1] %asi, %f0 | 
|  | 203 | fxor	%f32, %f48, %f48 | 
|  | 204 | fxor	%f34, %f50, %f50 | 
|  | 205 | fxor	%f36, %f52, %f52 | 
|  | 206 | add	%o4, 64, %o4 | 
|  | 207 | fxor	%f38, %f54, %f54 | 
|  | 208 | fxor	%f40, %f56, %f56 | 
|  | 209 | fxor	%f42, %f58, %f58 | 
|  | 210 | subcc	%o0, 64, %o0 | 
|  | 211 | fxor	%f44, %f60, %f60 | 
|  | 212 | fxor	%f46, %f62, %f62 | 
|  | 213 | stda	%f48, [%o1 - 64] %asi | 
|  | 214 | bne,pt	%xcc, 4b | 
|  | 215 | ldda	[%o2] %asi, %f16 | 
|  | 216 |  | 
|  | 217 | ldda	[%o3] %asi, %f32 | 
|  | 218 | fxor	%f0, %f16, %f16 | 
|  | 219 | fxor	%f2, %f18, %f18 | 
|  | 220 | fxor	%f4, %f20, %f20 | 
|  | 221 | fxor	%f6, %f22, %f22 | 
|  | 222 | fxor	%f8, %f24, %f24 | 
|  | 223 | fxor	%f10, %f26, %f26 | 
|  | 224 | fxor	%f12, %f28, %f28 | 
|  | 225 | fxor	%f14, %f30, %f30 | 
|  | 226 | ldda	[%o4] %asi, %f48 | 
|  | 227 | fxor	%f16, %f32, %f32 | 
|  | 228 | fxor	%f18, %f34, %f34 | 
|  | 229 | fxor	%f20, %f36, %f36 | 
|  | 230 | fxor	%f22, %f38, %f38 | 
|  | 231 | fxor	%f24, %f40, %f40 | 
|  | 232 | fxor	%f26, %f42, %f42 | 
|  | 233 | fxor	%f28, %f44, %f44 | 
|  | 234 | fxor	%f30, %f46, %f46 | 
|  | 235 | membar	#Sync | 
|  | 236 | fxor	%f32, %f48, %f48 | 
|  | 237 | fxor	%f34, %f50, %f50 | 
|  | 238 | fxor	%f36, %f52, %f52 | 
|  | 239 | fxor	%f38, %f54, %f54 | 
|  | 240 | fxor	%f40, %f56, %f56 | 
|  | 241 | fxor	%f42, %f58, %f58 | 
|  | 242 | fxor	%f44, %f60, %f60 | 
|  | 243 | fxor	%f46, %f62, %f62 | 
|  | 244 | stda	%f48, [%o1] %asi | 
|  | 245 | membar	#Sync|#StoreStore|#StoreLoad | 
|  | 246 | wr	%g1, %g0, %asi | 
|  | 247 | retl | 
|  | 248 | wr	%g0, 0, %fprs | 
|  | 249 | .size	xor_vis_4, .-xor_vis_4 | 
|  | 250 |  | 
|  | 251 | .globl	xor_vis_5 | 
|  | 252 | .type	xor_vis_5,#function | 
|  | 253 | xor_vis_5: | 
|  | 254 | save	%sp, -192, %sp | 
|  | 255 | rd	%fprs, %o5 | 
|  | 256 | andcc	%o5, FPRS_FEF|FPRS_DU, %g0 | 
|  | 257 | be,pt	%icc, 0f | 
|  | 258 | sethi	%hi(VISenter), %g1 | 
|  | 259 | jmpl	%g1 + %lo(VISenter), %g7 | 
|  | 260 | add	%g7, 8, %g7 | 
|  | 261 | 0:	wr	%g0, FPRS_FEF, %fprs | 
|  | 262 | rd	%asi, %g1 | 
|  | 263 | wr	%g0, ASI_BLK_P, %asi | 
|  | 264 | membar	#LoadStore|#StoreLoad|#StoreStore | 
|  | 265 | sub	%i0, 64, %i0 | 
|  | 266 | ldda	[%i1] %asi, %f0 | 
|  | 267 | ldda	[%i2] %asi, %f16 | 
|  | 268 |  | 
|  | 269 | 5:	ldda	[%i3] %asi, %f32 | 
|  | 270 | fxor	%f0, %f16, %f48 | 
|  | 271 | fxor	%f2, %f18, %f50 | 
|  | 272 | add	%i1, 64, %i1 | 
|  | 273 | fxor	%f4, %f20, %f52 | 
|  | 274 | fxor	%f6, %f22, %f54 | 
|  | 275 | add	%i2, 64, %i2 | 
|  | 276 | fxor	%f8, %f24, %f56 | 
|  | 277 | fxor	%f10, %f26, %f58 | 
|  | 278 | fxor	%f12, %f28, %f60 | 
|  | 279 | fxor	%f14, %f30, %f62 | 
|  | 280 | ldda	[%i4] %asi, %f16 | 
|  | 281 | fxor	%f48, %f32, %f48 | 
|  | 282 | fxor	%f50, %f34, %f50 | 
|  | 283 | fxor	%f52, %f36, %f52 | 
|  | 284 | fxor	%f54, %f38, %f54 | 
|  | 285 | add	%i3, 64, %i3 | 
|  | 286 | fxor	%f56, %f40, %f56 | 
|  | 287 | fxor	%f58, %f42, %f58 | 
|  | 288 | fxor	%f60, %f44, %f60 | 
|  | 289 | fxor	%f62, %f46, %f62 | 
|  | 290 | ldda	[%i5] %asi, %f32 | 
|  | 291 | fxor	%f48, %f16, %f48 | 
|  | 292 | fxor	%f50, %f18, %f50 | 
|  | 293 | add	%i4, 64, %i4 | 
|  | 294 | fxor	%f52, %f20, %f52 | 
|  | 295 | fxor	%f54, %f22, %f54 | 
|  | 296 | add	%i5, 64, %i5 | 
|  | 297 | fxor	%f56, %f24, %f56 | 
|  | 298 | fxor	%f58, %f26, %f58 | 
|  | 299 | fxor	%f60, %f28, %f60 | 
|  | 300 | fxor	%f62, %f30, %f62 | 
|  | 301 | ldda	[%i1] %asi, %f0 | 
|  | 302 | fxor	%f48, %f32, %f48 | 
|  | 303 | fxor	%f50, %f34, %f50 | 
|  | 304 | fxor	%f52, %f36, %f52 | 
|  | 305 | fxor	%f54, %f38, %f54 | 
|  | 306 | fxor	%f56, %f40, %f56 | 
|  | 307 | fxor	%f58, %f42, %f58 | 
|  | 308 | subcc	%i0, 64, %i0 | 
|  | 309 | fxor	%f60, %f44, %f60 | 
|  | 310 | fxor	%f62, %f46, %f62 | 
|  | 311 | stda	%f48, [%i1 - 64] %asi | 
|  | 312 | bne,pt	%xcc, 5b | 
|  | 313 | ldda	[%i2] %asi, %f16 | 
|  | 314 |  | 
|  | 315 | ldda	[%i3] %asi, %f32 | 
|  | 316 | fxor	%f0, %f16, %f48 | 
|  | 317 | fxor	%f2, %f18, %f50 | 
|  | 318 | fxor	%f4, %f20, %f52 | 
|  | 319 | fxor	%f6, %f22, %f54 | 
|  | 320 | fxor	%f8, %f24, %f56 | 
|  | 321 | fxor	%f10, %f26, %f58 | 
|  | 322 | fxor	%f12, %f28, %f60 | 
|  | 323 | fxor	%f14, %f30, %f62 | 
|  | 324 | ldda	[%i4] %asi, %f16 | 
|  | 325 | fxor	%f48, %f32, %f48 | 
|  | 326 | fxor	%f50, %f34, %f50 | 
|  | 327 | fxor	%f52, %f36, %f52 | 
|  | 328 | fxor	%f54, %f38, %f54 | 
|  | 329 | fxor	%f56, %f40, %f56 | 
|  | 330 | fxor	%f58, %f42, %f58 | 
|  | 331 | fxor	%f60, %f44, %f60 | 
|  | 332 | fxor	%f62, %f46, %f62 | 
|  | 333 | ldda	[%i5] %asi, %f32 | 
|  | 334 | fxor	%f48, %f16, %f48 | 
|  | 335 | fxor	%f50, %f18, %f50 | 
|  | 336 | fxor	%f52, %f20, %f52 | 
|  | 337 | fxor	%f54, %f22, %f54 | 
|  | 338 | fxor	%f56, %f24, %f56 | 
|  | 339 | fxor	%f58, %f26, %f58 | 
|  | 340 | fxor	%f60, %f28, %f60 | 
|  | 341 | fxor	%f62, %f30, %f62 | 
|  | 342 | membar	#Sync | 
|  | 343 | fxor	%f48, %f32, %f48 | 
|  | 344 | fxor	%f50, %f34, %f50 | 
|  | 345 | fxor	%f52, %f36, %f52 | 
|  | 346 | fxor	%f54, %f38, %f54 | 
|  | 347 | fxor	%f56, %f40, %f56 | 
|  | 348 | fxor	%f58, %f42, %f58 | 
|  | 349 | fxor	%f60, %f44, %f60 | 
|  | 350 | fxor	%f62, %f46, %f62 | 
|  | 351 | stda	%f48, [%i1] %asi | 
|  | 352 | membar	#Sync|#StoreStore|#StoreLoad | 
|  | 353 | wr	%g1, %g0, %asi | 
|  | 354 | wr	%g0, 0, %fprs | 
|  | 355 | ret | 
|  | 356 | restore | 
|  | 357 | .size	xor_vis_5, .-xor_vis_5 | 
| David S. Miller | 3634476 | 2006-02-25 17:16:29 -0800 | [diff] [blame] | 358 |  | 
|  | 359 | /* Niagara versions. */ | 
|  | 360 | .globl		xor_niagara_2 | 
|  | 361 | .type		xor_niagara_2,#function | 
|  | 362 | xor_niagara_2:		/* %o0=bytes, %o1=dest, %o2=src */ | 
|  | 363 | save		%sp, -192, %sp | 
|  | 364 | prefetch	[%i1], #n_writes | 
|  | 365 | prefetch	[%i2], #one_read | 
|  | 366 | rd		%asi, %g7 | 
|  | 367 | wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi | 
|  | 368 | srlx		%i0, 6, %g1 | 
|  | 369 | mov		%i1, %i0 | 
|  | 370 | mov		%i2, %i1 | 
|  | 371 | 1:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src  + 0x00 */ | 
|  | 372 | ldda		[%i1 + 0x10] %asi, %i4	/* %i4/%i5 = src  + 0x10 */ | 
|  | 373 | ldda		[%i1 + 0x20] %asi, %g2	/* %g2/%g3 = src  + 0x20 */ | 
|  | 374 | ldda		[%i1 + 0x30] %asi, %l0	/* %l0/%l1 = src  + 0x30 */ | 
|  | 375 | prefetch	[%i1 + 0x40], #one_read | 
|  | 376 | ldda		[%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */ | 
|  | 377 | ldda		[%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */ | 
|  | 378 | ldda		[%i0 + 0x20] %asi, %o4  /* %o4/%o5 = dest + 0x20 */ | 
|  | 379 | ldda		[%i0 + 0x30] %asi, %l2  /* %l2/%l3 = dest + 0x30 */ | 
|  | 380 | prefetch	[%i0 + 0x40], #n_writes | 
|  | 381 | xor		%o0, %i2, %o0 | 
|  | 382 | xor		%o1, %i3, %o1 | 
|  | 383 | stxa		%o0, [%i0 + 0x00] %asi | 
|  | 384 | stxa		%o1, [%i0 + 0x08] %asi | 
|  | 385 | xor		%o2, %i4, %o2 | 
|  | 386 | xor		%o3, %i5, %o3 | 
|  | 387 | stxa		%o2, [%i0 + 0x10] %asi | 
|  | 388 | stxa		%o3, [%i0 + 0x18] %asi | 
|  | 389 | xor		%o4, %g2, %o4 | 
|  | 390 | xor		%o5, %g3, %o5 | 
|  | 391 | stxa		%o4, [%i0 + 0x20] %asi | 
|  | 392 | stxa		%o5, [%i0 + 0x28] %asi | 
|  | 393 | xor		%l2, %l0, %l2 | 
|  | 394 | xor		%l3, %l1, %l3 | 
|  | 395 | stxa		%l2, [%i0 + 0x30] %asi | 
|  | 396 | stxa		%l3, [%i0 + 0x38] %asi | 
|  | 397 | add		%i0, 0x40, %i0 | 
|  | 398 | subcc		%g1, 1, %g1 | 
|  | 399 | bne,pt		%xcc, 1b | 
|  | 400 | add		%i1, 0x40, %i1 | 
|  | 401 | membar		#Sync | 
|  | 402 | wr		%g7, 0x0, %asi | 
|  | 403 | ret | 
|  | 404 | restore | 
|  | 405 | .size		xor_niagara_2, .-xor_niagara_2 | 
|  | 406 |  | 
|  | 407 | .globl		xor_niagara_3 | 
|  | 408 | .type		xor_niagara_3,#function | 
|  | 409 | xor_niagara_3:		/* %o0=bytes, %o1=dest, %o2=src1, %o3=src2 */ | 
|  | 410 | save		%sp, -192, %sp | 
|  | 411 | prefetch	[%i1], #n_writes | 
|  | 412 | prefetch	[%i2], #one_read | 
|  | 413 | prefetch	[%i3], #one_read | 
|  | 414 | rd		%asi, %g7 | 
|  | 415 | wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi | 
|  | 416 | srlx		%i0, 6, %g1 | 
|  | 417 | mov		%i1, %i0 | 
|  | 418 | mov		%i2, %i1 | 
|  | 419 | mov		%i3, %l7 | 
|  | 420 | 1:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */ | 
|  | 421 | ldda		[%i1 + 0x10] %asi, %i4	/* %i4/%i5 = src1 + 0x10 */ | 
|  | 422 | ldda		[%l7 + 0x00] %asi, %g2	/* %g2/%g3 = src2 + 0x00 */ | 
|  | 423 | ldda		[%l7 + 0x10] %asi, %l0	/* %l0/%l1 = src2 + 0x10 */ | 
|  | 424 | ldda		[%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */ | 
|  | 425 | ldda		[%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */ | 
|  | 426 | xor		%g2, %i2, %g2 | 
|  | 427 | xor		%g3, %i3, %g3 | 
|  | 428 | xor		%o0, %g2, %o0 | 
|  | 429 | xor		%o1, %g3, %o1 | 
|  | 430 | stxa		%o0, [%i0 + 0x00] %asi | 
|  | 431 | stxa		%o1, [%i0 + 0x08] %asi | 
|  | 432 | ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */ | 
|  | 433 | ldda		[%l7 + 0x20] %asi, %g2	/* %g2/%g3 = src2 + 0x20 */ | 
|  | 434 | ldda		[%i0 + 0x20] %asi, %o0	/* %o0/%o1 = dest + 0x20 */ | 
|  | 435 | xor		%l0, %i4, %l0 | 
|  | 436 | xor		%l1, %i5, %l1 | 
|  | 437 | xor		%o2, %l0, %o2 | 
|  | 438 | xor		%o3, %l1, %o3 | 
|  | 439 | stxa		%o2, [%i0 + 0x10] %asi | 
|  | 440 | stxa		%o3, [%i0 + 0x18] %asi | 
|  | 441 | ldda		[%i1 + 0x30] %asi, %i4	/* %i4/%i5 = src1 + 0x30 */ | 
|  | 442 | ldda		[%l7 + 0x30] %asi, %l0	/* %l0/%l1 = src2 + 0x30 */ | 
|  | 443 | ldda		[%i0 + 0x30] %asi, %o2	/* %o2/%o3 = dest + 0x30 */ | 
|  | 444 | prefetch	[%i1 + 0x40], #one_read | 
|  | 445 | prefetch	[%l7 + 0x40], #one_read | 
|  | 446 | prefetch	[%i0 + 0x40], #n_writes | 
|  | 447 | xor		%g2, %i2, %g2 | 
|  | 448 | xor		%g3, %i3, %g3 | 
|  | 449 | xor		%o0, %g2, %o0 | 
|  | 450 | xor		%o1, %g3, %o1 | 
|  | 451 | stxa		%o0, [%i0 + 0x20] %asi | 
|  | 452 | stxa		%o1, [%i0 + 0x28] %asi | 
|  | 453 | xor		%l0, %i4, %l0 | 
|  | 454 | xor		%l1, %i5, %l1 | 
|  | 455 | xor		%o2, %l0, %o2 | 
|  | 456 | xor		%o3, %l1, %o3 | 
|  | 457 | stxa		%o2, [%i0 + 0x30] %asi | 
|  | 458 | stxa		%o3, [%i0 + 0x38] %asi | 
|  | 459 | add		%i0, 0x40, %i0 | 
|  | 460 | add		%i1, 0x40, %i1 | 
|  | 461 | subcc		%g1, 1, %g1 | 
|  | 462 | bne,pt		%xcc, 1b | 
|  | 463 | add		%l7, 0x40, %l7 | 
|  | 464 | membar		#Sync | 
|  | 465 | wr		%g7, 0x0, %asi | 
|  | 466 | ret | 
|  | 467 | restore | 
|  | 468 | .size		xor_niagara_3, .-xor_niagara_3 | 
|  | 469 |  | 
|  | 470 | .globl		xor_niagara_4 | 
|  | 471 | .type		xor_niagara_4,#function | 
|  | 472 | xor_niagara_4:		/* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */ | 
|  | 473 | save		%sp, -192, %sp | 
|  | 474 | prefetch	[%i1], #n_writes | 
|  | 475 | prefetch	[%i2], #one_read | 
|  | 476 | prefetch	[%i3], #one_read | 
|  | 477 | prefetch	[%i4], #one_read | 
|  | 478 | rd		%asi, %g7 | 
|  | 479 | wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi | 
|  | 480 | srlx		%i0, 6, %g1 | 
|  | 481 | mov		%i1, %i0 | 
|  | 482 | mov		%i2, %i1 | 
|  | 483 | mov		%i3, %l7 | 
|  | 484 | mov		%i4, %l6 | 
|  | 485 | 1:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */ | 
|  | 486 | ldda		[%l7 + 0x00] %asi, %i4	/* %i4/%i5 = src2 + 0x00 */ | 
|  | 487 | ldda		[%l6 + 0x00] %asi, %g2	/* %g2/%g3 = src3 + 0x00 */ | 
|  | 488 | ldda		[%i0 + 0x00] %asi, %l0	/* %l0/%l1 = dest + 0x00 */ | 
|  | 489 | xor		%i4, %i2, %i4 | 
|  | 490 | xor		%i5, %i3, %i5 | 
|  | 491 | ldda		[%i1 + 0x10] %asi, %i2	/* %i2/%i3 = src1 + 0x10 */ | 
|  | 492 | xor		%g2, %i4, %g2 | 
|  | 493 | xor		%g3, %i5, %g3 | 
|  | 494 | ldda		[%i7 + 0x10] %asi, %i4	/* %i4/%i5 = src2 + 0x10 */ | 
|  | 495 | xor		%l0, %g2, %l0 | 
|  | 496 | xor		%l1, %g3, %l1 | 
|  | 497 | stxa		%l0, [%i0 + 0x00] %asi | 
|  | 498 | stxa		%l1, [%i0 + 0x08] %asi | 
|  | 499 | ldda		[%i6 + 0x10] %asi, %g2	/* %g2/%g3 = src3 + 0x10 */ | 
|  | 500 | ldda		[%i0 + 0x10] %asi, %l0	/* %l0/%l1 = dest + 0x10 */ | 
|  | 501 |  | 
|  | 502 | xor		%i4, %i2, %i4 | 
|  | 503 | xor		%i5, %i3, %i5 | 
|  | 504 | ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */ | 
|  | 505 | xor		%g2, %i4, %g2 | 
|  | 506 | xor		%g3, %i5, %g3 | 
|  | 507 | ldda		[%i7 + 0x20] %asi, %i4	/* %i4/%i5 = src2 + 0x20 */ | 
|  | 508 | xor		%l0, %g2, %l0 | 
|  | 509 | xor		%l1, %g3, %l1 | 
|  | 510 | stxa		%l0, [%i0 + 0x10] %asi | 
|  | 511 | stxa		%l1, [%i0 + 0x18] %asi | 
|  | 512 | ldda		[%i6 + 0x20] %asi, %g2	/* %g2/%g3 = src3 + 0x20 */ | 
|  | 513 | ldda		[%i0 + 0x20] %asi, %l0	/* %l0/%l1 = dest + 0x20 */ | 
|  | 514 |  | 
|  | 515 | xor		%i4, %i2, %i4 | 
|  | 516 | xor		%i5, %i3, %i5 | 
|  | 517 | ldda		[%i1 + 0x30] %asi, %i2	/* %i2/%i3 = src1 + 0x30 */ | 
|  | 518 | xor		%g2, %i4, %g2 | 
|  | 519 | xor		%g3, %i5, %g3 | 
|  | 520 | ldda		[%i7 + 0x30] %asi, %i4	/* %i4/%i5 = src2 + 0x30 */ | 
|  | 521 | xor		%l0, %g2, %l0 | 
|  | 522 | xor		%l1, %g3, %l1 | 
|  | 523 | stxa		%l0, [%i0 + 0x20] %asi | 
|  | 524 | stxa		%l1, [%i0 + 0x28] %asi | 
|  | 525 | ldda		[%i6 + 0x30] %asi, %g2	/* %g2/%g3 = src3 + 0x30 */ | 
|  | 526 | ldda		[%i0 + 0x30] %asi, %l0	/* %l0/%l1 = dest + 0x30 */ | 
|  | 527 |  | 
|  | 528 | prefetch	[%i1 + 0x40], #one_read | 
|  | 529 | prefetch	[%l7 + 0x40], #one_read | 
|  | 530 | prefetch	[%l6 + 0x40], #one_read | 
|  | 531 | prefetch	[%i0 + 0x40], #n_writes | 
|  | 532 |  | 
|  | 533 | xor		%i4, %i2, %i4 | 
|  | 534 | xor		%i5, %i3, %i5 | 
|  | 535 | xor		%g2, %i4, %g2 | 
|  | 536 | xor		%g3, %i5, %g3 | 
|  | 537 | xor		%l0, %g2, %l0 | 
|  | 538 | xor		%l1, %g3, %l1 | 
|  | 539 | stxa		%l0, [%i0 + 0x30] %asi | 
|  | 540 | stxa		%l1, [%i0 + 0x38] %asi | 
|  | 541 |  | 
|  | 542 | add		%i0, 0x40, %i0 | 
|  | 543 | add		%i1, 0x40, %i1 | 
|  | 544 | add		%l7, 0x40, %l7 | 
|  | 545 | subcc		%g1, 1, %g1 | 
|  | 546 | bne,pt		%xcc, 1b | 
|  | 547 | add		%l6, 0x40, %l6 | 
|  | 548 | membar		#Sync | 
|  | 549 | wr		%g7, 0x0, %asi | 
|  | 550 | ret | 
|  | 551 | restore | 
|  | 552 | .size		xor_niagara_4, .-xor_niagara_4 | 
|  | 553 |  | 
|  | 554 | .globl		xor_niagara_5 | 
|  | 555 | .type		xor_niagara_5,#function | 
|  | 556 | xor_niagara_5:		/* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3, %o5=src4 */ | 
|  | 557 | save		%sp, -192, %sp | 
|  | 558 | prefetch	[%i1], #n_writes | 
|  | 559 | prefetch	[%i2], #one_read | 
|  | 560 | prefetch	[%i3], #one_read | 
|  | 561 | prefetch	[%i4], #one_read | 
|  | 562 | prefetch	[%i5], #one_read | 
|  | 563 | rd		%asi, %g7 | 
|  | 564 | wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi | 
|  | 565 | srlx		%i0, 6, %g1 | 
|  | 566 | mov		%i1, %i0 | 
|  | 567 | mov		%i2, %i1 | 
|  | 568 | mov		%i3, %l7 | 
|  | 569 | mov		%i4, %l6 | 
|  | 570 | mov		%i5, %l5 | 
|  | 571 | 1:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */ | 
|  | 572 | ldda		[%l7 + 0x00] %asi, %i4	/* %i4/%i5 = src2 + 0x00 */ | 
|  | 573 | ldda		[%l6 + 0x00] %asi, %g2	/* %g2/%g3 = src3 + 0x00 */ | 
|  | 574 | ldda		[%l5 + 0x00] %asi, %l0	/* %l0/%l1 = src4 + 0x00 */ | 
|  | 575 | ldda		[%i0 + 0x00] %asi, %l2	/* %l2/%l3 = dest + 0x00 */ | 
|  | 576 | xor		%i4, %i2, %i4 | 
|  | 577 | xor		%i5, %i3, %i5 | 
|  | 578 | ldda		[%i1 + 0x10] %asi, %i2	/* %i2/%i3 = src1 + 0x10 */ | 
|  | 579 | xor		%g2, %i4, %g2 | 
|  | 580 | xor		%g3, %i5, %g3 | 
|  | 581 | ldda		[%l7 + 0x10] %asi, %i4	/* %i4/%i5 = src2 + 0x10 */ | 
|  | 582 | xor		%l0, %g2, %l0 | 
|  | 583 | xor		%l1, %g3, %l1 | 
|  | 584 | ldda		[%l6 + 0x10] %asi, %g2	/* %g2/%g3 = src3 + 0x10 */ | 
|  | 585 | xor		%l2, %l0, %l2 | 
|  | 586 | xor		%l3, %l1, %l3 | 
|  | 587 | stxa		%l2, [%i0 + 0x00] %asi | 
|  | 588 | stxa		%l3, [%i0 + 0x08] %asi | 
|  | 589 | ldda		[%l5 + 0x10] %asi, %l0	/* %l0/%l1 = src4 + 0x10 */ | 
|  | 590 | ldda		[%i0 + 0x10] %asi, %l2	/* %l2/%l3 = dest + 0x10 */ | 
|  | 591 |  | 
|  | 592 | xor		%i4, %i2, %i4 | 
|  | 593 | xor		%i5, %i3, %i5 | 
|  | 594 | ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */ | 
|  | 595 | xor		%g2, %i4, %g2 | 
|  | 596 | xor		%g3, %i5, %g3 | 
|  | 597 | ldda		[%l7 + 0x20] %asi, %i4	/* %i4/%i5 = src2 + 0x20 */ | 
|  | 598 | xor		%l0, %g2, %l0 | 
|  | 599 | xor		%l1, %g3, %l1 | 
|  | 600 | ldda		[%l6 + 0x20] %asi, %g2	/* %g2/%g3 = src3 + 0x20 */ | 
|  | 601 | xor		%l2, %l0, %l2 | 
|  | 602 | xor		%l3, %l1, %l3 | 
|  | 603 | stxa		%l2, [%i0 + 0x10] %asi | 
|  | 604 | stxa		%l3, [%i0 + 0x18] %asi | 
|  | 605 | ldda		[%l5 + 0x20] %asi, %l0	/* %l0/%l1 = src4 + 0x20 */ | 
|  | 606 | ldda		[%i0 + 0x20] %asi, %l2	/* %l2/%l3 = dest + 0x20 */ | 
|  | 607 |  | 
|  | 608 | xor		%i4, %i2, %i4 | 
|  | 609 | xor		%i5, %i3, %i5 | 
|  | 610 | ldda		[%i1 + 0x30] %asi, %i2	/* %i2/%i3 = src1 + 0x30 */ | 
|  | 611 | xor		%g2, %i4, %g2 | 
|  | 612 | xor		%g3, %i5, %g3 | 
|  | 613 | ldda		[%l7 + 0x30] %asi, %i4	/* %i4/%i5 = src2 + 0x30 */ | 
|  | 614 | xor		%l0, %g2, %l0 | 
|  | 615 | xor		%l1, %g3, %l1 | 
|  | 616 | ldda		[%l6 + 0x30] %asi, %g2	/* %g2/%g3 = src3 + 0x30 */ | 
|  | 617 | xor		%l2, %l0, %l2 | 
|  | 618 | xor		%l3, %l1, %l3 | 
|  | 619 | stxa		%l2, [%i0 + 0x20] %asi | 
|  | 620 | stxa		%l3, [%i0 + 0x28] %asi | 
|  | 621 | ldda		[%l5 + 0x30] %asi, %l0	/* %l0/%l1 = src4 + 0x30 */ | 
|  | 622 | ldda		[%i0 + 0x30] %asi, %l2	/* %l2/%l3 = dest + 0x30 */ | 
|  | 623 |  | 
|  | 624 | prefetch	[%i1 + 0x40], #one_read | 
|  | 625 | prefetch	[%l7 + 0x40], #one_read | 
|  | 626 | prefetch	[%l6 + 0x40], #one_read | 
|  | 627 | prefetch	[%l5 + 0x40], #one_read | 
|  | 628 | prefetch	[%i0 + 0x40], #n_writes | 
|  | 629 |  | 
|  | 630 | xor		%i4, %i2, %i4 | 
|  | 631 | xor		%i5, %i3, %i5 | 
|  | 632 | xor		%g2, %i4, %g2 | 
|  | 633 | xor		%g3, %i5, %g3 | 
|  | 634 | xor		%l0, %g2, %l0 | 
|  | 635 | xor		%l1, %g3, %l1 | 
|  | 636 | xor		%l2, %l0, %l2 | 
|  | 637 | xor		%l3, %l1, %l3 | 
|  | 638 | stxa		%l2, [%i0 + 0x30] %asi | 
|  | 639 | stxa		%l3, [%i0 + 0x38] %asi | 
|  | 640 |  | 
|  | 641 | add		%i0, 0x40, %i0 | 
|  | 642 | add		%i1, 0x40, %i1 | 
|  | 643 | add		%l7, 0x40, %l7 | 
|  | 644 | add		%l6, 0x40, %l6 | 
|  | 645 | subcc		%g1, 1, %g1 | 
|  | 646 | bne,pt		%xcc, 1b | 
|  | 647 | add		%l5, 0x40, %l5 | 
|  | 648 | membar		#Sync | 
|  | 649 | wr		%g7, 0x0, %asi | 
|  | 650 | ret | 
|  | 651 | restore | 
|  | 652 | .size		xor_niagara_5, .-xor_niagara_5 |