1 /* $NetBSD: pio_subr.S,v 1.18 2020/07/06 10:31:24 rin Exp $ */ 2 3 /* 4 * Copyright (c) 2003 Matt Thomas 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 18 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 * 29 */ 30 31 #ifdef _KERNEL_OPT 32 #include "opt_ppcarch.h" 33 #endif 34 35 /* 36 * Assembly note: 37 * We use rotlw instead of slw because rotlw ignores bit 26 and slw 38 * doesn't. However, this may make the high bits of the offset rotate 39 * in the low bits but if that happens then the offset was too large 40 * to being with. 41 */ 42 #ifdef DEBUG 43 #define DBGSYNC sync 44 #else 45 #define DBGSYNC /* nothing */ 46 #endif 47 48 #undef DBGSYNC 49 #if defined(PPC_IBM4XX) && !defined(PPC_IBM440) 50 #define DBGSYNC /* nothing; eieio is implemented as sync */ 51 #else 52 #define DBGSYNC msync 53 #endif 54 #define eieio mbar 0 55 56 /* LINTSTUB: include <sys/param.h> */ 57 /* LINTSTUB: include <sys/types.h> */ 58 /* LINTSTUB: include <sys/bus.h> */ 59 60 /* LINTSTUB: Func: void out8(volatile u_int8_t *a, u_int8_t v) */ 61 62 ENTRY(out8) 63 stbx %r4,0,%r3 64 eieio /* memory barrier (reorder protection) */ 65 DBGSYNC /* force exceptions */ 66 blr /* return */ 67 68 /* LINTSTUB: Func: void bsw1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */ 69 /* LINTSTUB: Func: void bsw1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v) */ 70 71 ENTRY(bsw1_s) 72 lwz %r0,0(%r3) /* get log2(stride) */ 73 rotlw %r5,%r5,%r0 /* shift offset */ 74 ENTRY(bsw1) 75 stbx %r6,%r4,%r5 /* store value */ 76 eieio /* memory barrier (reorder protection) */ 77 DBGSYNC /* force exceptions */ 78 blr /* return */ 79 80 /* LINTSTUB: Func: void out16(volatile u_int16_t *a, u_int16_t v) */ 81 82 ENTRY(out16) 83 sth %r4,0(%r3) 84 eieio /* memory barrier (reorder protection) */ 85 DBGSYNC /* force exceptions */ 86 blr /* return */ 87 88 /* LINTSTUB: Func: void bsw2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */ 89 /* LINTSTUB: Func: void bsw2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */ 90 91 ENTRY(bsw2_s) 92 lwz %r0,0(%r3) /* get log2(stride) */ 93 rotlw %r5,%r5,%r0 /* shift offset */ 94 ENTRY(bsw2) 95 sthx %r6,%r4,%r5 /* store value */ 96 eieio /* memory barrier (reorder protection) */ 97 DBGSYNC /* force exceptions */ 98 blr /* return */ 99 100 /* LINTSTUB: Func: void out32(volatile u_int32_t *a, u_int32_t v) */ 101 102 ENTRY(out32) 103 stw %r4,0(%r3) 104 eieio /* memory barrier (reorder protection) */ 105 DBGSYNC /* force exceptions */ 106 blr /* return */ 107 108 /* LINTSTUB: Func: void bsw4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */ 109 /* LINTSTUB: Func: void bsw4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */ 110 111 ENTRY(bsw4_s) 112 lwz %r0,0(%r3) /* get log2(stride) */ 113 rotlw %r5,%r5,%r0 /* shift offset */ 114 ENTRY(bsw4) 115 stwx %r6,%r4,%r5 /* store value */ 116 eieio /* memory barrier (reorder protection) */ 117 DBGSYNC /* force exceptions */ 118 blr /* return */ 119 120 /* LINTSTUB: Func: void bsw8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */ 121 /* LINTSTUB: Func: void bsw8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */ 122 ENTRY(bsw8_s) 123 lwz %r0,0(%r3) /* get log2(stride) */ 124 rotlw %r5,%r5,%r0 /* shift offset */ 125 ENTRY(bsw8) 126 #ifdef __ARCH64__ 127 stdx %r6,%r4,%r5 /* store value */ 128 #else 129 trap /* die */ 130 #endif 131 eieio /* memory barrier (reorder protection) */ 132 DBGSYNC /* force exceptions */ 133 blr /* return */ 134 135 /* LINTSTUB: Func: void out16rb(volatile u_int16_t *a, u_int16_t v) */ 136 137 ENTRY(out16rb) 138 sthbrx %r4,0,%r3 139 eieio /* memory barrier (reorder protection) */ 140 DBGSYNC /* force exceptions */ 141 blr /* return */ 142 143 /* LINTSTUB: Func: void bsw2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */ 144 /* LINTSTUB: Func: void bsw2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t v) */ 145 146 147 ENTRY(bsw2rb_s) 148 lwz %r0,0(%r3) /* get log2(stride) */ 149 rotlw %r5,%r5,%r0 /* shift offset */ 150 ENTRY(bsw2rb) 151 sthbrx %r6,%r4,%r5 /* store value */ 152 eieio /* memory barrier (reorder protection) */ 153 DBGSYNC /* force exceptions */ 154 blr /* return */ 155 156 /* LINTSTUB: Func: void out32rb(volatile u_int32_t *a, u_int32_t v) */ 157 158 ENTRY(out32rb) 159 stwbrx %r4,0,%r3 160 eieio /* memory barrier (reorder protection) */ 161 DBGSYNC /* force exceptions */ 162 blr /* return */ 163 164 /* LINTSTUB: Func: void bsw4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */ 165 /* LINTSTUB: Func: void bsw4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t v) */ 166 167 ENTRY(bsw4rb_s) 168 lwz %r0,0(%r3) /* get log2(stride) */ 169 rotlw %r5,%r5,%r0 /* shift offset */ 170 ENTRY(bsw4rb) 171 stwbrx %r6,%r4,%r5 /* store value */ 172 eieio /* memory barrier (reorder protection) */ 173 DBGSYNC /* force exceptions */ 174 blr /* return */ 175 176 /* LINTSTUB: Func: void bsw8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */ 177 /* LINTSTUB: Func: void bsw8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t v) */ 178 179 ENTRY(bsw8rb_s) 180 lwz %r0,0(%r3) /* get log2(stride) */ 181 rotlw %r5,%r5,%r0 /* shift offset */ 182 ENTRY(bsw8rb) 183 #ifdef __ARCH64__ 184 stdbrx %r6,%r4,%r5 /* store value */ 185 #else 186 trap /* die */ 187 #endif 188 eieio /* memory barrier (reorder protection) */ 189 DBGSYNC /* force exceptions */ 190 blr /* return */ 191 192 /* LINTSTUB: Func: int in8(const volatile u_int8_t *a) */ 193 194 ENTRY(in8) 195 lbz %r3,0(%r3) 196 eieio /* memory barrier (reorder protection) */ 197 DBGSYNC /* force exceptions */ 198 blr /* return */ 199 200 /* LINTSTUB: Func: int bsr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 201 /* LINTSTUB: Func: int bsr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 202 203 ENTRY(bsr1_s) 204 lwz %r0,0(%r3) /* get log2(stride) */ 205 rotlw %r5,%r5,%r0 /* shift offset */ 206 ENTRY(bsr1) 207 lbzx %r3,%r4,%r5 /* load value */ 208 eieio /* memory barrier (reorder protection) */ 209 DBGSYNC /* force exceptions */ 210 blr /* return */ 211 212 /* LINTSTUB: Func: int in16(const volatile u_int16_t *a) */ 213 214 ENTRY(in16) 215 lhz %r3,0(%r3) 216 eieio /* memory barrier (reorder protection) */ 217 DBGSYNC /* force exceptions */ 218 blr /* return */ 219 220 /* LINTSTUB: Func: int bsr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 221 /* LINTSTUB: Func: int bsr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 222 223 ENTRY(bsr2_s) 224 lwz %r0,0(%r3) /* get log2(stride) */ 225 rotlw %r5,%r5,%r0 /* shift offset */ 226 ENTRY(bsr2) 227 lhzx %r3,%r4,%r5 /* load value */ 228 eieio /* memory barrier (reorder protection) */ 229 DBGSYNC /* force exceptions */ 230 blr /* return */ 231 232 /* LINTSTUB: Func: int in32(const volatile u_int32_t *a) */ 233 234 ENTRY(in32) 235 lwz %r3,0(%r3) 236 eieio /* memory barrier (reorder protection) */ 237 DBGSYNC /* force exceptions */ 238 blr /* return */ 239 240 /* LINTSTUB: Func: int bsr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 241 /* LINTSTUB: Func: int bsr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 242 243 ENTRY(bsr4_s) 244 lwz %r0,0(%r3) /* get log2(stride) */ 245 rotlw %r5,%r5,%r0 /* shift offset */ 246 ENTRY(bsr4) 247 lwzx %r3,%r4,%r5 /* load value */ 248 eieio /* memory barrier (reorder protection) */ 249 DBGSYNC /* force exceptions */ 250 blr /* return */ 251 252 /* LINTSTUB: Func: u_int64_t bsr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 253 /* LINTSTUB: Func: u_int64_t bsr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 254 255 ENTRY(bsr8_s) 256 lwz %r0,0(%r3) /* get log2(stride) */ 257 rotlw %r5,%r5,%r0 /* shift offset */ 258 ENTRY(bsr8) 259 #ifdef __ARCH64__ 260 lwdx %r3,%r4,%r5 /* load value */ 261 #else 262 trap 263 #endif 264 eieio /* memory barrier (reorder protection) */ 265 DBGSYNC /* force exceptions */ 266 blr /* return */ 267 268 /* LINTSTUB: Func: int in16rb(const volatile u_int16_t *a) */ 269 270 ENTRY(in16rb) 271 lhbrx %r3,0,%r3 272 eieio /* memory barrier (reorder protection) */ 273 DBGSYNC /* force exceptions */ 274 blr /* return */ 275 276 /* LINTSTUB: Func: int bsr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 277 /* LINTSTUB: Func: int bsr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 278 279 ENTRY(bsr2rb_s) 280 lwz %r0,0(%r3) /* get log2(stride) */ 281 rotlw %r5,%r5,%r0 /* shift offset */ 282 ENTRY(bsr2rb) 283 lhbrx %r3,%r4,%r5 /* load value */ 284 eieio /* memory barrier (reorder protection) */ 285 DBGSYNC /* force exceptions */ 286 blr /* return */ 287 288 /* LINTSTUB: Func: int in32rb(const volatile u_int32_t *a) */ 289 290 ENTRY(in32rb) 291 lwbrx %r3,0,%r3 292 eieio /* memory barrier (reorder protection) */ 293 DBGSYNC /* force exceptions */ 294 blr /* return */ 295 296 /* LINTSTUB: Func: int bsr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 297 /* LINTSTUB: Func: int bsr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 298 299 ENTRY(bsr4rb_s) 300 lwz %r0,0(%r3) /* get log2(stride) */ 301 rotlw %r5,%r5,%r0 /* shift offset */ 302 ENTRY(bsr4rb) 303 lwbrx %r3,%r4,%r5 /* load value */ 304 eieio /* memory barrier (reorder protection) */ 305 DBGSYNC /* force exceptions */ 306 blr /* return */ 307 308 /* LINTSTUB: Func: u_int64_t bsr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 309 /* LINTSTUB: Func: u_int64_t bsr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o) */ 310 311 ENTRY(bsr8rb_s) 312 lwz %r0,0(%r3) /* get log2(stride) */ 313 rotlw %r5,%r5,%r0 /* shift offset */ 314 ENTRY(bsr8rb) 315 #ifdef __ARCH64__ 316 ldbrx %r3,%r4,%r5 /* load value */ 317 #else 318 trap 319 #endif 320 eieio /* memory barrier (reorder protection) */ 321 DBGSYNC /* force exceptions */ 322 blr /* return */ 323 324 /* LINTSTUB: Func: void bswm1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *addr, bus_size_t len) */ 325 /* LINTSTUB: Func: void bswm1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *addr, bus_size_t len) */ 326 /* LINTSTUB: Func: void outs8(volatile u_int8_t *dst, const u_int8_t *src, size_t len) */ 327 328 ENTRY(bswm1_s) 329 lwz %r0,0(%r3) /* get log2(stride) */ 330 rotlw %r5,%r5,%r0 /* shift offset */ 331 ENTRY(bswm1) 332 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 333 mr %r4,%r6 /* move addr to argument 1 register */ 334 mr %r5,%r7 /* move count to argument 2 register */ 335 ENTRY(outs8) 336 cmpwi %r5,0 /* len == 0? */ 337 beqlr- /* return if len == 0 */ 338 addi %r5,%r5,-1 /* len -= 1 */ 339 add %r5,%r5,%r4 /* len += src */ 340 addi %r4,%r4,-1 /* pre-decrement */ 341 1: lbzu %r0,1(%r4) /* load and increment */ 342 stb %r0,0(%r3) /* store */ 343 cmplw %r4,%r5 /* at the end? */ 344 bne+ 1b /* nope, do another pass */ 345 eieio /* memory barrier (reorder protection) */ 346 DBGSYNC /* force exceptions */ 347 blr /* return */ 348 349 /* LINTSTUB: Func: void bswm2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */ 350 /* LINTSTUB: Func: void bswm2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */ 351 /* LINTSTUB: Func: void outs16(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */ 352 353 ENTRY(bswm2_s) 354 lwz %r0,0(%r3) /* get log2(stride) */ 355 rotlw %r5,%r5,%r0 /* shift offset */ 356 ENTRY(bswm2) 357 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 358 mr %r4,%r6 /* move addr to argument 1 register */ 359 mr %r5,%r7 /* move count to argument 2 register */ 360 ENTRY(outs16) 361 cmpwi %r5,0 /* len == 0? */ 362 beqlr- /* return if len == 0 */ 363 addi %r5,%r5,-1 /* len -= 1 */ 364 slwi %r5,%r5,1 /* len *= 2 */ 365 add %r5,%r5,%r4 /* len += src */ 366 addi %r4,%r4,-2 /* pre-decrement */ 367 1: lhzu %r0,2(%r4) /* load and increment */ 368 sth %r0,0(%r3) /* store */ 369 cmplw %r4,%r5 /* at the end? */ 370 bne+ 1b /* nope, do another pass */ 371 eieio /* memory barrier (reorder protection) */ 372 DBGSYNC /* force exceptions */ 373 blr /* return */ 374 375 /* LINTSTUB: Func: void bswm4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */ 376 /* LINTSTUB: Func: void bswm4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */ 377 /* LINTSTUB: Func: void outs32(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */ 378 379 ENTRY(bswm4_s) 380 lwz %r0,0(%r3) /* get log2(stride) */ 381 rotlw %r5,%r5,%r0 /* shift offset */ 382 ENTRY(bswm4) 383 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 384 mr %r4,%r6 /* move addr to argument 1 register */ 385 mr %r5,%r7 /* move count to argument 2 register */ 386 ENTRY(outs32) 387 cmpwi %r5,0 /* len == 0? */ 388 beqlr- /* return if len == 0 */ 389 addi %r5,%r5,-1 /* len -= 1 */ 390 slwi %r5,%r5,2 /* len *= 4 */ 391 add %r5,%r5,%r4 /* len += src */ 392 addi %r4,%r4,-4 /* pre-decrement */ 393 1: lwzu %r0,4(%r4) /* load and increment */ 394 stw %r0,0(%r3) /* store */ 395 cmplw %r4,%r5 /* at the end? */ 396 bne+ 1b /* nope, do another pass */ 397 eieio /* memory barrier (reorder protection) */ 398 DBGSYNC /* force exceptions */ 399 blr /* return */ 400 401 /* LINTSTUB: Func: void bswm8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */ 402 /* LINTSTUB: Func: void bswm8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */ 403 404 #ifdef _LP64 405 ENTRY(bswm8_s) 406 ld %r0,0(%r3) /* get log2(stride) */ 407 rotld %r5,%r5,%r0 /* shift offset */ 408 ENTRY(bswm8) 409 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 410 mr %r4,%r6 /* move addr to argument 1 register */ 411 mr %r5,%r7 /* move count to argument 2 register */ 412 ENTRY(outs64) 413 cmpdi %r5,0 /* len == 0? */ 414 beqlr- /* return if len == 0 */ 415 addi %r5,%r5,-1 /* len -= 1 */ 416 sldi %r5,%r5,2 /* len *= 4 */ 417 add %r5,%r5,%r4 /* len += src */ 418 addi %r4,%r4,-4 /* pre-decrement */ 419 1: ldu %r0,4(%r4) /* load and increment */ 420 std %r0,0(%r3) /* store */ 421 cmplw %r4,%r5 /* at the end? */ 422 bne+ 1b /* nope, do another pass */ 423 eieio /* memory barrier (reorder protection) */ 424 DBGSYNC /* force exceptions */ 425 blr /* return */ 426 #else 427 ENTRY(bswm8_s) 428 ENTRY(bswm8) 429 trap /* die */ 430 #endif 431 432 /* LINTSTUB: Func: void bswm2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */ 433 /* LINTSTUB: Func: void bswm2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *addr, bus_size_t len) */ 434 /* LINTSTUB: Func: void outs16rb(volatile u_int16_t *dst, const u_int16_t *src, size_t len) */ 435 436 ENTRY(bswm2rb_s) 437 lwz %r0,0(%r3) /* get log2(stride) */ 438 rotlw %r5,%r5,%r0 /* shift offset */ 439 ENTRY(bswm2rb) 440 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 441 mr %r4,%r6 /* move addr to argument 1 register */ 442 mr %r5,%r7 /* move count to argument 2 register */ 443 ENTRY(outs16rb) 444 cmpwi %r5,0 /* len == 0? */ 445 beqlr- /* return if len == 0 */ 446 addi %r5,%r5,-1 /* len -= 1 */ 447 slwi %r5,%r5,1 /* len *= 2 */ 448 add %r5,%r5,%r4 /* len += src */ 449 addi %r4,%r4,-2 /* pre-decrement */ 450 1: lwzu %r0,2(%r4) /* load and increment */ 451 sthbrx %r0,0,%r3 /* store (byte-reversed) */ 452 cmplw %r4,%r5 /* at the end? */ 453 bne+ 1b /* nope, do another pass */ 454 eieio /* memory barrier (reorder protection) */ 455 DBGSYNC /* force exceptions */ 456 blr /* return */ 457 458 /* LINTSTUB: Func: void bswm4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */ 459 /* LINTSTUB: Func: void bswm4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *addr, bus_size_t len) */ 460 /* LINTSTUB: Func: void outs32rb(volatile u_int32_t *dst, const u_int32_t *src, size_t len) */ 461 462 ENTRY(bswm4rb_s) 463 lwz %r0,0(%r3) /* get log2(stride) */ 464 rotlw %r5,%r5,%r0 /* shift offset */ 465 ENTRY(bswm4rb) 466 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 467 mr %r4,%r6 /* move addr to argument 1 register */ 468 mr %r5,%r7 /* move count to argument 2 register */ 469 ENTRY(outs32rb) 470 cmpwi %r5,0 /* len == 0? */ 471 beqlr- /* return if len == 0 */ 472 addi %r5,%r5,-1 /* len -= 1 */ 473 slwi %r5,%r5,2 /* len *= 4 */ 474 add %r5,%r5,%r4 /* len += src */ 475 addi %r4,%r4,-4 /* pre-decrement */ 476 1: lwzu %r0,4(%r4) /* load and increment */ 477 stwbrx %r0,0,%r3 /* store (byte-reversed) */ 478 cmplw %r4,%r5 /* at the end? */ 479 bne+ 1b /* nope, do another pass */ 480 eieio /* memory barrier (reorder protection) */ 481 DBGSYNC /* force exceptions */ 482 blr /* return */ 483 484 /* LINTSTUB: Func: void bswm8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */ 485 /* LINTSTUB: Func: void bswm8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *addr, bus_size_t len) */ 486 ENTRY(bswm8rb_s) 487 ENTRY(bswm8rb) 488 trap 489 490 /* LINTSTUB: Func: void bsrm1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *addr, bus_size_t len) */ 491 /* LINTSTUB: Func: void bsrm1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *addr, bus_size_t len) */ 492 /* LINTSTUB: Func: void ins8(const volatile u_int8_t *src, u_int8_t *dst, size_t len) */ 493 494 ENTRY(bsrm1_s) 495 lwz %r0,0(%r3) /* get log2(stride) */ 496 rotlw %r5,%r5,%r0 /* shift offset */ 497 ENTRY(bsrm1) 498 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 499 mr %r4,%r6 /* move addr to argument 1 register */ 500 mr %r5,%r7 /* move count to argument 2 register */ 501 ENTRY(ins8) 502 cmpwi %r5,0 /* len == 0? */ 503 beqlr- /* return if len == 0 */ 504 addi %r5,%r5,-1 /* len -= 1 */ 505 add %r5,%r5,%r4 /* len += src */ 506 addi %r4,%r4,-1 /* pre-decrement */ 507 1: lbz %r0,0(%r3) /* load value */ 508 stbu %r0,1(%r4) /* store and increment */ 509 cmplw %r4,%r5 /* at the end? */ 510 bne+ 1b /* nope, do another pass */ 511 eieio /* memory barrier (reorder protection) */ 512 DBGSYNC /* force exceptions */ 513 blr /* return */ 514 515 /* LINTSTUB: Func: void bsrm2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */ 516 /* LINTSTUB: Func: void bsrm2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */ 517 /* LINTSTUB: Func: void ins16(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */ 518 519 ENTRY(bsrm2_s) 520 lwz %r0,0(%r3) /* get log2(stride) */ 521 rotlw %r5,%r5,%r0 /* shift offset */ 522 ENTRY(bsrm2) 523 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 524 mr %r4,%r6 /* move addr to argument 1 register */ 525 mr %r5,%r7 /* move count to argument 2 register */ 526 ENTRY(ins16) 527 cmpwi %r5,0 /* len == 0? */ 528 beqlr- /* return if len == 0 */ 529 addi %r5,%r5,-1 /* len -= 1 */ 530 slwi %r5,%r5,1 /* len *= 2 */ 531 add %r5,%r5,%r4 /* len += src */ 532 addi %r4,%r4,-2 /* pre-decrement */ 533 1: lhz %r0,0(%r3) /* load value */ 534 sthu %r0,2(%r4) /* store and increment */ 535 cmplw %r4,%r5 /* at the end? */ 536 bne+ 1b /* nope, do another pass */ 537 eieio /* memory barrier (reorder protection) */ 538 DBGSYNC /* force exceptions */ 539 blr /* return */ 540 541 /* LINTSTUB: Func: void bsrm4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */ 542 /* LINTSTUB: Func: void bsrm4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */ 543 /* LINTSTUB: Func: void ins32(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */ 544 545 ENTRY(bsrm4_s) 546 lwz %r0,0(%r3) /* get log2(stride) */ 547 rotlw %r5,%r5,%r0 /* shift offset */ 548 ENTRY(bsrm4) 549 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 550 mr %r4,%r6 /* move addr to argument 1 register */ 551 mr %r5,%r7 /* move count to argument 2 register */ 552 ENTRY(ins32) 553 cmpwi %r5,0 /* len == 0? */ 554 beqlr- /* return if len == 0 */ 555 addi %r5,%r5,-1 /* len -= 1 */ 556 slwi %r5,%r5,2 /* len *= 4 */ 557 add %r5,%r5,%r4 /* len += src */ 558 addi %r4,%r4,-4 /* pre-decrement */ 559 1: lwz %r0,0(%r3) /* load value */ 560 stwu %r0,4(%r4) /* store and increment */ 561 cmplw %r4,%r5 /* at the end? */ 562 bne+ 1b /* nope, do another pass */ 563 eieio /* memory barrier (reorder protection) */ 564 DBGSYNC /* force exceptions */ 565 blr /* return */ 566 567 /* LINTSTUB: Func: void bsrm8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */ 568 /* LINTSTUB: Func: void bsrm8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */ 569 ENTRY(bsrm8_s) 570 ENTRY(bsrm8) 571 trap 572 573 /* LINTSTUB: Func: void bsrm2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *addr, bus_size_t len) */ 574 /* LINTSTUB: Func: void ins16rb(const volatile u_int16_t *src, u_int16_t *dst, size_t len) */ 575 576 ENTRY(bsrm2rb_s) 577 lwz %r0,0(%r3) /* get log2(stride) */ 578 rotlw %r5,%r5,%r0 /* shift offset */ 579 ENTRY(bsrm2rb) 580 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 581 mr %r4,%r6 /* move addr to argument 1 register */ 582 mr %r5,%r7 /* move count to argument 2 register */ 583 ENTRY(ins16rb) 584 cmpwi %r5,0 /* len == 0? */ 585 beqlr- /* return if len == 0 */ 586 addi %r5,%r5,-1 /* len -= 1 */ 587 slwi %r5,%r5,1 /* len *= 2 */ 588 add %r5,%r5,%r4 /* len += src */ 589 addi %r4,%r4,-2 /* pre-decrement */ 590 1: lhbrx %r0,0,%r3 /* load value (byte reversed) */ 591 sthu %r0,2(%r4) /* store and increment */ 592 cmplw %r4,%r5 /* at the end? */ 593 bne+ 1b /* nope, do another pass */ 594 eieio /* memory barrier (reorder protection) */ 595 DBGSYNC /* force exceptions */ 596 blr /* return */ 597 598 /* LINTSTUB: Func: void bsrm4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */ 599 /* LINTSTUB: Func: void bsrm4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *addr, bus_size_t len) */ 600 /* LINTSTUB: Func: void ins32rb(const volatile u_int32_t *src, u_int32_t *dst, size_t len) */ 601 ENTRY(bsrm4rb_s) 602 lwz %r0,0(%r3) /* get log2(stride) */ 603 rotlw %r5,%r5,%r0 /* shift offset */ 604 ENTRY(bsrm4rb) 605 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 606 mr %r4,%r6 /* move addr to argument 1 register */ 607 mr %r5,%r7 /* move count to argument 2 register */ 608 ENTRY(ins32rb) 609 cmpwi %r5,0 /* len == 0? */ 610 beqlr- /* return if len == 0 */ 611 addi %r5,%r5,-1 /* len -= 1 */ 612 slwi %r5,%r5,2 /* len *= 4 */ 613 add %r5,%r5,%r4 /* len += src */ 614 addi %r4,%r4,-4 /* pre-decrement */ 615 1: lwbrx %r0,0,%r3 /* load value (byte reversed) */ 616 stwu %r0,4(%r4) /* store and increment */ 617 cmplw %r4,%r5 /* at the end? */ 618 bne+ 1b /* nope, do another pass */ 619 eieio /* memory barrier (reorder protection) */ 620 DBGSYNC /* force exceptions */ 621 blr /* return */ 622 623 /* LINTSTUB: Func: void bsrm8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */ 624 /* LINTSTUB: Func: void bsrm8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *addr, bus_size_t len) */ 625 ENTRY(bsrm8rb_s) 626 ENTRY(bsrm8rb) 627 trap 628 629 /* LINTSTUB: Func: void bswr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c); */ 630 /* LINTSTUB: Func: void bswr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c); */ 631 ENTRY(bswr1_s) 632 lwz %r0,0(%r3) /* get log2(stride) */ 633 li %r8,1 /* distance between dst bytes */ 634 rotlw %r5,%r5,%r0 /* shift offset */ 635 rotlw %r8,%r8,%r0 /* shift distance */ 636 b .Lbswr1_enter 637 ENTRY(bswr1) 638 li %r8,1 /* distance between dst bytes */ 639 .Lbswr1_enter: 640 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 641 cmpwi %r7,0 /* len == 0? */ 642 beqlr- /* return if len == 0 */ 643 addi %r7,%r7,-1 /* len -= 1 */ 644 add %r7,%r7,%r6 /* len += src */ 645 addi %r6,%r6,-1 /* pre-decrement */ 646 sub %r3,%r3,%r8 647 1: lbzu %r0,1(%r6) /* load and increment */ 648 stbux %r0,%r3,%r8 /* store and add distance */ 649 cmplw %r6,%r7 /* at the end? */ 650 bne+ 1b /* nope, do another pass */ 651 eieio /* memory barrier (reorder protection) */ 652 DBGSYNC /* force exceptions */ 653 blr /* return */ 654 655 /* LINTSTUB: Func: void bswr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */ 656 /* LINTSTUB: Func: void bswr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */ 657 ENTRY(bswr2_s) 658 lwz %r0,0(%r3) /* get log2(stride) */ 659 li %r8,2 /* distance between dst halfwords */ 660 rotlw %r5,%r5,%r0 /* shift offset */ 661 rotlw %r8,%r8,%r0 /* shift distance */ 662 b .Lbswr2_enter 663 ENTRY(bswr2) 664 li %r8,2 /* distance between dst halfwords */ 665 .Lbswr2_enter: 666 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 667 cmpwi %r7,0 /* len == 0? */ 668 beqlr- /* return if len == 0 */ 669 addi %r7,%r7,-1 /* len -= 1 */ 670 slwi %r7,%r7,1 /* len *= 2 */ 671 add %r7,%r7,%r6 /* len += src */ 672 addi %r6,%r6,-2 /* pre-decrement */ 673 sub %r3,%r3,%r8 674 1: lhzu %r0,2(%r6) /* load and increment */ 675 sthux %r0,%r3,%r8 /* store and add distance */ 676 cmplw %r6,%r7 /* at the end? */ 677 bne+ 1b /* nope, do another pass */ 678 eieio /* memory barrier (reorder protection) */ 679 DBGSYNC /* force exceptions */ 680 blr /* return */ 681 682 /* LINTSTUB: Func: void bswr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */ 683 /* LINTSTUB: Func: void bswr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); */ 684 ENTRY(bswr2rb_s) 685 lwz %r0,0(%r3) /* get log2(stride) */ 686 li %r8,2 /* distance between dst halfwords */ 687 rotlw %r5,%r5,%r0 /* shift offset */ 688 rotlw %r8,%r8,%r0 /* shift distance */ 689 b .Lbswr2rb_enter 690 ENTRY(bswr2rb) 691 li %r8,2 /* distance between dst halfwords */ 692 .Lbswr2rb_enter: 693 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 694 cmpwi %r7,0 /* len == 0? */ 695 beqlr- /* return if len == 0 */ 696 addi %r7,%r7,-1 /* len -= 1 */ 697 slwi %r7,%r7,1 /* len *= 2 */ 698 add %r7,%r7,%r6 /* len += src */ 699 addi %r6,%r6,-2 /* pre-decrement */ 700 1: lhzu %r0,2(%r6) /* load and increment */ 701 sthbrx %r0,0,%r3 /* store (reversed) */ 702 add %r3,%r3,%r8 /* dst += distance */ 703 cmplw %r6,%r7 /* at the end? */ 704 bne+ 1b /* nope, do another pass */ 705 eieio /* memory barrier (reorder protection) */ 706 DBGSYNC /* force exceptions */ 707 blr /* return */ 708 709 /* LINTSTUB: Func: void bswr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */ 710 /* LINTSTUB: Func: void bswr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */ 711 ENTRY(bswr4_s) 712 lwz %r0,0(%r3) /* get log2(stride) */ 713 li %r8,4 /* distance between dst halfwords */ 714 rotlw %r5,%r5,%r0 /* shift offset */ 715 rotlw %r8,%r8,%r0 /* shift distance */ 716 b .Lbswr4_enter 717 ENTRY(bswr4) 718 li %r8,4 /* distance between dst halfwords */ 719 .Lbswr4_enter: 720 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 721 cmpwi %r7,0 /* len == 0? */ 722 beqlr- /* return if len == 0 */ 723 addi %r7,%r7,-1 /* len -= 1 */ 724 slwi %r7,%r7,2 /* len *= 4 */ 725 add %r7,%r7,%r6 /* len += src */ 726 addi %r6,%r6,-4 /* pre-decrement */ 727 sub %r3,%r3,%r8 728 1: lwzu %r0,4(%r6) /* load and increment */ 729 stwux %r0,%r3,%r8 /* store and add distance */ 730 cmplw %r6,%r7 /* at the end? */ 731 bne+ 1b /* nope, do another pass */ 732 eieio /* memory barrier (reorder protection) */ 733 DBGSYNC /* force exceptions */ 734 blr /* return */ 735 736 /* LINTSTUB: Func: void bswr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */ 737 /* LINTSTUB: Func: void bswr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); */ 738 ENTRY(bswr4rb_s) 739 lwz %r0,0(%r3) /* get log2(stride) */ 740 li %r8,4 /* distance between dst halfwords */ 741 rotlw %r5,%r5,%r0 /* shift offset */ 742 rotlw %r8,%r8,%r0 /* shift distance */ 743 b .Lbswr4rb_enter 744 ENTRY(bswr4rb) 745 li %r8,4 /* distance between dst halfwords */ 746 .Lbswr4rb_enter: 747 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 748 cmpwi %r7,0 /* len == 0? */ 749 beqlr- /* return if len == 0 */ 750 addi %r7,%r7,-1 /* len -= 1 */ 751 slwi %r7,%r7,2 /* len *= 4 */ 752 add %r7,%r7,%r6 /* len += src */ 753 addi %r6,%r6,-4 /* pre-decrement */ 754 1: lwzu %r0,4(%r6) /* load and increment */ 755 stwbrx %r0,0,%r3 /* store (reversed) */ 756 add %r3,%r3,%r8 /* dst += distance */ 757 cmplw %r6,%r7 /* at the end? */ 758 bne+ 1b /* nope, do another pass */ 759 eieio /* memory barrier (reorder protection) */ 760 DBGSYNC /* force exceptions */ 761 blr /* return */ 762 763 /* LINTSTUB: Func: void bswr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */ 764 /* LINTSTUB: Func: void bswr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */ 765 /* LINTSTUB: Func: void bswr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */ 766 /* LINTSTUB: Func: void bswr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); */ 767 ENTRY(bswr8_s) 768 ENTRY(bswr8rb_s) 769 lwz %r0,0(%r3) 770 rotlw %r5,%r5,%r0 771 ENTRY(bswr8) 772 ENTRY(bswr8rb) 773 trap 774 775 /* LINTSTUB: Func: void bsrr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c); */ 776 /* LINTSTUB: Func: void bsrr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c); */ 777 ENTRY(bsrr1_s) 778 lwz %r0,0(%r3) /* get log2(stride) */ 779 li %r8,1 /* distance between src bytes */ 780 rotlw %r5,%r5,%r0 /* shift offset */ 781 rotlw %r8,%r8,%r0 /* shift distance */ 782 b .Lbsrr1_enter 783 ENTRY(bsrr1) 784 li %r8,1 /* distance between src bytes */ 785 .Lbsrr1_enter: 786 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 787 cmpwi %r7,0 /* len == 0? */ 788 beqlr- /* return if len == 0 */ 789 addi %r7,%r7,-1 /* len -= 1 */ 790 add %r7,%r7,%r6 /* len += src */ 791 addi %r6,%r6,-1 /* pre-decrement */ 792 sub %r3,%r3,%r8 793 1: lbzux %r0,%r3,%r8 /* load value and add distance */ 794 stbu %r0,1(%r6) /* store and increment */ 795 cmplw %r6,%r7 /* at the end? */ 796 bne+ 1b /* nope, do another pass */ 797 eieio /* memory barrier (reorder protection) */ 798 DBGSYNC /* force exceptions */ 799 blr /* return */ 800 801 /* LINTSTUB: Func: void bsrr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */ 802 /* LINTSTUB: Func: void bsrr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */ 803 ENTRY(bsrr2_s) 804 lwz %r0,0(%r3) /* get log2(stride) */ 805 li %r8,2 /* distance between src halfwords */ 806 rotlw %r5,%r5,%r0 /* shift offset */ 807 rotlw %r8,%r8,%r0 /* shift distance */ 808 b .Lbsrr2_enter 809 ENTRY(bsrr2) 810 li %r8,2 /* distance between src halfwords */ 811 .Lbsrr2_enter: 812 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 813 cmpwi %r7,0 /* len == 0? */ 814 beqlr- /* return if len == 0 */ 815 addi %r7,%r7,-1 /* len -= 1 */ 816 slwi %r7,%r7,1 /* len *= 2 */ 817 add %r7,%r7,%r6 /* len += src */ 818 addi %r6,%r6,-2 /* pre-decrement */ 819 sub %r3,%r3,%r8 820 1: lhzux %r0,%r3,%r8 /* load value and add distance */ 821 sthu %r0,2(%r6) /* store and increment */ 822 cmplw %r6,%r7 /* at the end? */ 823 bne+ 1b /* nope, do another pass */ 824 eieio /* memory barrier (reorder protection) */ 825 DBGSYNC /* force exceptions */ 826 blr /* return */ 827 828 /* LINTSTUB: Func: void bsrr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */ 829 /* LINTSTUB: Func: void bsrr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c); */ 830 ENTRY(bsrr2rb_s) 831 lwz %r0,0(%r3) /* get log2(stride) */ 832 li %r8,2 /* distance between source halfwords */ 833 rotlw %r5,%r5,%r0 /* shift offset */ 834 rotlw %r8,%r8,%r0 /* shift distance */ 835 b .Lbsrr2rb_enter 836 ENTRY(bsrr2rb) 837 li %r8,2 /* distance between source halfwords */ 838 .Lbsrr2rb_enter: 839 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 840 cmpwi %r7,0 /* len == 0? */ 841 beqlr- /* return if len == 0 */ 842 addi %r7,%r7,-1 /* len -= 1 */ 843 slwi %r7,%r7,1 /* len *= 2 */ 844 add %r7,%r7,%r6 /* len += src */ 845 addi %r6,%r6,-2 /* pre-decrement */ 846 1: lhbrx %r0,0,%r3 /* load value (reversed) */ 847 add %r3,%r3,%r8 /* src += distance */ 848 sthu %r0,2(%r6) /* store and increment */ 849 cmplw %r6,%r7 /* at the end? */ 850 bne+ 1b /* nope, do another pass */ 851 eieio /* memory barrier (reorder protection) */ 852 DBGSYNC /* force exceptions */ 853 blr /* return */ 854 855 /* LINTSTUB: Func: void bsrr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */ 856 /* LINTSTUB: Func: void bsrr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */ 857 ENTRY(bsrr4_s) 858 lwz %r0,0(%r3) /* get log2(stride) */ 859 li %r8,4 /* distance between src words */ 860 rotlw %r5,%r5,%r0 /* shift offset */ 861 rotlw %r8,%r8,%r0 /* shift distance */ 862 b .Lbsrr4_enter 863 ENTRY(bsrr4) 864 li %r8,4 /* distance between src words */ 865 .Lbsrr4_enter: 866 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 867 cmpwi %r7,0 /* len == 0? */ 868 beqlr- /* return if len == 0 */ 869 addi %r7,%r7,-1 /* len -= 1 */ 870 slwi %r7,%r7,2 /* len *= 4 */ 871 add %r7,%r7,%r6 /* len += src */ 872 addi %r6,%r6,-4 /* pre-decrement */ 873 sub %r3,%r3,%r8 874 1: lwzux %r0,%r3,%r8 /* load value and add distance */ 875 stwu %r0,4(%r6) /* store and increment */ 876 cmplw %r6,%r7 /* at the end? */ 877 bne+ 1b /* nope, do another pass */ 878 eieio /* memory barrier (reorder protection) */ 879 DBGSYNC /* force exceptions */ 880 blr /* return */ 881 882 /* LINTSTUB: Func: void bsrr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */ 883 /* LINTSTUB: Func: void bsrr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c); */ 884 ENTRY(bsrr4rb_s) 885 lwz %r0,0(%r3) /* get log2(stride) */ 886 li %r8,4 /* distance between src words */ 887 rotlw %r5,%r5,%r0 /* shift offset */ 888 rotlw %r8,%r8,%r0 /* shift distance */ 889 b .Lbsrr4rb_enter 890 ENTRY(bsrr4rb) 891 li %r8,4 /* distance between src words */ 892 .Lbsrr4rb_enter: 893 add %r3,%r4,%r5 /* add offset to handle & place in argument 0 */ 894 mr %r4,%r6 /* move addr to argument 1 register */ 895 cmpwi %r7,0 /* len == 0? */ 896 beqlr- /* return if len == 0 */ 897 addi %r7,%r7,-1 /* len -= 1 */ 898 slwi %r7,%r7,2 /* len *= 4 */ 899 add %r7,%r7,%r6 /* len += src */ 900 addi %r6,%r6,-4 /* pre-decrement */ 901 1: lwbrx %r0,0,%r3 /* load value (reversed) */ 902 add %r3,%r3,%r8 /* src += distance */ 903 sthu %r0,4(%r6) /* store and increment */ 904 cmplw %r6,%r7 /* at the end? */ 905 bne+ 1b /* nope, do another pass */ 906 eieio /* memory barrier (reorder protection) */ 907 DBGSYNC /* force exceptions */ 908 blr /* return */ 909 910 /* LINTSTUB: Func: void bsrr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */ 911 /* LINTSTUB: Func: void bsrr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */ 912 /* LINTSTUB: Func: void bsrr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */ 913 /* LINTSTUB: Func: void bsrr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c); */ 914 ENTRY(bsrr8_s) 915 ENTRY(bsrr8rb_s) 916 lwz %r0,0(%r3) 917 rotlw %r5,%r5,%r0 918 ENTRY(bsrr8) 919 ENTRY(bsrr8rb) 920 trap 921 922 /* LINTSTUB: Func: void bssr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v, bus_size_t c); */ 923 /* LINTSTUB: Func: void bssr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, u_int8_t v, bus_size_t c); */ 924 ENTRY(bssr1_s) 925 lwz %r0,0(%r3) /* get log2(stride) */ 926 li %r8,1 /* distance between src bytes */ 927 rotlw %r5,%r5,%r0 /* shift offset */ 928 rotlw %r8,%r8,%r0 /* shift distance */ 929 b .Lbssr1_enter 930 ENTRY(bssr1) 931 li %r8,1 /* distance between src bytes */ 932 .Lbssr1_enter: 933 cmpwi %r7,0 /* len == 0? */ 934 beqlr- /* return if len == 0 */ 935 1: addi %r7,%r7,-1 /* len -= 1 */ 936 stbx %r6,%r4,%r5 /* store value */ 937 add %r5,%r5,%r8 /* add offset */ 938 cmpwi %r7,0 /* len == 0? */ 939 bne+ 1b /* nope, do another pass */ 940 eieio /* memory barrier (reorder protection) */ 941 DBGSYNC /* force exceptions */ 942 blr /* return */ 943 944 /* LINTSTUB: Func: void bssr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */ 945 /* LINTSTUB: Func: void bssr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */ 946 ENTRY(bssr2_s) 947 lwz %r0,0(%r3) /* get log2(stride) */ 948 li %r8,2 /* distance between src halfwords */ 949 rotlw %r5,%r5,%r0 /* shift offset */ 950 rotlw %r8,%r8,%r0 /* shift distance */ 951 b .Lbssr2_enter 952 ENTRY(bssr2) 953 li %r8,2 /* distance between src halfwords */ 954 .Lbssr2_enter: 955 cmpwi %r7,0 /* len == 0? */ 956 beqlr- /* return if len == 0 */ 957 1: addi %r7,%r7,-1 /* len -= 1 */ 958 sthx %r6,%r4,%r5 /* store value */ 959 add %r5,%r5,%r8 /* add offset */ 960 cmpwi %r7,0 /* len == 0? */ 961 bne+ 1b /* nope, do another pass */ 962 eieio /* memory barrier (reorder protection) */ 963 DBGSYNC /* force exceptions */ 964 blr /* return */ 965 966 /* LINTSTUB: Func: void bssr2rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */ 967 /* LINTSTUB: Func: void bssr2rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int16_t v, bus_size_t c); */ 968 ENTRY(bssr2rb_s) 969 lwz %r0,0(%r3) /* get log2(stride) */ 970 li %r8,2 /* distance between src halfwords */ 971 rotlw %r5,%r5,%r0 /* shift offset */ 972 rotlw %r8,%r8,%r0 /* shift distance */ 973 b .Lbssr2rb_enter 974 ENTRY(bssr2rb) 975 li %r8,2 /* distance between src halfwords */ 976 .Lbssr2rb_enter: 977 cmpwi %r7,0 /* len == 0? */ 978 beqlr- /* return if len == 0 */ 979 1: addi %r7,%r7,-1 /* len -= 1 */ 980 sthbrx %r6,%r4,%r5 /* store value */ 981 add %r5,%r5,%r8 /* add offset */ 982 cmpwi %r7,0 /* len == 0? */ 983 bne+ 1b /* nope, do another pass */ 984 eieio /* memory barrier (reorder protection) */ 985 DBGSYNC /* force exceptions */ 986 blr /* return */ 987 988 /* LINTSTUB: Func: void bssr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */ 989 /* LINTSTUB: Func: void bssr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */ 990 ENTRY(bssr4_s) 991 lwz %r0,0(%r3) /* get log2(stride) */ 992 li %r8,4 /* distance between src words */ 993 rotlw %r5,%r5,%r0 /* shift offset */ 994 rotlw %r8,%r8,%r0 /* shift distance */ 995 b .Lbssr4_enter 996 ENTRY(bssr4) 997 li %r8,4 /* distance between src words */ 998 .Lbssr4_enter: 999 cmpwi %r7,0 /* len == 0? */ 1000 beqlr- /* return if len == 0 */ 1001 1: addi %r7,%r7,-1 /* len -= 1 */ 1002 stwx %r6,%r4,%r5 /* store value */ 1003 add %r5,%r5,%r8 /* add offset */ 1004 cmpwi %r7,0 /* len == 0? */ 1005 bne+ 1b /* nope, do another pass */ 1006 eieio /* memory barrier (reorder protection) */ 1007 DBGSYNC /* force exceptions */ 1008 blr /* return */ 1009 1010 /* LINTSTUB: Func: void bssr4rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */ 1011 /* LINTSTUB: Func: void bssr4rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int32_t v, bus_size_t c); */ 1012 ENTRY(bssr4rb_s) 1013 lwz %r0,0(%r3) /* get log2(stride) */ 1014 li %r8,4 /* distance between src words */ 1015 rotlw %r5,%r5,%r0 /* shift offset */ 1016 rotlw %r8,%r8,%r0 /* shift distance */ 1017 b .Lbssr4rb_enter 1018 ENTRY(bssr4rb) 1019 li %r8,4 /* distance between src words */ 1020 .Lbssr4rb_enter: 1021 cmpwi %r7,0 /* len == 0? */ 1022 beqlr- /* return if len == 0 */ 1023 1: addi %r7,%r7,-1 /* len -= 1 */ 1024 stwbrx %r6,%r4,%r5 /* store value */ 1025 add %r5,%r5,%r8 /* add offset */ 1026 cmpwi %r7,0 /* len == 0? */ 1027 bne+ 1b /* nope, do another pass */ 1028 eieio /* memory barrier (reorder protection) */ 1029 DBGSYNC /* force exceptions */ 1030 blr /* return */ 1031 1032 /* LINTSTUB: Func: void bssr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */ 1033 /* LINTSTUB: Func: void bssr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */ 1034 /* LINTSTUB: Func: void bssr8rb_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */ 1035 /* LINTSTUB: Func: void bssr8rb(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, const u_int64_t v, bus_size_t c); */ 1036 ENTRY(bssr8_s) 1037 ENTRY(bssr8rb_s) 1038 lwz %r0,0(%r3) 1039 rotlw %r5,%r5,%r0 1040 ENTRY(bssr8) 1041 ENTRY(bssr8rb) 1042 trap 1043 1044 /* LINTSTUB: Func: void bscr1_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1045 /* LINTSTUB: Func: void bscr1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1046 ENTRY(bscr1_s) 1047 lwz %r0,0(%r3) /* get log2(stride) */ 1048 b .Lbscr1_enter 1049 ENTRY(bscr1) 1050 li %r0,0 /* non stride */ 1051 .Lbscr1_enter: 1052 li %r9,1 /* distance between src bytes */ 1053 rotlw %r9,%r9,%r0 /* shift distance */ 1054 cmpwi %r8,0 /* len == 0? */ 1055 beqlr- /* return if len == 0 */ 1056 rotlw %r5,%r5,%r0 /* shift src offset */ 1057 rotlw %r7,%r7,%r0 /* shift dest offset */ 1058 add %r10,%r4,%r5 /* calculate src end address */ 1059 add %r11,%r6,%r7 /* calculate dest end address */ 1060 mtctr %r8 1061 cmpw %r10,%r11 /* compare end address */ 1062 blt 2f /* jump if h + o < h2 + o2 */ 1063 1064 /* h + o >= h2 + o2 */ 1065 1: lbzx %r12,%r4,%r5 /* load value */ 1066 stbx %r12,%r6,%r7 /* store value */ 1067 add %r5,%r5,%r9 /* src offset += 1 */ 1068 add %r7,%r7,%r9 /* dest offset += 1 */ 1069 bdnz+ 1b /* jump if len != 0 */ 1070 b .Lbscr1_end /* end */ 1071 1072 /* h + o < h2 + o2 */ 1073 2: addi %r8,%r8,-1 /* len -= 1 */ 1074 rotlw %r8,%r8,%r0 /* shift len */ 1075 add %r5,%r10,%r8 /* src offset = o + len - 1 */ 1076 add %r7,%r11,%r8 /* dest offset = o2 + len - 1 */ 1077 3: lbzx %r12,%r4,%r5 /* load value */ 1078 stbx %r12,%r6,%r7 /* store value */ 1079 sub %r5,%r5,%r9 /* src offset -= 1 */ 1080 sub %r7,%r7,%r9 /* dest offset -= 1 */ 1081 bdnz+ 3b /* jump if len != 0 */ 1082 .Lbscr1_end: 1083 eieio /* memory barrier (reorder protection) */ 1084 DBGSYNC /* force exceptions */ 1085 blr /* return */ 1086 1087 /* LINTSTUB: Func: void bscr2_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1088 /* LINTSTUB: Func: void bscr2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1089 ENTRY(bscr2_s) 1090 lwz %r0,0(%r3) /* get log2(stride) */ 1091 b .Lbscr2_enter 1092 ENTRY(bscr2) 1093 li %r0,0 /* non stride */ 1094 .Lbscr2_enter: 1095 li %r9,2 /* distance between src halfwords */ 1096 rotlw %r9,%r9,%r0 /* shift distance */ 1097 cmpwi %r8,0 /* len == 0? */ 1098 beqlr- /* return if len == 0 */ 1099 rotlw %r5,%r5,%r0 /* shift src offset */ 1100 rotlw %r7,%r7,%r0 /* shift dest offset */ 1101 add %r10,%r4,%r5 /* calculate src end address */ 1102 add %r11,%r6,%r7 /* calculate dest end address */ 1103 mtctr %r8 1104 cmpw %r10,%r11 /* compare end address */ 1105 blt 2f /* jump if h + o < h2 + o2 */ 1106 1107 /* h + o >= h2 + o2 */ 1108 1: lhzx %r12,%r4,%r5 /* load value */ 1109 sthx %r12,%r6,%r7 /* store value */ 1110 add %r5,%r5,%r9 /* src offset += 2 */ 1111 add %r7,%r7,%r9 /* dest offset += 2 */ 1112 bdnz+ 1b /* jump if len != 0 */ 1113 b .Lbscr2_end /* end */ 1114 1115 /* h + o < h2 + o2 */ 1116 2: addi %r8,%r8,-1 /* len -= 1 */ 1117 rotlw %r8,%r8,%r0 /* shift len */ 1118 add %r5,%r10,%r8 /* src offset = o + len - 1 */ 1119 add %r7,%r11,%r8 /* dest offset = o2 + len - 1 */ 1120 3: lhzx %r12,%r4,%r5 /* load value */ 1121 sthx %r12,%r6,%r7 /* store value */ 1122 sub %r5,%r5,%r9 /* src offset -= 2 */ 1123 sub %r7,%r7,%r9 /* dest offset -= 2 */ 1124 bdnz+ 3b /* jump if len != 0 */ 1125 .Lbscr2_end: 1126 eieio /* memory barrier (reorder protection) */ 1127 DBGSYNC /* force exceptions */ 1128 blr /* return */ 1129 1130 /* LINTSTUB: Func: void bscr4_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1131 /* LINTSTUB: Func: void bscr4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1132 ENTRY(bscr4_s) 1133 lwz %r0,0(%r3) /* get log2(stride) */ 1134 b .Lbscr4_enter 1135 ENTRY(bscr4) 1136 li %r0,0 /* non stride */ 1137 .Lbscr4_enter: 1138 li %r9,4 /* distance between src words */ 1139 rotlw %r9,%r9,%r0 /* shift distance */ 1140 cmpwi %r8,0 /* len == 0? */ 1141 beqlr- /* return if len == 0 */ 1142 rotlw %r5,%r5,%r0 /* shift src offset */ 1143 rotlw %r7,%r7,%r0 /* shift dest offset */ 1144 add %r10,%r4,%r5 /* calculate src end address */ 1145 add %r11,%r6,%r7 /* calculate dest end address */ 1146 mtctr %r8 1147 cmpw %r10,%r11 /* compare end address */ 1148 blt 2f /* jump if h + o < h2 + o2 */ 1149 1150 /* h + o >= h2 + o2 */ 1151 1: lwzx %r12,%r4,%r5 /* load value */ 1152 stwx %r12,%r6,%r7 /* store value */ 1153 add %r5,%r5,%r9 /* src offset += 4 */ 1154 add %r7,%r7,%r9 /* dest offset += 4 */ 1155 bdnz+ 1b /* jump if len != 0 */ 1156 b .Lbscr4_end /* end */ 1157 1158 /* h + o < h2 + o2 */ 1159 2: addi %r8,%r8,-1 /* len -= 1 */ 1160 rotlw %r8,%r8,%r0 /* shift len */ 1161 add %r5,%r10,%r8 /* src offset = o + len - 1 */ 1162 add %r7,%r11,%r8 /* dest offset = o2 + len - 1 */ 1163 3: lwzx %r12,%r4,%r5 /* load value */ 1164 stwx %r12,%r6,%r7 /* store value */ 1165 sub %r5,%r5,%r9 /* src offset -= 4 */ 1166 sub %r7,%r7,%r9 /* dest offset -= 4 */ 1167 bdnz+ 3b /* jump if len != 0 */ 1168 .Lbscr4_end: 1169 eieio /* memory barrier (reorder protection) */ 1170 DBGSYNC /* force exceptions */ 1171 blr /* return */ 1172 1173 /* LINTSTUB: Func: void bscr8_s(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1174 /* LINTSTUB: Func: void bscr8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o, bus_space_handle_t h2, bus_size_t o2, bus_size_t len); */ 1175 ENTRY(bscr8_s) 1176 ENTRY(bscr8) 1177 trap 1178 1179