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