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