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