1/* Copy SIZE bytes from SRC to DEST. 2 For SPARC v7. 3 Copyright (C) 1996-2021 Free Software Foundation, Inc. 4 This file is part of the GNU C Library. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <https://www.gnu.org/licenses/>. */ 19 20#include <sysdep.h> 21 22/* Both these macros have to start with exactly the same insn */ 23#define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 24 ldd [%src + offset + 0x00], %t0; \ 25 ldd [%src + offset + 0x08], %t2; \ 26 ldd [%src + offset + 0x10], %t4; \ 27 ldd [%src + offset + 0x18], %t6; \ 28 st %t0, [%dst + offset + 0x00]; \ 29 st %t1, [%dst + offset + 0x04]; \ 30 st %t2, [%dst + offset + 0x08]; \ 31 st %t3, [%dst + offset + 0x0c]; \ 32 st %t4, [%dst + offset + 0x10]; \ 33 st %t5, [%dst + offset + 0x14]; \ 34 st %t6, [%dst + offset + 0x18]; \ 35 st %t7, [%dst + offset + 0x1c]; 36 37#define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ 38 ldd [%src + offset + 0x00], %t0; \ 39 ldd [%src + offset + 0x08], %t2; \ 40 ldd [%src + offset + 0x10], %t4; \ 41 ldd [%src + offset + 0x18], %t6; \ 42 std %t0, [%dst + offset + 0x00]; \ 43 std %t2, [%dst + offset + 0x08]; \ 44 std %t4, [%dst + offset + 0x10]; \ 45 std %t6, [%dst + offset + 0x18]; 46 47#define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \ 48 ldd [%src - offset - 0x10], %t0; \ 49 ldd [%src - offset - 0x08], %t2; \ 50 st %t0, [%dst - offset - 0x10]; \ 51 st %t1, [%dst - offset - 0x0c]; \ 52 st %t2, [%dst - offset - 0x08]; \ 53 st %t3, [%dst - offset - 0x04]; 54 55#define MOVE_LASTALIGNCHUNK(src, dst, offset, t0, t1, t2, t3) \ 56 ldd [%src - offset - 0x10], %t0; \ 57 ldd [%src - offset - 0x08], %t2; \ 58 std %t0, [%dst - offset - 0x10]; \ 59 std %t2, [%dst - offset - 0x08]; 60 61#define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \ 62 ldub [%src - offset - 0x02], %t0; \ 63 ldub [%src - offset - 0x01], %t1; \ 64 stb %t0, [%dst - offset - 0x02]; \ 65 stb %t1, [%dst - offset - 0x01]; 66 67#define SMOVE_CHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \ 68 ldd [%src + offset + 0x00], %t0; \ 69 ldd [%src + offset + 0x08], %t2; \ 70 srl %t0, shir, %t5; \ 71 srl %t1, shir, %t6; \ 72 sll %t0, shil, %t0; \ 73 or %t5, %prev, %t5; \ 74 sll %t1, shil, %prev; \ 75 or %t6, %t0, %t0; \ 76 srl %t2, shir, %t1; \ 77 srl %t3, shir, %t6; \ 78 sll %t2, shil, %t2; \ 79 or %t1, %prev, %t1; \ 80 std %t4, [%dst + offset + offset2 - 0x04]; \ 81 std %t0, [%dst + offset + offset2 + 0x04]; \ 82 sll %t3, shil, %prev; \ 83 or %t6, %t2, %t4; 84 85#define SMOVE_ALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, prev, shil, shir, offset2) \ 86 ldd [%src + offset + 0x00], %t0; \ 87 ldd [%src + offset + 0x08], %t2; \ 88 srl %t0, shir, %t4; \ 89 srl %t1, shir, %t5; \ 90 sll %t0, shil, %t6; \ 91 or %t4, %prev, %t0; \ 92 sll %t1, shil, %prev; \ 93 or %t5, %t6, %t1; \ 94 srl %t2, shir, %t4; \ 95 srl %t3, shir, %t5; \ 96 sll %t2, shil, %t6; \ 97 or %t4, %prev, %t2; \ 98 sll %t3, shil, %prev; \ 99 or %t5, %t6, %t3; \ 100 std %t0, [%dst + offset + offset2 + 0x00]; \ 101 std %t2, [%dst + offset + offset2 + 0x08]; 102 103 .text 104ENTRY(__mempcpy) 105 add %o0, %o2, %g1 106 ba 101f 107 st %g1, [%sp + 64] 108END(__mempcpy) 109 110 .align 4 111ENTRY(memcpy) /* %o0=dst %o1=src %o2=len */ 112 st %o0, [%sp + 64] 113101: 114 sub %o0, %o1, %o4 1159: andcc %o4, 3, %o5 1160: bne 86f 117 cmp %o2, 15 118 119 bleu 90f 120 andcc %o1, 3, %g0 121 122 be 78f 123 andcc %o1, 4, %g0 124 125 andcc %o1, 1, %g0 126 be 4f 127 andcc %o1, 2, %g0 128 129 ldub [%o1], %g2 130 add %o1, 1, %o1 131 stb %g2, [%o0] 132 sub %o2, 1, %o2 133 bne 77f 134 add %o0, 1, %o0 1354: lduh [%o1], %g2 136 add %o1, 2, %o1 137 sth %g2, [%o0] 138 sub %o2, 2, %o2 139 add %o0, 2, %o0 140 14177: andcc %o1, 4, %g0 14278: be 2f 143 mov %o2, %g1 144 145 ld [%o1], %o4 146 sub %g1, 4, %g1 147 st %o4, [%o0] 148 add %o1, 4, %o1 149 add %o0, 4, %o0 1502: andcc %g1, 0xffffff80, %g6 151 be 3f 152 andcc %o0, 4, %g0 153 154 be 82f + 4 1555: MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 156 MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 157 MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 158 MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 159 subcc %g6, 128, %g6 160 add %o1, 128, %o1 161 bne 5b 162 add %o0, 128, %o0 1633: andcc %g1, 0x70, %g6 164 be 80f 165 andcc %g1, 8, %g0 166 167 srl %g6, 1, %o4 168 mov %o7, %g2 169 add %g6, %o4, %o4 170 add %o1, %g6, %o1 171104: call 100f 172 add %o0, %g6, %o0 173 jmpl %o5 + (80f - 104b), %g0 174 mov %g2, %o7 175 17679: MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 177 MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 178 MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 179 MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 180 MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 181 MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 182 MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 183 18480: be 81f 185 andcc %g1, 4, %g0 186 187 ldd [%o1], %g2 188 add %o0, 8, %o0 189 st %g2, [%o0 - 0x08] 190 add %o1, 8, %o1 191 st %g3, [%o0 - 0x04] 192 19381: be 1f 194 andcc %g1, 2, %g0 195 196 ld [%o1], %g2 197 add %o1, 4, %o1 198 st %g2, [%o0] 199 add %o0, 4, %o0 2001: be 1f 201 andcc %g1, 1, %g0 202 203 lduh [%o1], %g2 204 add %o1, 2, %o1 205 sth %g2, [%o0] 206 add %o0, 2, %o0 2071: be 1f 208 nop 209 210 ldub [%o1], %g2 211 stb %g2, [%o0] 2121: retl 213 ld [%sp + 64], %o0 214 21582: /* ldd_std */ 216 MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) 217 MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) 218 MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) 219 MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) 220 subcc %g6, 128, %g6 221 add %o1, 128, %o1 222 bne 82b 223 add %o0, 128, %o0 224 225 andcc %g1, 0x70, %g6 226 be 84f 227 andcc %g1, 8, %g0 228 229 mov %o7, %g2 230111: call 110f 231 add %o1, %g6, %o1 232 mov %g2, %o7 233 jmpl %o5 + (84f - 111b), %g0 234 add %o0, %g6, %o0 235 23683: MOVE_LASTALIGNCHUNK(o1, o0, 0x60, g2, g3, g4, g5) 237 MOVE_LASTALIGNCHUNK(o1, o0, 0x50, g2, g3, g4, g5) 238 MOVE_LASTALIGNCHUNK(o1, o0, 0x40, g2, g3, g4, g5) 239 MOVE_LASTALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5) 240 MOVE_LASTALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5) 241 MOVE_LASTALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5) 242 MOVE_LASTALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5) 243 24484: be 85f 245 andcc %g1, 4, %g0 246 247 ldd [%o1], %g2 248 add %o0, 8, %o0 249 std %g2, [%o0 - 0x08] 250 add %o1, 8, %o1 25185: be 1f 252 andcc %g1, 2, %g0 253 254 ld [%o1], %g2 255 add %o1, 4, %o1 256 st %g2, [%o0] 257 add %o0, 4, %o0 2581: be 1f 259 andcc %g1, 1, %g0 260 261 lduh [%o1], %g2 262 add %o1, 2, %o1 263 sth %g2, [%o0] 264 add %o0, 2, %o0 2651: be 1f 266 nop 267 268 ldub [%o1], %g2 269 stb %g2, [%o0] 2701: retl 271 ld [%sp + 64], %o0 272 27386: cmp %o2, 6 274 bleu 88f 275 276 cmp %o2, 256 277 bcc 87f 278 279 andcc %o0, 3, %g0 280 be 61f 281 andcc %o0, 1, %g0 282 be 60f 283 andcc %o0, 2, %g0 284 285 ldub [%o1], %g5 286 add %o1, 1, %o1 287 stb %g5, [%o0] 288 sub %o2, 1, %o2 289 bne 61f 290 add %o0, 1, %o0 29160: ldub [%o1], %g3 292 add %o1, 2, %o1 293 stb %g3, [%o0] 294 sub %o2, 2, %o2 295 ldub [%o1 - 1], %g3 296 add %o0, 2, %o0 297 stb %g3, [%o0 - 1] 29861: and %o1, 3, %g2 299 and %o2, 0xc, %g3 300 and %o1, -4, %o1 301 cmp %g3, 4 302 sll %g2, 3, %g4 303 mov 32, %g2 304 be 4f 305 sub %g2, %g4, %g6 306 307 blu 3f 308 cmp %g3, 0x8 309 310 be 2f 311 srl %o2, 2, %g3 312 313 ld [%o1], %o3 314 add %o0, -8, %o0 315 ld [%o1 + 4], %o4 316 b 8f 317 add %g3, 1, %g3 3182: ld [%o1], %o4 319 add %o0, -12, %o0 320 ld [%o1 + 4], %o5 321 add %g3, 2, %g3 322 b 9f 323 add %o1, -4, %o1 3243: ld [%o1], %g1 325 add %o0, -4, %o0 326 ld [%o1 + 4], %o3 327 srl %o2, 2, %g3 328 b 7f 329 add %o1, 4, %o1 3304: ld [%o1], %o5 331 cmp %o2, 7 332 ld [%o1 + 4], %g1 333 srl %o2, 2, %g3 334 bleu 10f 335 add %o1, 8, %o1 336 337 ld [%o1], %o3 338 add %g3, -1, %g3 3395: sll %o5, %g4, %g2 340 srl %g1, %g6, %g5 341 or %g2, %g5, %g2 342 st %g2, [%o0] 3437: ld [%o1 + 4], %o4 344 sll %g1, %g4, %g2 345 srl %o3, %g6, %g5 346 or %g2, %g5, %g2 347 st %g2, [%o0 + 4] 3488: ld [%o1 + 8], %o5 349 sll %o3, %g4, %g2 350 srl %o4, %g6, %g5 351 or %g2, %g5, %g2 352 st %g2, [%o0 + 8] 3539: ld [%o1 + 12], %g1 354 sll %o4, %g4, %g2 355 srl %o5, %g6, %g5 356 addcc %g3, -4, %g3 357 or %g2, %g5, %g2 358 add %o1, 16, %o1 359 st %g2, [%o0 + 12] 360 add %o0, 16, %o0 361 bne,a 5b 362 ld [%o1], %o3 36310: sll %o5, %g4, %g2 364 srl %g1, %g6, %g5 365 srl %g6, 3, %g3 366 or %g2, %g5, %g2 367 sub %o1, %g3, %o1 368 andcc %o2, 2, %g0 369 st %g2, [%o0] 370 be 1f 371 andcc %o2, 1, %g0 372 373 ldub [%o1], %g2 374 add %o1, 2, %o1 375 stb %g2, [%o0 + 4] 376 add %o0, 2, %o0 377 ldub [%o1 - 1], %g2 378 stb %g2, [%o0 + 3] 3791: be 1f 380 nop 381 ldub [%o1], %g2 382 stb %g2, [%o0 + 4] 3831: retl 384 ld [%sp + 64], %o0 385 38687: andcc %o1, 3, %g0 387 be 3f 388 andcc %o1, 1, %g0 389 390 be 4f 391 andcc %o1, 2, %g0 392 393 ldub [%o1], %g2 394 add %o1, 1, %o1 395 stb %g2, [%o0] 396 sub %o2, 1, %o2 397 bne 3f 398 add %o0, 1, %o0 3994: lduh [%o1], %g2 400 add %o1, 2, %o1 401 srl %g2, 8, %g3 402 sub %o2, 2, %o2 403 stb %g3, [%o0] 404 add %o0, 2, %o0 405 stb %g2, [%o0 - 1] 4063: andcc %o1, 4, %g0 407 408 bne 2f 409 cmp %o5, 1 410 411 ld [%o1], %o4 412 srl %o4, 24, %g2 413 stb %g2, [%o0] 414 srl %o4, 16, %g3 415 stb %g3, [%o0 + 1] 416 srl %o4, 8, %g2 417 stb %g2, [%o0 + 2] 418 sub %o2, 4, %o2 419 stb %o4, [%o0 + 3] 420 add %o1, 4, %o1 421 add %o0, 4, %o0 4222: be 33f 423 cmp %o5, 2 424 be 32f 425 sub %o2, 4, %o2 42631: ld [%o1], %g2 427 add %o1, 4, %o1 428 srl %g2, 24, %g3 429 and %o0, 7, %g5 430 stb %g3, [%o0] 431 cmp %g5, 7 432 sll %g2, 8, %g1 433 add %o0, 4, %o0 434 be 41f 435 and %o2, 0xffffffc0, %o3 436 ld [%o0 - 7], %o4 4374: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 438 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 439 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 440 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 441 subcc %o3, 64, %o3 442 add %o1, 64, %o1 443 bne 4b 444 add %o0, 64, %o0 445 446 andcc %o2, 0x30, %o3 447 be,a 1f 448 srl %g1, 16, %g2 4494: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 450 subcc %o3, 16, %o3 451 add %o1, 16, %o1 452 bne 4b 453 add %o0, 16, %o0 454 455 srl %g1, 16, %g2 4561: st %o4, [%o0 - 7] 457 sth %g2, [%o0 - 3] 458 srl %g1, 8, %g4 459 b 88f 460 stb %g4, [%o0 - 1] 46132: ld [%o1], %g2 462 add %o1, 4, %o1 463 srl %g2, 16, %g3 464 and %o0, 7, %g5 465 sth %g3, [%o0] 466 cmp %g5, 6 467 sll %g2, 16, %g1 468 add %o0, 4, %o0 469 be 42f 470 and %o2, 0xffffffc0, %o3 471 ld [%o0 - 6], %o4 4724: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 473 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 474 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 475 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 476 subcc %o3, 64, %o3 477 add %o1, 64, %o1 478 bne 4b 479 add %o0, 64, %o0 480 481 andcc %o2, 0x30, %o3 482 be,a 1f 483 srl %g1, 16, %g2 4844: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 485 subcc %o3, 16, %o3 486 add %o1, 16, %o1 487 bne 4b 488 add %o0, 16, %o0 489 490 srl %g1, 16, %g2 4911: st %o4, [%o0 - 6] 492 b 88f 493 sth %g2, [%o0 - 2] 49433: ld [%o1], %g2 495 sub %o2, 4, %o2 496 srl %g2, 24, %g3 497 and %o0, 7, %g5 498 stb %g3, [%o0] 499 cmp %g5, 5 500 srl %g2, 8, %g4 501 sll %g2, 24, %g1 502 sth %g4, [%o0 + 1] 503 add %o1, 4, %o1 504 be 43f 505 and %o2, 0xffffffc0, %o3 506 507 ld [%o0 - 1], %o4 508 add %o0, 4, %o0 5094: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1) 510 SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1) 511 SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1) 512 SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1) 513 subcc %o3, 64, %o3 514 add %o1, 64, %o1 515 bne 4b 516 add %o0, 64, %o0 517 518 andcc %o2, 0x30, %o3 519 be,a 1f 520 srl %g1, 24, %g2 5214: SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, -1) 522 subcc %o3, 16, %o3 523 add %o1, 16, %o1 524 bne 4b 525 add %o0, 16, %o0 526 527 srl %g1, 24, %g2 5281: st %o4, [%o0 - 5] 529 b 88f 530 stb %g2, [%o0 - 1] 53141: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 532 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 533 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 534 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 535 subcc %o3, 64, %o3 536 add %o1, 64, %o1 537 bne 41b 538 add %o0, 64, %o0 539 540 andcc %o2, 0x30, %o3 541 be,a 1f 542 srl %g1, 16, %g2 5434: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 8, 24, -3) 544 subcc %o3, 16, %o3 545 add %o1, 16, %o1 546 bne 4b 547 add %o0, 16, %o0 548 549 srl %g1, 16, %g2 5501: sth %g2, [%o0 - 3] 551 srl %g1, 8, %g4 552 b 88f 553 stb %g4, [%o0 - 1] 55443: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3) 555 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3) 556 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3) 557 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3) 558 subcc %o3, 64, %o3 559 add %o1, 64, %o1 560 bne 43b 561 add %o0, 64, %o0 562 563 andcc %o2, 0x30, %o3 564 be,a 1f 565 srl %g1, 24, %g2 5664: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 24, 8, 3) 567 subcc %o3, 16, %o3 568 add %o1, 16, %o1 569 bne 4b 570 add %o0, 16, %o0 571 572 srl %g1, 24, %g2 5731: stb %g2, [%o0 + 3] 574 b 88f 575 add %o0, 4, %o0 57642: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 577 SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 578 SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 579 SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 580 subcc %o3, 64, %o3 581 add %o1, 64, %o1 582 bne 42b 583 add %o0, 64, %o0 584 585 andcc %o2, 0x30, %o3 586 be,a 1f 587 srl %g1, 16, %g2 5884: SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g6, g1, 16, 16, -2) 589 subcc %o3, 16, %o3 590 add %o1, 16, %o1 591 bne 4b 592 add %o0, 16, %o0 593 594 srl %g1, 16, %g2 5951: sth %g2, [%o0 - 2] 596 597 /* Fall through */ 598 59988: and %o2, 0xe, %o3 600 mov %o7, %g2 601 sll %o3, 3, %o4 602 add %o0, %o3, %o0 603106: call 100f 604 add %o1, %o3, %o1 605 mov %g2, %o7 606 jmpl %o5 + (89f - 106b), %g0 607 andcc %o2, 1, %g0 608 609 MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) 610 MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) 611 MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) 612 MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) 613 MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) 614 MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) 615 MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) 616 61789: be 1f 618 nop 619 620 ldub [%o1], %g2 621 stb %g2, [%o0] 6221: retl 623 ld [%sp + 64], %o0 624 62590: bne 88b 626 andcc %o2, 8, %g0 627 628 be 1f 629 andcc %o2, 4, %g0 630 631 ld [%o1 + 0x00], %g2 632 ld [%o1 + 0x04], %g3 633 add %o1, 8, %o1 634 st %g2, [%o0 + 0x00] 635 st %g3, [%o0 + 0x04] 636 add %o0, 8, %o0 6371: b 81b 638 mov %o2, %g1 639 640100: retl 641 sub %o7, %o4, %o5 642110: retl 643 sub %o7, %g6, %o5 644END(memcpy) 645 646libc_hidden_builtin_def (memcpy) 647 648libc_hidden_def (__mempcpy) 649weak_alias (__mempcpy, mempcpy) 650libc_hidden_builtin_def (mempcpy) 651