diff options
| -rw-r--r-- | arch/sparc/kernel/visemul.c | 32 | ||||
| -rw-r--r-- | arch/sparc/lib/memcpy.S | 804 |
2 files changed, 115 insertions, 721 deletions
diff --git a/arch/sparc/kernel/visemul.c b/arch/sparc/kernel/visemul.c index 32b626c9d815..73370674ccff 100644 --- a/arch/sparc/kernel/visemul.c +++ b/arch/sparc/kernel/visemul.c | |||
| @@ -713,17 +713,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 713 | s16 b = (rs2 >> (i * 16)) & 0xffff; | 713 | s16 b = (rs2 >> (i * 16)) & 0xffff; |
| 714 | 714 | ||
| 715 | if (a > b) | 715 | if (a > b) |
| 716 | rd_val |= 1 << i; | 716 | rd_val |= 8 >> i; |
| 717 | } | 717 | } |
| 718 | break; | 718 | break; |
| 719 | 719 | ||
| 720 | case FCMPGT32_OPF: | 720 | case FCMPGT32_OPF: |
| 721 | for (i = 0; i < 2; i++) { | 721 | for (i = 0; i < 2; i++) { |
| 722 | s32 a = (rs1 >> (i * 32)) & 0xffff; | 722 | s32 a = (rs1 >> (i * 32)) & 0xffffffff; |
| 723 | s32 b = (rs2 >> (i * 32)) & 0xffff; | 723 | s32 b = (rs2 >> (i * 32)) & 0xffffffff; |
| 724 | 724 | ||
| 725 | if (a > b) | 725 | if (a > b) |
| 726 | rd_val |= 1 << i; | 726 | rd_val |= 2 >> i; |
| 727 | } | 727 | } |
| 728 | break; | 728 | break; |
| 729 | 729 | ||
| @@ -733,17 +733,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 733 | s16 b = (rs2 >> (i * 16)) & 0xffff; | 733 | s16 b = (rs2 >> (i * 16)) & 0xffff; |
| 734 | 734 | ||
| 735 | if (a <= b) | 735 | if (a <= b) |
| 736 | rd_val |= 1 << i; | 736 | rd_val |= 8 >> i; |
| 737 | } | 737 | } |
| 738 | break; | 738 | break; |
| 739 | 739 | ||
| 740 | case FCMPLE32_OPF: | 740 | case FCMPLE32_OPF: |
| 741 | for (i = 0; i < 2; i++) { | 741 | for (i = 0; i < 2; i++) { |
| 742 | s32 a = (rs1 >> (i * 32)) & 0xffff; | 742 | s32 a = (rs1 >> (i * 32)) & 0xffffffff; |
| 743 | s32 b = (rs2 >> (i * 32)) & 0xffff; | 743 | s32 b = (rs2 >> (i * 32)) & 0xffffffff; |
| 744 | 744 | ||
| 745 | if (a <= b) | 745 | if (a <= b) |
| 746 | rd_val |= 1 << i; | 746 | rd_val |= 2 >> i; |
| 747 | } | 747 | } |
| 748 | break; | 748 | break; |
| 749 | 749 | ||
| @@ -753,17 +753,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 753 | s16 b = (rs2 >> (i * 16)) & 0xffff; | 753 | s16 b = (rs2 >> (i * 16)) & 0xffff; |
| 754 | 754 | ||
| 755 | if (a != b) | 755 | if (a != b) |
| 756 | rd_val |= 1 << i; | 756 | rd_val |= 8 >> i; |
| 757 | } | 757 | } |
| 758 | break; | 758 | break; |
| 759 | 759 | ||
| 760 | case FCMPNE32_OPF: | 760 | case FCMPNE32_OPF: |
| 761 | for (i = 0; i < 2; i++) { | 761 | for (i = 0; i < 2; i++) { |
| 762 | s32 a = (rs1 >> (i * 32)) & 0xffff; | 762 | s32 a = (rs1 >> (i * 32)) & 0xffffffff; |
| 763 | s32 b = (rs2 >> (i * 32)) & 0xffff; | 763 | s32 b = (rs2 >> (i * 32)) & 0xffffffff; |
| 764 | 764 | ||
| 765 | if (a != b) | 765 | if (a != b) |
| 766 | rd_val |= 1 << i; | 766 | rd_val |= 2 >> i; |
| 767 | } | 767 | } |
| 768 | break; | 768 | break; |
| 769 | 769 | ||
| @@ -773,17 +773,17 @@ static void pcmp(struct pt_regs *regs, unsigned int insn, unsigned int opf) | |||
| 773 | s16 b = (rs2 >> (i * 16)) & 0xffff; | 773 | s16 b = (rs2 >> (i * 16)) & 0xffff; |
| 774 | 774 | ||
| 775 | if (a == b) | 775 | if (a == b) |
| 776 | rd_val |= 1 << i; | 776 | rd_val |= 8 >> i; |
| 777 | } | 777 | } |
| 778 | break; | 778 | break; |
| 779 | 779 | ||
| 780 | case FCMPEQ32_OPF: | 780 | case FCMPEQ32_OPF: |
| 781 | for (i = 0; i < 2; i++) { | 781 | for (i = 0; i < 2; i++) { |
| 782 | s32 a = (rs1 >> (i * 32)) & 0xffff; | 782 | s32 a = (rs1 >> (i * 32)) & 0xffffffff; |
| 783 | s32 b = (rs2 >> (i * 32)) & 0xffff; | 783 | s32 b = (rs2 >> (i * 32)) & 0xffffffff; |
| 784 | 784 | ||
| 785 | if (a == b) | 785 | if (a == b) |
| 786 | rd_val |= 1 << i; | 786 | rd_val |= 2 >> i; |
| 787 | } | 787 | } |
| 788 | break; | 788 | break; |
| 789 | } | 789 | } |
diff --git a/arch/sparc/lib/memcpy.S b/arch/sparc/lib/memcpy.S index 34fe65751737..4d8c497517bd 100644 --- a/arch/sparc/lib/memcpy.S +++ b/arch/sparc/lib/memcpy.S | |||
| @@ -7,40 +7,12 @@ | |||
| 7 | * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) | 7 | * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz) |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | #ifdef __KERNEL__ | 10 | #define FUNC(x) \ |
| 11 | |||
| 12 | #define FUNC(x) \ | ||
| 13 | .globl x; \ | 11 | .globl x; \ |
| 14 | .type x,@function; \ | 12 | .type x,@function; \ |
| 15 | .align 4; \ | 13 | .align 4; \ |
| 16 | x: | 14 | x: |
| 17 | 15 | ||
| 18 | #undef FASTER_REVERSE | ||
| 19 | #undef FASTER_NONALIGNED | ||
| 20 | #define FASTER_ALIGNED | ||
| 21 | |||
| 22 | /* In kernel these functions don't return a value. | ||
| 23 | * One should use macros in asm/string.h for that purpose. | ||
| 24 | * We return 0, so that bugs are more apparent. | ||
| 25 | */ | ||
| 26 | #define SETUP_RETL | ||
| 27 | #define RETL_INSN clr %o0 | ||
| 28 | |||
| 29 | #else | ||
| 30 | |||
| 31 | /* libc */ | ||
| 32 | |||
| 33 | #include "DEFS.h" | ||
| 34 | |||
| 35 | #define FASTER_REVERSE | ||
| 36 | #define FASTER_NONALIGNED | ||
| 37 | #define FASTER_ALIGNED | ||
| 38 | |||
| 39 | #define SETUP_RETL mov %o0, %g6 | ||
| 40 | #define RETL_INSN mov %g6, %o0 | ||
| 41 | |||
| 42 | #endif | ||
| 43 | |||
| 44 | /* Both these macros have to start with exactly the same insn */ | 16 | /* Both these macros have to start with exactly the same insn */ |
| 45 | #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ | 17 | #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \ |
| 46 | ldd [%src + (offset) + 0x00], %t0; \ | 18 | ldd [%src + (offset) + 0x00], %t0; \ |
| @@ -164,30 +136,6 @@ x: | |||
| 164 | .text | 136 | .text |
| 165 | .align 4 | 137 | .align 4 |
| 166 | 138 | ||
| 167 | #ifdef FASTER_REVERSE | ||
| 168 | |||
| 169 | 70: /* rdword_align */ | ||
| 170 | |||
| 171 | andcc %o1, 1, %g0 | ||
| 172 | be 4f | ||
| 173 | andcc %o1, 2, %g0 | ||
| 174 | |||
| 175 | ldub [%o1 - 1], %g2 | ||
| 176 | sub %o1, 1, %o1 | ||
| 177 | stb %g2, [%o0 - 1] | ||
| 178 | sub %o2, 1, %o2 | ||
| 179 | be 3f | ||
| 180 | sub %o0, 1, %o0 | ||
| 181 | 4: | ||
| 182 | lduh [%o1 - 2], %g2 | ||
| 183 | sub %o1, 2, %o1 | ||
| 184 | sth %g2, [%o0 - 2] | ||
| 185 | sub %o2, 2, %o2 | ||
| 186 | b 3f | ||
| 187 | sub %o0, 2, %o0 | ||
| 188 | |||
| 189 | #endif /* FASTER_REVERSE */ | ||
| 190 | |||
| 191 | 0: | 139 | 0: |
| 192 | retl | 140 | retl |
| 193 | nop ! Only bcopy returns here and it retuns void... | 141 | nop ! Only bcopy returns here and it retuns void... |
| @@ -198,7 +146,7 @@ FUNC(__memmove) | |||
| 198 | #endif | 146 | #endif |
| 199 | FUNC(memmove) | 147 | FUNC(memmove) |
| 200 | cmp %o0, %o1 | 148 | cmp %o0, %o1 |
| 201 | SETUP_RETL | 149 | mov %o0, %g7 |
| 202 | bleu 9f | 150 | bleu 9f |
| 203 | sub %o0, %o1, %o4 | 151 | sub %o0, %o1, %o4 |
| 204 | 152 | ||
| @@ -207,8 +155,6 @@ FUNC(memmove) | |||
| 207 | bleu 0f | 155 | bleu 0f |
| 208 | andcc %o4, 3, %o5 | 156 | andcc %o4, 3, %o5 |
| 209 | 157 | ||
| 210 | #ifndef FASTER_REVERSE | ||
| 211 | |||
| 212 | add %o1, %o2, %o1 | 158 | add %o1, %o2, %o1 |
| 213 | add %o0, %o2, %o0 | 159 | add %o0, %o2, %o0 |
| 214 | sub %o1, 1, %o1 | 160 | sub %o1, 1, %o1 |
| @@ -224,295 +170,7 @@ FUNC(memmove) | |||
| 224 | sub %o0, 1, %o0 | 170 | sub %o0, 1, %o0 |
| 225 | 171 | ||
| 226 | retl | 172 | retl |
| 227 | RETL_INSN | 173 | mov %g7, %o0 |
| 228 | |||
| 229 | #else /* FASTER_REVERSE */ | ||
| 230 | |||
| 231 | add %o1, %o2, %o1 | ||
| 232 | add %o0, %o2, %o0 | ||
| 233 | bne 77f | ||
| 234 | cmp %o2, 15 | ||
| 235 | bleu 91f | ||
| 236 | andcc %o1, 3, %g0 | ||
| 237 | bne 70b | ||
| 238 | 3: | ||
| 239 | andcc %o1, 4, %g0 | ||
| 240 | |||
| 241 | be 2f | ||
| 242 | mov %o2, %g1 | ||
| 243 | |||
| 244 | ld [%o1 - 4], %o4 | ||
| 245 | sub %g1, 4, %g1 | ||
| 246 | st %o4, [%o0 - 4] | ||
| 247 | sub %o1, 4, %o1 | ||
| 248 | sub %o0, 4, %o0 | ||
| 249 | 2: | ||
| 250 | andcc %g1, 0xffffff80, %g7 | ||
| 251 | be 3f | ||
| 252 | andcc %o0, 4, %g0 | ||
| 253 | |||
| 254 | be 74f + 4 | ||
| 255 | 5: | ||
| 256 | RMOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 257 | RMOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 258 | RMOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 259 | RMOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 260 | subcc %g7, 128, %g7 | ||
| 261 | sub %o1, 128, %o1 | ||
| 262 | bne 5b | ||
| 263 | sub %o0, 128, %o0 | ||
| 264 | 3: | ||
| 265 | andcc %g1, 0x70, %g7 | ||
| 266 | be 72f | ||
| 267 | andcc %g1, 8, %g0 | ||
| 268 | |||
| 269 | sethi %hi(72f), %o5 | ||
| 270 | srl %g7, 1, %o4 | ||
| 271 | add %g7, %o4, %o4 | ||
| 272 | sub %o1, %g7, %o1 | ||
| 273 | sub %o5, %o4, %o5 | ||
| 274 | jmpl %o5 + %lo(72f), %g0 | ||
| 275 | sub %o0, %g7, %o0 | ||
| 276 | |||
| 277 | 71: /* rmemcpy_table */ | ||
| 278 | RMOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5) | ||
| 279 | RMOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5) | ||
| 280 | RMOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5) | ||
| 281 | RMOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5) | ||
| 282 | RMOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5) | ||
| 283 | RMOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5) | ||
| 284 | RMOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5) | ||
| 285 | |||
| 286 | 72: /* rmemcpy_table_end */ | ||
| 287 | |||
| 288 | be 73f | ||
| 289 | andcc %g1, 4, %g0 | ||
| 290 | |||
| 291 | ldd [%o1 - 0x08], %g2 | ||
| 292 | sub %o0, 8, %o0 | ||
| 293 | sub %o1, 8, %o1 | ||
| 294 | st %g2, [%o0] | ||
| 295 | st %g3, [%o0 + 0x04] | ||
| 296 | |||
| 297 | 73: /* rmemcpy_last7 */ | ||
| 298 | |||
| 299 | be 1f | ||
| 300 | andcc %g1, 2, %g0 | ||
| 301 | |||
| 302 | ld [%o1 - 4], %g2 | ||
| 303 | sub %o1, 4, %o1 | ||
| 304 | st %g2, [%o0 - 4] | ||
| 305 | sub %o0, 4, %o0 | ||
| 306 | 1: | ||
| 307 | be 1f | ||
| 308 | andcc %g1, 1, %g0 | ||
| 309 | |||
| 310 | lduh [%o1 - 2], %g2 | ||
| 311 | sub %o1, 2, %o1 | ||
| 312 | sth %g2, [%o0 - 2] | ||
| 313 | sub %o0, 2, %o0 | ||
| 314 | 1: | ||
| 315 | be 1f | ||
| 316 | nop | ||
| 317 | |||
| 318 | ldub [%o1 - 1], %g2 | ||
| 319 | stb %g2, [%o0 - 1] | ||
| 320 | 1: | ||
| 321 | retl | ||
| 322 | RETL_INSN | ||
| 323 | |||
| 324 | 74: /* rldd_std */ | ||
| 325 | RMOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 326 | RMOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 327 | RMOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 328 | RMOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) | ||
| 329 | subcc %g7, 128, %g7 | ||
| 330 | sub %o1, 128, %o1 | ||
| 331 | bne 74b | ||
| 332 | sub %o0, 128, %o0 | ||
| 333 | |||
| 334 | andcc %g1, 0x70, %g7 | ||
| 335 | be 72b | ||
| 336 | andcc %g1, 8, %g0 | ||
| 337 | |||
| 338 | sethi %hi(72b), %o5 | ||
| 339 | srl %g7, 1, %o4 | ||
| 340 | add %g7, %o4, %o4 | ||
| 341 | sub %o1, %g7, %o1 | ||
| 342 | sub %o5, %o4, %o5 | ||
| 343 | jmpl %o5 + %lo(72b), %g0 | ||
| 344 | sub %o0, %g7, %o0 | ||
| 345 | |||
| 346 | 75: /* rshort_end */ | ||
| 347 | |||
| 348 | and %o2, 0xe, %o3 | ||
| 349 | 2: | ||
| 350 | sethi %hi(76f), %o5 | ||
| 351 | sll %o3, 3, %o4 | ||
| 352 | sub %o0, %o3, %o0 | ||
| 353 | sub %o5, %o4, %o5 | ||
| 354 | sub %o1, %o3, %o1 | ||
| 355 | jmpl %o5 + %lo(76f), %g0 | ||
| 356 | andcc %o2, 1, %g0 | ||
| 357 | |||
| 358 | RMOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3) | ||
| 359 | RMOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3) | ||
| 360 | RMOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3) | ||
| 361 | RMOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3) | ||
| 362 | RMOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3) | ||
| 363 | RMOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3) | ||
| 364 | RMOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3) | ||
| 365 | |||
| 366 | 76: /* rshort_table_end */ | ||
| 367 | |||
| 368 | be 1f | ||
| 369 | nop | ||
| 370 | ldub [%o1 - 1], %g2 | ||
| 371 | stb %g2, [%o0 - 1] | ||
| 372 | 1: | ||
| 373 | retl | ||
| 374 | RETL_INSN | ||
| 375 | |||
| 376 | 91: /* rshort_aligned_end */ | ||
| 377 | |||
| 378 | bne 75b | ||
| 379 | andcc %o2, 8, %g0 | ||
| 380 | |||
| 381 | be 1f | ||
| 382 | andcc %o2, 4, %g0 | ||
| 383 | |||
| 384 | ld [%o1 - 0x08], %g2 | ||
| 385 | ld [%o1 - 0x04], %g3 | ||
| 386 | sub %o1, 8, %o1 | ||
| 387 | st %g2, [%o0 - 0x08] | ||
| 388 | st %g3, [%o0 - 0x04] | ||
| 389 | sub %o0, 8, %o0 | ||
| 390 | 1: | ||
| 391 | b 73b | ||
| 392 | mov %o2, %g1 | ||
| 393 | |||
| 394 | 77: /* rnon_aligned */ | ||
| 395 | cmp %o2, 15 | ||
| 396 | bleu 75b | ||
| 397 | andcc %o0, 3, %g0 | ||
| 398 | be 64f | ||
| 399 | andcc %o0, 1, %g0 | ||
| 400 | be 63f | ||
| 401 | andcc %o0, 2, %g0 | ||
| 402 | ldub [%o1 - 1], %g5 | ||
| 403 | sub %o1, 1, %o1 | ||
| 404 | stb %g5, [%o0 - 1] | ||
| 405 | sub %o0, 1, %o0 | ||
| 406 | be 64f | ||
| 407 | sub %o2, 1, %o2 | ||
| 408 | 63: | ||
| 409 | ldub [%o1 - 1], %g5 | ||
| 410 | sub %o1, 2, %o1 | ||
| 411 | stb %g5, [%o0 - 1] | ||
| 412 | sub %o0, 2, %o0 | ||
| 413 | ldub [%o1], %g5 | ||
| 414 | sub %o2, 2, %o2 | ||
| 415 | stb %g5, [%o0] | ||
| 416 | 64: | ||
| 417 | and %o1, 3, %g2 | ||
| 418 | and %o1, -4, %o1 | ||
| 419 | and %o2, 0xc, %g3 | ||
| 420 | add %o1, 4, %o1 | ||
| 421 | cmp %g3, 4 | ||
| 422 | sll %g2, 3, %g4 | ||
| 423 | mov 32, %g2 | ||
| 424 | be 4f | ||
| 425 | sub %g2, %g4, %g7 | ||
| 426 | |||
| 427 | blu 3f | ||
| 428 | cmp %g3, 8 | ||
| 429 | |||
| 430 | be 2f | ||
| 431 | srl %o2, 2, %g3 | ||
| 432 | |||
| 433 | ld [%o1 - 4], %o3 | ||
| 434 | add %o0, -8, %o0 | ||
| 435 | ld [%o1 - 8], %o4 | ||
| 436 | add %o1, -16, %o1 | ||
| 437 | b 7f | ||
| 438 | add %g3, 1, %g3 | ||
| 439 | 2: | ||
| 440 | ld [%o1 - 4], %o4 | ||
| 441 | add %o0, -4, %o0 | ||
| 442 | ld [%o1 - 8], %g1 | ||
| 443 | add %o1, -12, %o1 | ||
| 444 | b 8f | ||
| 445 | add %g3, 2, %g3 | ||
| 446 | 3: | ||
| 447 | ld [%o1 - 4], %o5 | ||
| 448 | add %o0, -12, %o0 | ||
| 449 | ld [%o1 - 8], %o3 | ||
| 450 | add %o1, -20, %o1 | ||
| 451 | b 6f | ||
| 452 | srl %o2, 2, %g3 | ||
| 453 | 4: | ||
| 454 | ld [%o1 - 4], %g1 | ||
| 455 | srl %o2, 2, %g3 | ||
| 456 | ld [%o1 - 8], %o5 | ||
| 457 | add %o1, -24, %o1 | ||
| 458 | add %o0, -16, %o0 | ||
| 459 | add %g3, -1, %g3 | ||
| 460 | |||
| 461 | ld [%o1 + 12], %o3 | ||
| 462 | 5: | ||
| 463 | sll %o5, %g4, %g2 | ||
| 464 | srl %g1, %g7, %g5 | ||
| 465 | or %g2, %g5, %g2 | ||
| 466 | st %g2, [%o0 + 12] | ||
| 467 | 6: | ||
| 468 | ld [%o1 + 8], %o4 | ||
| 469 | sll %o3, %g4, %g2 | ||
| 470 | srl %o5, %g7, %g5 | ||
| 471 | or %g2, %g5, %g2 | ||
| 472 | st %g2, [%o0 + 8] | ||
| 473 | 7: | ||
| 474 | ld [%o1 + 4], %g1 | ||
| 475 | sll %o4, %g4, %g2 | ||
| 476 | srl %o3, %g7, %g5 | ||
| 477 | or %g2, %g5, %g2 | ||
| 478 | st %g2, [%o0 + 4] | ||
| 479 | 8: | ||
| 480 | ld [%o1], %o5 | ||
| 481 | sll %g1, %g4, %g2 | ||
| 482 | srl %o4, %g7, %g5 | ||
| 483 | addcc %g3, -4, %g3 | ||
| 484 | or %g2, %g5, %g2 | ||
| 485 | add %o1, -16, %o1 | ||
| 486 | st %g2, [%o0] | ||
| 487 | add %o0, -16, %o0 | ||
| 488 | bne,a 5b | ||
| 489 | ld [%o1 + 12], %o3 | ||
| 490 | sll %o5, %g4, %g2 | ||
| 491 | srl %g1, %g7, %g5 | ||
| 492 | srl %g4, 3, %g3 | ||
| 493 | or %g2, %g5, %g2 | ||
| 494 | add %o1, %g3, %o1 | ||
| 495 | andcc %o2, 2, %g0 | ||
| 496 | st %g2, [%o0 + 12] | ||
| 497 | be 1f | ||
| 498 | andcc %o2, 1, %g0 | ||
| 499 | |||
| 500 | ldub [%o1 + 15], %g5 | ||
| 501 | add %o1, -2, %o1 | ||
| 502 | stb %g5, [%o0 + 11] | ||
| 503 | add %o0, -2, %o0 | ||
| 504 | ldub [%o1 + 16], %g5 | ||
| 505 | stb %g5, [%o0 + 12] | ||
| 506 | 1: | ||
| 507 | be 1f | ||
| 508 | nop | ||
| 509 | ldub [%o1 + 15], %g5 | ||
| 510 | stb %g5, [%o0 + 11] | ||
| 511 | 1: | ||
| 512 | retl | ||
| 513 | RETL_INSN | ||
| 514 | |||
| 515 | #endif /* FASTER_REVERSE */ | ||
| 516 | 174 | ||
| 517 | /* NOTE: This code is executed just for the cases, | 175 | /* NOTE: This code is executed just for the cases, |
| 518 | where %src (=%o1) & 3 is != 0. | 176 | where %src (=%o1) & 3 is != 0. |
| @@ -546,7 +204,7 @@ FUNC(memmove) | |||
| 546 | FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | 204 | FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ |
| 547 | 205 | ||
| 548 | sub %o0, %o1, %o4 | 206 | sub %o0, %o1, %o4 |
| 549 | SETUP_RETL | 207 | mov %o0, %g7 |
| 550 | 9: | 208 | 9: |
| 551 | andcc %o4, 3, %o5 | 209 | andcc %o4, 3, %o5 |
| 552 | 0: | 210 | 0: |
| @@ -569,7 +227,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
| 569 | add %o1, 4, %o1 | 227 | add %o1, 4, %o1 |
| 570 | add %o0, 4, %o0 | 228 | add %o0, 4, %o0 |
| 571 | 2: | 229 | 2: |
| 572 | andcc %g1, 0xffffff80, %g7 | 230 | andcc %g1, 0xffffff80, %g0 |
| 573 | be 3f | 231 | be 3f |
| 574 | andcc %o0, 4, %g0 | 232 | andcc %o0, 4, %g0 |
| 575 | 233 | ||
| @@ -579,22 +237,23 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
| 579 | MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) | 237 | MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) |
| 580 | MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) | 238 | MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) |
| 581 | MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) | 239 | MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) |
| 582 | subcc %g7, 128, %g7 | 240 | sub %g1, 128, %g1 |
| 583 | add %o1, 128, %o1 | 241 | add %o1, 128, %o1 |
| 584 | bne 5b | 242 | cmp %g1, 128 |
| 243 | bge 5b | ||
| 585 | add %o0, 128, %o0 | 244 | add %o0, 128, %o0 |
| 586 | 3: | 245 | 3: |
| 587 | andcc %g1, 0x70, %g7 | 246 | andcc %g1, 0x70, %g4 |
| 588 | be 80f | 247 | be 80f |
| 589 | andcc %g1, 8, %g0 | 248 | andcc %g1, 8, %g0 |
| 590 | 249 | ||
| 591 | sethi %hi(80f), %o5 | 250 | sethi %hi(80f), %o5 |
| 592 | srl %g7, 1, %o4 | 251 | srl %g4, 1, %o4 |
| 593 | add %g7, %o4, %o4 | 252 | add %g4, %o4, %o4 |
| 594 | add %o1, %g7, %o1 | 253 | add %o1, %g4, %o1 |
| 595 | sub %o5, %o4, %o5 | 254 | sub %o5, %o4, %o5 |
| 596 | jmpl %o5 + %lo(80f), %g0 | 255 | jmpl %o5 + %lo(80f), %g0 |
| 597 | add %o0, %g7, %o0 | 256 | add %o0, %g4, %o0 |
| 598 | 257 | ||
| 599 | 79: /* memcpy_table */ | 258 | 79: /* memcpy_table */ |
| 600 | 259 | ||
| @@ -641,43 +300,28 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
| 641 | stb %g2, [%o0] | 300 | stb %g2, [%o0] |
| 642 | 1: | 301 | 1: |
| 643 | retl | 302 | retl |
| 644 | RETL_INSN | 303 | mov %g7, %o0 |
| 645 | 304 | ||
| 646 | 82: /* ldd_std */ | 305 | 82: /* ldd_std */ |
| 647 | MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) | 306 | MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5) |
| 648 | MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) | 307 | MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) |
| 649 | MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) | 308 | MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) |
| 650 | MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) | 309 | MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) |
| 651 | subcc %g7, 128, %g7 | 310 | subcc %g1, 128, %g1 |
| 652 | add %o1, 128, %o1 | 311 | add %o1, 128, %o1 |
| 653 | bne 82b | 312 | cmp %g1, 128 |
| 313 | bge 82b | ||
| 654 | add %o0, 128, %o0 | 314 | add %o0, 128, %o0 |
| 655 | 315 | ||
| 656 | #ifndef FASTER_ALIGNED | 316 | andcc %g1, 0x70, %g4 |
| 657 | |||
| 658 | andcc %g1, 0x70, %g7 | ||
| 659 | be 80b | ||
| 660 | andcc %g1, 8, %g0 | ||
| 661 | |||
| 662 | sethi %hi(80b), %o5 | ||
| 663 | srl %g7, 1, %o4 | ||
| 664 | add %g7, %o4, %o4 | ||
| 665 | add %o1, %g7, %o1 | ||
| 666 | sub %o5, %o4, %o5 | ||
| 667 | jmpl %o5 + %lo(80b), %g0 | ||
| 668 | add %o0, %g7, %o0 | ||
| 669 | |||
| 670 | #else /* FASTER_ALIGNED */ | ||
| 671 | |||
| 672 | andcc %g1, 0x70, %g7 | ||
| 673 | be 84f | 317 | be 84f |
| 674 | andcc %g1, 8, %g0 | 318 | andcc %g1, 8, %g0 |
| 675 | 319 | ||
| 676 | sethi %hi(84f), %o5 | 320 | sethi %hi(84f), %o5 |
| 677 | add %o1, %g7, %o1 | 321 | add %o1, %g4, %o1 |
| 678 | sub %o5, %g7, %o5 | 322 | sub %o5, %g4, %o5 |
| 679 | jmpl %o5 + %lo(84f), %g0 | 323 | jmpl %o5 + %lo(84f), %g0 |
| 680 | add %o0, %g7, %o0 | 324 | add %o0, %g4, %o0 |
| 681 | 325 | ||
| 682 | 83: /* amemcpy_table */ | 326 | 83: /* amemcpy_table */ |
| 683 | 327 | ||
| @@ -721,382 +365,132 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
| 721 | stb %g2, [%o0] | 365 | stb %g2, [%o0] |
| 722 | 1: | 366 | 1: |
| 723 | retl | 367 | retl |
| 724 | RETL_INSN | 368 | mov %g7, %o0 |
| 725 | |||
| 726 | #endif /* FASTER_ALIGNED */ | ||
| 727 | 369 | ||
| 728 | 86: /* non_aligned */ | 370 | 86: /* non_aligned */ |
| 729 | cmp %o2, 6 | 371 | cmp %o2, 6 |
| 730 | bleu 88f | 372 | bleu 88f |
| 373 | nop | ||
| 731 | 374 | ||
| 732 | #ifdef FASTER_NONALIGNED | 375 | save %sp, -96, %sp |
| 733 | 376 | andcc %i0, 3, %g0 | |
| 734 | cmp %o2, 256 | ||
| 735 | bcc 87f | ||
| 736 | |||
| 737 | #endif /* FASTER_NONALIGNED */ | ||
| 738 | |||
| 739 | andcc %o0, 3, %g0 | ||
| 740 | be 61f | 377 | be 61f |
| 741 | andcc %o0, 1, %g0 | 378 | andcc %i0, 1, %g0 |
| 742 | be 60f | 379 | be 60f |
| 743 | andcc %o0, 2, %g0 | 380 | andcc %i0, 2, %g0 |
| 744 | 381 | ||
| 745 | ldub [%o1], %g5 | 382 | ldub [%i1], %g5 |
| 746 | add %o1, 1, %o1 | 383 | add %i1, 1, %i1 |
| 747 | stb %g5, [%o0] | 384 | stb %g5, [%i0] |
| 748 | sub %o2, 1, %o2 | 385 | sub %i2, 1, %i2 |
| 749 | bne 61f | 386 | bne 61f |
| 750 | add %o0, 1, %o0 | 387 | add %i0, 1, %i0 |
| 751 | 60: | 388 | 60: |
| 752 | ldub [%o1], %g3 | 389 | ldub [%i1], %g3 |
| 753 | add %o1, 2, %o1 | 390 | add %i1, 2, %i1 |
| 754 | stb %g3, [%o0] | 391 | stb %g3, [%i0] |
| 755 | sub %o2, 2, %o2 | 392 | sub %i2, 2, %i2 |
| 756 | ldub [%o1 - 1], %g3 | 393 | ldub [%i1 - 1], %g3 |
| 757 | add %o0, 2, %o0 | 394 | add %i0, 2, %i0 |
| 758 | stb %g3, [%o0 - 1] | 395 | stb %g3, [%i0 - 1] |
| 759 | 61: | 396 | 61: |
| 760 | and %o1, 3, %g2 | 397 | and %i1, 3, %g2 |
| 761 | and %o2, 0xc, %g3 | 398 | and %i2, 0xc, %g3 |
| 762 | and %o1, -4, %o1 | 399 | and %i1, -4, %i1 |
| 763 | cmp %g3, 4 | 400 | cmp %g3, 4 |
| 764 | sll %g2, 3, %g4 | 401 | sll %g2, 3, %g4 |
| 765 | mov 32, %g2 | 402 | mov 32, %g2 |
| 766 | be 4f | 403 | be 4f |
| 767 | sub %g2, %g4, %g7 | 404 | sub %g2, %g4, %l0 |
| 768 | 405 | ||
| 769 | blu 3f | 406 | blu 3f |
| 770 | cmp %g3, 0x8 | 407 | cmp %g3, 0x8 |
| 771 | 408 | ||
| 772 | be 2f | 409 | be 2f |
| 773 | srl %o2, 2, %g3 | 410 | srl %i2, 2, %g3 |
| 774 | 411 | ||
| 775 | ld [%o1], %o3 | 412 | ld [%i1], %i3 |
| 776 | add %o0, -8, %o0 | 413 | add %i0, -8, %i0 |
| 777 | ld [%o1 + 4], %o4 | 414 | ld [%i1 + 4], %i4 |
| 778 | b 8f | 415 | b 8f |
| 779 | add %g3, 1, %g3 | 416 | add %g3, 1, %g3 |
| 780 | 2: | 417 | 2: |
| 781 | ld [%o1], %o4 | 418 | ld [%i1], %i4 |
| 782 | add %o0, -12, %o0 | 419 | add %i0, -12, %i0 |
| 783 | ld [%o1 + 4], %o5 | 420 | ld [%i1 + 4], %i5 |
| 784 | add %g3, 2, %g3 | 421 | add %g3, 2, %g3 |
| 785 | b 9f | 422 | b 9f |
| 786 | add %o1, -4, %o1 | 423 | add %i1, -4, %i1 |
| 787 | 3: | 424 | 3: |
| 788 | ld [%o1], %g1 | 425 | ld [%i1], %g1 |
| 789 | add %o0, -4, %o0 | 426 | add %i0, -4, %i0 |
| 790 | ld [%o1 + 4], %o3 | 427 | ld [%i1 + 4], %i3 |
| 791 | srl %o2, 2, %g3 | 428 | srl %i2, 2, %g3 |
| 792 | b 7f | 429 | b 7f |
| 793 | add %o1, 4, %o1 | 430 | add %i1, 4, %i1 |
| 794 | 4: | 431 | 4: |
| 795 | ld [%o1], %o5 | 432 | ld [%i1], %i5 |
| 796 | cmp %o2, 7 | 433 | cmp %i2, 7 |
| 797 | ld [%o1 + 4], %g1 | 434 | ld [%i1 + 4], %g1 |
| 798 | srl %o2, 2, %g3 | 435 | srl %i2, 2, %g3 |
| 799 | bleu 10f | 436 | bleu 10f |
| 800 | add %o1, 8, %o1 | 437 | add %i1, 8, %i1 |
| 801 | 438 | ||
| 802 | ld [%o1], %o3 | 439 | ld [%i1], %i3 |
| 803 | add %g3, -1, %g3 | 440 | add %g3, -1, %g3 |
| 804 | 5: | 441 | 5: |
| 805 | sll %o5, %g4, %g2 | 442 | sll %i5, %g4, %g2 |
| 806 | srl %g1, %g7, %g5 | 443 | srl %g1, %l0, %g5 |
| 807 | or %g2, %g5, %g2 | 444 | or %g2, %g5, %g2 |
| 808 | st %g2, [%o0] | 445 | st %g2, [%i0] |
| 809 | 7: | 446 | 7: |
| 810 | ld [%o1 + 4], %o4 | 447 | ld [%i1 + 4], %i4 |
| 811 | sll %g1, %g4, %g2 | 448 | sll %g1, %g4, %g2 |
| 812 | srl %o3, %g7, %g5 | 449 | srl %i3, %l0, %g5 |
| 813 | or %g2, %g5, %g2 | 450 | or %g2, %g5, %g2 |
| 814 | st %g2, [%o0 + 4] | 451 | st %g2, [%i0 + 4] |
| 815 | 8: | 452 | 8: |
| 816 | ld [%o1 + 8], %o5 | 453 | ld [%i1 + 8], %i5 |
| 817 | sll %o3, %g4, %g2 | 454 | sll %i3, %g4, %g2 |
| 818 | srl %o4, %g7, %g5 | 455 | srl %i4, %l0, %g5 |
| 819 | or %g2, %g5, %g2 | 456 | or %g2, %g5, %g2 |
| 820 | st %g2, [%o0 + 8] | 457 | st %g2, [%i0 + 8] |
| 821 | 9: | 458 | 9: |
| 822 | ld [%o1 + 12], %g1 | 459 | ld [%i1 + 12], %g1 |
| 823 | sll %o4, %g4, %g2 | 460 | sll %i4, %g4, %g2 |
| 824 | srl %o5, %g7, %g5 | 461 | srl %i5, %l0, %g5 |
| 825 | addcc %g3, -4, %g3 | 462 | addcc %g3, -4, %g3 |
| 826 | or %g2, %g5, %g2 | 463 | or %g2, %g5, %g2 |
| 827 | add %o1, 16, %o1 | 464 | add %i1, 16, %i1 |
| 828 | st %g2, [%o0 + 12] | 465 | st %g2, [%i0 + 12] |
| 829 | add %o0, 16, %o0 | 466 | add %i0, 16, %i0 |
| 830 | bne,a 5b | 467 | bne,a 5b |
| 831 | ld [%o1], %o3 | 468 | ld [%i1], %i3 |
| 832 | 10: | 469 | 10: |
| 833 | sll %o5, %g4, %g2 | 470 | sll %i5, %g4, %g2 |
| 834 | srl %g1, %g7, %g5 | 471 | srl %g1, %l0, %g5 |
| 835 | srl %g7, 3, %g3 | 472 | srl %l0, 3, %g3 |
| 836 | or %g2, %g5, %g2 | 473 | or %g2, %g5, %g2 |
| 837 | sub %o1, %g3, %o1 | 474 | sub %i1, %g3, %i1 |
| 838 | andcc %o2, 2, %g0 | 475 | andcc %i2, 2, %g0 |
| 839 | st %g2, [%o0] | 476 | st %g2, [%i0] |
| 840 | be 1f | 477 | be 1f |
| 841 | andcc %o2, 1, %g0 | 478 | andcc %i2, 1, %g0 |
| 842 | 479 | ||
| 843 | ldub [%o1], %g2 | 480 | ldub [%i1], %g2 |
| 844 | add %o1, 2, %o1 | 481 | add %i1, 2, %i1 |
| 845 | stb %g2, [%o0 + 4] | 482 | stb %g2, [%i0 + 4] |
| 846 | add %o0, 2, %o0 | 483 | add %i0, 2, %i0 |
| 847 | ldub [%o1 - 1], %g2 | 484 | ldub [%i1 - 1], %g2 |
| 848 | stb %g2, [%o0 + 3] | 485 | stb %g2, [%i0 + 3] |
| 849 | 1: | 486 | 1: |
| 850 | be 1f | 487 | be 1f |
| 851 | nop | 488 | nop |
| 852 | ldub [%o1], %g2 | 489 | ldub [%i1], %g2 |
| 853 | stb %g2, [%o0 + 4] | 490 | stb %g2, [%i0 + 4] |
| 854 | 1: | ||
| 855 | retl | ||
| 856 | RETL_INSN | ||
| 857 | |||
| 858 | #ifdef FASTER_NONALIGNED | ||
| 859 | |||
| 860 | 87: /* faster_nonaligned */ | ||
| 861 | |||
| 862 | andcc %o1, 3, %g0 | ||
| 863 | be 3f | ||
| 864 | andcc %o1, 1, %g0 | ||
| 865 | |||
| 866 | be 4f | ||
| 867 | andcc %o1, 2, %g0 | ||
| 868 | |||
| 869 | ldub [%o1], %g2 | ||
| 870 | add %o1, 1, %o1 | ||
| 871 | stb %g2, [%o0] | ||
| 872 | sub %o2, 1, %o2 | ||
| 873 | bne 3f | ||
| 874 | add %o0, 1, %o0 | ||
| 875 | 4: | ||
| 876 | lduh [%o1], %g2 | ||
| 877 | add %o1, 2, %o1 | ||
| 878 | srl %g2, 8, %g3 | ||
| 879 | sub %o2, 2, %o2 | ||
| 880 | stb %g3, [%o0] | ||
| 881 | add %o0, 2, %o0 | ||
| 882 | stb %g2, [%o0 - 1] | ||
| 883 | 3: | ||
| 884 | andcc %o1, 4, %g0 | ||
| 885 | |||
| 886 | bne 2f | ||
| 887 | cmp %o5, 1 | ||
| 888 | |||
| 889 | ld [%o1], %o4 | ||
| 890 | srl %o4, 24, %g2 | ||
| 891 | stb %g2, [%o0] | ||
| 892 | srl %o4, 16, %g3 | ||
| 893 | stb %g3, [%o0 + 1] | ||
| 894 | srl %o4, 8, %g2 | ||
| 895 | stb %g2, [%o0 + 2] | ||
| 896 | sub %o2, 4, %o2 | ||
| 897 | stb %o4, [%o0 + 3] | ||
| 898 | add %o1, 4, %o1 | ||
| 899 | add %o0, 4, %o0 | ||
| 900 | 2: | ||
| 901 | be 33f | ||
| 902 | cmp %o5, 2 | ||
| 903 | be 32f | ||
| 904 | sub %o2, 4, %o2 | ||
| 905 | 31: | ||
| 906 | ld [%o1], %g2 | ||
| 907 | add %o1, 4, %o1 | ||
| 908 | srl %g2, 24, %g3 | ||
| 909 | and %o0, 7, %g5 | ||
| 910 | stb %g3, [%o0] | ||
| 911 | cmp %g5, 7 | ||
| 912 | sll %g2, 8, %g1 | ||
| 913 | add %o0, 4, %o0 | ||
| 914 | be 41f | ||
| 915 | and %o2, 0xffffffc0, %o3 | ||
| 916 | ld [%o0 - 7], %o4 | ||
| 917 | 4: | ||
| 918 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 919 | SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 920 | SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 921 | SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 922 | subcc %o3, 64, %o3 | ||
| 923 | add %o1, 64, %o1 | ||
| 924 | bne 4b | ||
| 925 | add %o0, 64, %o0 | ||
| 926 | |||
| 927 | andcc %o2, 0x30, %o3 | ||
| 928 | be,a 1f | ||
| 929 | srl %g1, 16, %g2 | ||
| 930 | 4: | ||
| 931 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 932 | subcc %o3, 16, %o3 | ||
| 933 | add %o1, 16, %o1 | ||
| 934 | bne 4b | ||
| 935 | add %o0, 16, %o0 | ||
| 936 | |||
| 937 | srl %g1, 16, %g2 | ||
| 938 | 1: | ||
| 939 | st %o4, [%o0 - 7] | ||
| 940 | sth %g2, [%o0 - 3] | ||
| 941 | srl %g1, 8, %g4 | ||
| 942 | b 88f | ||
| 943 | stb %g4, [%o0 - 1] | ||
| 944 | 32: | ||
| 945 | ld [%o1], %g2 | ||
| 946 | add %o1, 4, %o1 | ||
| 947 | srl %g2, 16, %g3 | ||
| 948 | and %o0, 7, %g5 | ||
| 949 | sth %g3, [%o0] | ||
| 950 | cmp %g5, 6 | ||
| 951 | sll %g2, 16, %g1 | ||
| 952 | add %o0, 4, %o0 | ||
| 953 | be 42f | ||
| 954 | and %o2, 0xffffffc0, %o3 | ||
| 955 | ld [%o0 - 6], %o4 | ||
| 956 | 4: | ||
| 957 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 958 | SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 959 | SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 960 | SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 961 | subcc %o3, 64, %o3 | ||
| 962 | add %o1, 64, %o1 | ||
| 963 | bne 4b | ||
| 964 | add %o0, 64, %o0 | ||
| 965 | |||
| 966 | andcc %o2, 0x30, %o3 | ||
| 967 | be,a 1f | ||
| 968 | srl %g1, 16, %g2 | ||
| 969 | 4: | ||
| 970 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 971 | subcc %o3, 16, %o3 | ||
| 972 | add %o1, 16, %o1 | ||
| 973 | bne 4b | ||
| 974 | add %o0, 16, %o0 | ||
| 975 | |||
| 976 | srl %g1, 16, %g2 | ||
| 977 | 1: | ||
| 978 | st %o4, [%o0 - 6] | ||
| 979 | b 88f | ||
| 980 | sth %g2, [%o0 - 2] | ||
| 981 | 33: | ||
| 982 | ld [%o1], %g2 | ||
| 983 | sub %o2, 4, %o2 | ||
| 984 | srl %g2, 24, %g3 | ||
| 985 | and %o0, 7, %g5 | ||
| 986 | stb %g3, [%o0] | ||
| 987 | cmp %g5, 5 | ||
| 988 | srl %g2, 8, %g4 | ||
| 989 | sll %g2, 24, %g1 | ||
| 990 | sth %g4, [%o0 + 1] | ||
| 991 | add %o1, 4, %o1 | ||
| 992 | be 43f | ||
| 993 | and %o2, 0xffffffc0, %o3 | ||
| 994 | |||
| 995 | ld [%o0 - 1], %o4 | ||
| 996 | add %o0, 4, %o0 | ||
| 997 | 4: | ||
| 998 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1) | ||
| 999 | SMOVE_CHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1) | ||
| 1000 | SMOVE_CHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1) | ||
| 1001 | SMOVE_CHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1) | ||
| 1002 | subcc %o3, 64, %o3 | ||
| 1003 | add %o1, 64, %o1 | ||
| 1004 | bne 4b | ||
| 1005 | add %o0, 64, %o0 | ||
| 1006 | |||
| 1007 | andcc %o2, 0x30, %o3 | ||
| 1008 | be,a 1f | ||
| 1009 | srl %g1, 24, %g2 | ||
| 1010 | 4: | ||
| 1011 | SMOVE_CHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, -1) | ||
| 1012 | subcc %o3, 16, %o3 | ||
| 1013 | add %o1, 16, %o1 | ||
| 1014 | bne 4b | ||
| 1015 | add %o0, 16, %o0 | ||
| 1016 | |||
| 1017 | srl %g1, 24, %g2 | ||
| 1018 | 1: | ||
| 1019 | st %o4, [%o0 - 5] | ||
| 1020 | b 88f | ||
| 1021 | stb %g2, [%o0 - 1] | ||
| 1022 | 41: | ||
| 1023 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 1024 | SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 1025 | SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 1026 | SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 1027 | subcc %o3, 64, %o3 | ||
| 1028 | add %o1, 64, %o1 | ||
| 1029 | bne 41b | ||
| 1030 | add %o0, 64, %o0 | ||
| 1031 | |||
| 1032 | andcc %o2, 0x30, %o3 | ||
| 1033 | be,a 1f | ||
| 1034 | srl %g1, 16, %g2 | ||
| 1035 | 4: | ||
| 1036 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 8, 24, -3) | ||
| 1037 | subcc %o3, 16, %o3 | ||
| 1038 | add %o1, 16, %o1 | ||
| 1039 | bne 4b | ||
| 1040 | add %o0, 16, %o0 | ||
| 1041 | |||
| 1042 | srl %g1, 16, %g2 | ||
| 1043 | 1: | 491 | 1: |
| 1044 | sth %g2, [%o0 - 3] | 492 | ret |
| 1045 | srl %g1, 8, %g4 | 493 | restore %g7, %g0, %o0 |
| 1046 | b 88f | ||
| 1047 | stb %g4, [%o0 - 1] | ||
| 1048 | 43: | ||
| 1049 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3) | ||
| 1050 | SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3) | ||
| 1051 | SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3) | ||
| 1052 | SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3) | ||
| 1053 | subcc %o3, 64, %o3 | ||
| 1054 | add %o1, 64, %o1 | ||
| 1055 | bne 43b | ||
| 1056 | add %o0, 64, %o0 | ||
| 1057 | |||
| 1058 | andcc %o2, 0x30, %o3 | ||
| 1059 | be,a 1f | ||
| 1060 | srl %g1, 24, %g2 | ||
| 1061 | 4: | ||
| 1062 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 24, 8, 3) | ||
| 1063 | subcc %o3, 16, %o3 | ||
| 1064 | add %o1, 16, %o1 | ||
| 1065 | bne 4b | ||
| 1066 | add %o0, 16, %o0 | ||
| 1067 | |||
| 1068 | srl %g1, 24, %g2 | ||
| 1069 | 1: | ||
| 1070 | stb %g2, [%o0 + 3] | ||
| 1071 | b 88f | ||
| 1072 | add %o0, 4, %o0 | ||
| 1073 | 42: | ||
| 1074 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 1075 | SMOVE_ALIGNCHUNK(o1, o0, 0x10, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 1076 | SMOVE_ALIGNCHUNK(o1, o0, 0x20, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 1077 | SMOVE_ALIGNCHUNK(o1, o0, 0x30, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 1078 | subcc %o3, 64, %o3 | ||
| 1079 | add %o1, 64, %o1 | ||
| 1080 | bne 42b | ||
| 1081 | add %o0, 64, %o0 | ||
| 1082 | |||
| 1083 | andcc %o2, 0x30, %o3 | ||
| 1084 | be,a 1f | ||
| 1085 | srl %g1, 16, %g2 | ||
| 1086 | 4: | ||
| 1087 | SMOVE_ALIGNCHUNK(o1, o0, 0x00, g2, g3, g4, g5, o4, o5, g7, g1, 16, 16, -2) | ||
| 1088 | subcc %o3, 16, %o3 | ||
| 1089 | add %o1, 16, %o1 | ||
| 1090 | bne 4b | ||
| 1091 | add %o0, 16, %o0 | ||
| 1092 | |||
| 1093 | srl %g1, 16, %g2 | ||
| 1094 | 1: | ||
| 1095 | sth %g2, [%o0 - 2] | ||
| 1096 | |||
| 1097 | /* Fall through */ | ||
| 1098 | |||
| 1099 | #endif /* FASTER_NONALIGNED */ | ||
| 1100 | 494 | ||
| 1101 | 88: /* short_end */ | 495 | 88: /* short_end */ |
| 1102 | 496 | ||
| @@ -1127,7 +521,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ | |||
| 1127 | stb %g2, [%o0] | 521 | stb %g2, [%o0] |
| 1128 | 1: | 522 | 1: |
| 1129 | retl | 523 | retl |
| 1130 | RETL_INSN | 524 | mov %g7, %o0 |
| 1131 | 525 | ||
| 1132 | 90: /* short_aligned_end */ | 526 | 90: /* short_aligned_end */ |
| 1133 | bne 88b | 527 | bne 88b |
