Commit 1b62ca7bf5775bed048032b7e779561e1fe66aa0

Authored by David S. Miller
1 parent a9e8d1a6b8

sparc64: Fix return value of Niagara-2 memcpy.

It gets clobbered by the kernel's VISEntryHalf, so we have to save it
in a different register than the set clobbered by that macro.

The instance in glibc is OK and doesn't have this problem.

Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 23 additions and 23 deletions Side-by-side Diff

arch/sparc/lib/NG2memcpy.S
... ... @@ -14,7 +14,7 @@
14 14 #define FPRS_FEF 0x04
15 15 #ifdef MEMCPY_DEBUG
16 16 #define VISEntryHalf rd %fprs, %o5; wr %g0, FPRS_FEF, %fprs; \
17   - clr %g1; clr %g2; clr %g3; subcc %g0, %g0, %g0;
  17 + clr %g1; clr %g2; clr %g3; clr %g5; subcc %g0, %g0, %g0;
18 18 #define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs
19 19 #else
20 20 #define VISEntryHalf rd %fprs, %o5; wr %g0, FPRS_FEF, %fprs
21 21  
22 22  
... ... @@ -182,13 +182,13 @@
182 182 cmp %g2, 0
183 183 tne %xcc, 5
184 184 PREAMBLE
185   - mov %o0, GLOBAL_SPARE
  185 + mov %o0, %o3
186 186 cmp %o2, 0
187 187 be,pn %XCC, 85f
188   - or %o0, %o1, %o3
  188 + or %o0, %o1, GLOBAL_SPARE
189 189 cmp %o2, 16
190 190 blu,a,pn %XCC, 80f
191   - or %o3, %o2, %o3
  191 + or GLOBAL_SPARE, %o2, GLOBAL_SPARE
192 192  
193 193 /* 2 blocks (128 bytes) is the minimum we can do the block
194 194 * copy with. We need to ensure that we'll iterate at least
... ... @@ -202,7 +202,7 @@
202 202 */
203 203 cmp %o2, (4 * 64)
204 204 blu,pt %XCC, 75f
205   - andcc %o3, 0x7, %g0
  205 + andcc GLOBAL_SPARE, 0x7, %g0
206 206  
207 207 /* %o0: dst
208 208 * %o1: src
209 209  
... ... @@ -404,13 +404,13 @@
404 404 * over. If anything is left, we copy it one byte at a time.
405 405 */
406 406 brz,pt %o2, 85f
407   - sub %o0, %o1, %o3
  407 + sub %o0, %o1, GLOBAL_SPARE
408 408 ba,a,pt %XCC, 90f
409 409  
410 410 .align 64
411 411 75: /* 16 < len <= 64 */
412 412 bne,pn %XCC, 75f
413   - sub %o0, %o1, %o3
  413 + sub %o0, %o1, GLOBAL_SPARE
414 414  
415 415 72:
416 416 andn %o2, 0xf, %o4
417 417  
... ... @@ -420,9 +420,9 @@
420 420 add %o1, 0x08, %o1
421 421 EX_LD(LOAD(ldx, %o1, %g1))
422 422 sub %o1, 0x08, %o1
423   - EX_ST(STORE(stx, %o5, %o1 + %o3))
  423 + EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE))
424 424 add %o1, 0x8, %o1
425   - EX_ST(STORE(stx, %g1, %o1 + %o3))
  425 + EX_ST(STORE(stx, %g1, %o1 + GLOBAL_SPARE))
426 426 bgu,pt %XCC, 1b
427 427 add %o1, 0x8, %o1
428 428 73: andcc %o2, 0x8, %g0
429 429  
... ... @@ -430,14 +430,14 @@
430 430 nop
431 431 sub %o2, 0x8, %o2
432 432 EX_LD(LOAD(ldx, %o1, %o5))
433   - EX_ST(STORE(stx, %o5, %o1 + %o3))
  433 + EX_ST(STORE(stx, %o5, %o1 + GLOBAL_SPARE))
434 434 add %o1, 0x8, %o1
435 435 1: andcc %o2, 0x4, %g0
436 436 be,pt %XCC, 1f
437 437 nop
438 438 sub %o2, 0x4, %o2
439 439 EX_LD(LOAD(lduw, %o1, %o5))
440   - EX_ST(STORE(stw, %o5, %o1 + %o3))
  440 + EX_ST(STORE(stw, %o5, %o1 + GLOBAL_SPARE))
441 441 add %o1, 0x4, %o1
442 442 1: cmp %o2, 0
443 443 be,pt %XCC, 85f
444 444  
... ... @@ -454,11 +454,11 @@
454 454  
455 455 1: subcc %g1, 1, %g1
456 456 EX_LD(LOAD(ldub, %o1, %o5))
457   - EX_ST(STORE(stb, %o5, %o1 + %o3))
  457 + EX_ST(STORE(stb, %o5, %o1 + GLOBAL_SPARE))
458 458 bgu,pt %icc, 1b
459 459 add %o1, 1, %o1
460 460  
461   -2: add %o1, %o3, %o0
  461 +2: add %o1, GLOBAL_SPARE, %o0
462 462 andcc %o1, 0x7, %g1
463 463 bne,pt %icc, 8f
464 464 sll %g1, 3, %g1
465 465  
466 466  
... ... @@ -468,16 +468,16 @@
468 468 nop
469 469 ba,a,pt %xcc, 73b
470 470  
471   -8: mov 64, %o3
  471 +8: mov 64, GLOBAL_SPARE
472 472 andn %o1, 0x7, %o1
473 473 EX_LD(LOAD(ldx, %o1, %g2))
474   - sub %o3, %g1, %o3
  474 + sub GLOBAL_SPARE, %g1, GLOBAL_SPARE
475 475 andn %o2, 0x7, %o4
476 476 sllx %g2, %g1, %g2
477 477 1: add %o1, 0x8, %o1
478 478 EX_LD(LOAD(ldx, %o1, %g3))
479 479 subcc %o4, 0x8, %o4
480   - srlx %g3, %o3, %o5
  480 + srlx %g3, GLOBAL_SPARE, %o5
481 481 or %o5, %g2, %o5
482 482 EX_ST(STORE(stx, %o5, %o0))
483 483 add %o0, 0x8, %o0
484 484  
485 485  
486 486  
487 487  
488 488  
489 489  
... ... @@ -489,33 +489,33 @@
489 489 be,pn %icc, 85f
490 490 add %o1, %g1, %o1
491 491 ba,pt %xcc, 90f
492   - sub %o0, %o1, %o3
  492 + sub %o0, %o1, GLOBAL_SPARE
493 493  
494 494 .align 64
495 495 80: /* 0 < len <= 16 */
496   - andcc %o3, 0x3, %g0
  496 + andcc GLOBAL_SPARE, 0x3, %g0
497 497 bne,pn %XCC, 90f
498   - sub %o0, %o1, %o3
  498 + sub %o0, %o1, GLOBAL_SPARE
499 499  
500 500 1:
501 501 subcc %o2, 4, %o2
502 502 EX_LD(LOAD(lduw, %o1, %g1))
503   - EX_ST(STORE(stw, %g1, %o1 + %o3))
  503 + EX_ST(STORE(stw, %g1, %o1 + GLOBAL_SPARE))
504 504 bgu,pt %XCC, 1b
505 505 add %o1, 4, %o1
506 506  
507 507 85: retl
508   - mov EX_RETVAL(GLOBAL_SPARE), %o0
  508 + mov EX_RETVAL(%o3), %o0
509 509  
510 510 .align 32
511 511 90:
512 512 subcc %o2, 1, %o2
513 513 EX_LD(LOAD(ldub, %o1, %g1))
514   - EX_ST(STORE(stb, %g1, %o1 + %o3))
  514 + EX_ST(STORE(stb, %g1, %o1 + GLOBAL_SPARE))
515 515 bgu,pt %XCC, 90b
516 516 add %o1, 1, %o1
517 517 retl
518   - mov EX_RETVAL(GLOBAL_SPARE), %o0
  518 + mov EX_RETVAL(%o3), %o0
519 519  
520 520 .size FUNC_NAME, .-FUNC_NAME