| From 0a7316055e710cf551484615c0b1887e156ed972 Mon Sep 17 00:00:00 2001 |
| From: "David S. Miller" <davem@davemloft.net> |
| Date: Wed, 19 Oct 2011 15:30:14 -0700 |
| Subject: sparc32: Remove uses of %g7 in memcpy implementation. |
| |
| |
| From: "David S. Miller" <davem@davemloft.net> |
| |
| [ Upstream commit 21f74d361dfd6a7d0e47574e315f780d8172084a ] |
| |
| This is setting things up so that we can correct the return |
| value, so that it properly returns the original destination |
| buffer pointer. |
| |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Tested-by: Kjetil Oftedal <oftedal@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| arch/sparc/lib/memcpy.S | 177 ++++++++++++++++++++++++------------------------ |
| 1 file changed, 91 insertions(+), 86 deletions(-) |
| |
| --- a/arch/sparc/lib/memcpy.S |
| +++ b/arch/sparc/lib/memcpy.S |
| @@ -235,7 +235,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len |
| add %o1, 4, %o1 |
| add %o0, 4, %o0 |
| 2: |
| - andcc %g1, 0xffffff80, %g7 |
| + andcc %g1, 0xffffff80, %g0 |
| be 3f |
| andcc %o0, 4, %g0 |
| |
| @@ -245,22 +245,23 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len |
| MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) |
| MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) |
| MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) |
| - subcc %g7, 128, %g7 |
| + sub %g1, 128, %g1 |
| add %o1, 128, %o1 |
| - bne 5b |
| + cmp %g1, 128 |
| + bge 5b |
| add %o0, 128, %o0 |
| 3: |
| - andcc %g1, 0x70, %g7 |
| + andcc %g1, 0x70, %g4 |
| be 80f |
| andcc %g1, 8, %g0 |
| |
| sethi %hi(80f), %o5 |
| - srl %g7, 1, %o4 |
| - add %g7, %o4, %o4 |
| - add %o1, %g7, %o1 |
| + srl %g4, 1, %o4 |
| + add %g4, %o4, %o4 |
| + add %o1, %g4, %o1 |
| sub %o5, %o4, %o5 |
| jmpl %o5 + %lo(80f), %g0 |
| - add %o0, %g7, %o0 |
| + add %o0, %g4, %o0 |
| |
| 79: /* memcpy_table */ |
| |
| @@ -314,20 +315,21 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len |
| MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5) |
| MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5) |
| MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5) |
| - subcc %g7, 128, %g7 |
| + subcc %g1, 128, %g1 |
| add %o1, 128, %o1 |
| - bne 82b |
| + cmp %g1, 128 |
| + bge 82b |
| add %o0, 128, %o0 |
| |
| - andcc %g1, 0x70, %g7 |
| + andcc %g1, 0x70, %g4 |
| be 84f |
| andcc %g1, 8, %g0 |
| |
| sethi %hi(84f), %o5 |
| - add %o1, %g7, %o1 |
| - sub %o5, %g7, %o5 |
| + add %o1, %g4, %o1 |
| + sub %o5, %g4, %o5 |
| jmpl %o5 + %lo(84f), %g0 |
| - add %o0, %g7, %o0 |
| + add %o0, %g4, %o0 |
| |
| 83: /* amemcpy_table */ |
| |
| @@ -376,124 +378,127 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len |
| 86: /* non_aligned */ |
| cmp %o2, 6 |
| bleu 88f |
| - andcc %o0, 3, %g0 |
| + nop |
| + |
| + save %sp, -96, %sp |
| + andcc %i0, 3, %g0 |
| be 61f |
| - andcc %o0, 1, %g0 |
| + andcc %i0, 1, %g0 |
| be 60f |
| - andcc %o0, 2, %g0 |
| + andcc %i0, 2, %g0 |
| |
| - ldub [%o1], %g5 |
| - add %o1, 1, %o1 |
| - stb %g5, [%o0] |
| - sub %o2, 1, %o2 |
| + ldub [%i1], %g5 |
| + add %i1, 1, %i1 |
| + stb %g5, [%i0] |
| + sub %i2, 1, %i2 |
| bne 61f |
| - add %o0, 1, %o0 |
| + add %i0, 1, %i0 |
| 60: |
| - ldub [%o1], %g3 |
| - add %o1, 2, %o1 |
| - stb %g3, [%o0] |
| - sub %o2, 2, %o2 |
| - ldub [%o1 - 1], %g3 |
| - add %o0, 2, %o0 |
| - stb %g3, [%o0 - 1] |
| + ldub [%i1], %g3 |
| + add %i1, 2, %i1 |
| + stb %g3, [%i0] |
| + sub %i2, 2, %i2 |
| + ldub [%i1 - 1], %g3 |
| + add %i0, 2, %i0 |
| + stb %g3, [%i0 - 1] |
| 61: |
| - and %o1, 3, %g2 |
| - and %o2, 0xc, %g3 |
| - and %o1, -4, %o1 |
| + and %i1, 3, %g2 |
| + and %i2, 0xc, %g3 |
| + and %i1, -4, %i1 |
| cmp %g3, 4 |
| sll %g2, 3, %g4 |
| mov 32, %g2 |
| be 4f |
| - sub %g2, %g4, %g7 |
| + sub %g2, %g4, %l0 |
| |
| blu 3f |
| cmp %g3, 0x8 |
| |
| be 2f |
| - srl %o2, 2, %g3 |
| + srl %i2, 2, %g3 |
| |
| - ld [%o1], %o3 |
| - add %o0, -8, %o0 |
| - ld [%o1 + 4], %o4 |
| + ld [%i1], %i3 |
| + add %i0, -8, %i0 |
| + ld [%i1 + 4], %i4 |
| b 8f |
| add %g3, 1, %g3 |
| 2: |
| - ld [%o1], %o4 |
| - add %o0, -12, %o0 |
| - ld [%o1 + 4], %o5 |
| + ld [%i1], %i4 |
| + add %i0, -12, %i0 |
| + ld [%i1 + 4], %i5 |
| add %g3, 2, %g3 |
| b 9f |
| - add %o1, -4, %o1 |
| + add %i1, -4, %i1 |
| 3: |
| - ld [%o1], %g1 |
| - add %o0, -4, %o0 |
| - ld [%o1 + 4], %o3 |
| - srl %o2, 2, %g3 |
| + ld [%i1], %g1 |
| + add %i0, -4, %i0 |
| + ld [%i1 + 4], %i3 |
| + srl %i2, 2, %g3 |
| b 7f |
| - add %o1, 4, %o1 |
| + add %i1, 4, %i1 |
| 4: |
| - ld [%o1], %o5 |
| - cmp %o2, 7 |
| - ld [%o1 + 4], %g1 |
| - srl %o2, 2, %g3 |
| + ld [%i1], %i5 |
| + cmp %i2, 7 |
| + ld [%i1 + 4], %g1 |
| + srl %i2, 2, %g3 |
| bleu 10f |
| - add %o1, 8, %o1 |
| + add %i1, 8, %i1 |
| |
| - ld [%o1], %o3 |
| + ld [%i1], %i3 |
| add %g3, -1, %g3 |
| 5: |
| - sll %o5, %g4, %g2 |
| - srl %g1, %g7, %g5 |
| + sll %i5, %g4, %g2 |
| + srl %g1, %l0, %g5 |
| or %g2, %g5, %g2 |
| - st %g2, [%o0] |
| + st %g2, [%i0] |
| 7: |
| - ld [%o1 + 4], %o4 |
| + ld [%i1 + 4], %i4 |
| sll %g1, %g4, %g2 |
| - srl %o3, %g7, %g5 |
| + srl %i3, %l0, %g5 |
| or %g2, %g5, %g2 |
| - st %g2, [%o0 + 4] |
| + st %g2, [%i0 + 4] |
| 8: |
| - ld [%o1 + 8], %o5 |
| - sll %o3, %g4, %g2 |
| - srl %o4, %g7, %g5 |
| + ld [%i1 + 8], %i5 |
| + sll %i3, %g4, %g2 |
| + srl %i4, %l0, %g5 |
| or %g2, %g5, %g2 |
| - st %g2, [%o0 + 8] |
| + st %g2, [%i0 + 8] |
| 9: |
| - ld [%o1 + 12], %g1 |
| - sll %o4, %g4, %g2 |
| - srl %o5, %g7, %g5 |
| + ld [%i1 + 12], %g1 |
| + sll %i4, %g4, %g2 |
| + srl %i5, %l0, %g5 |
| addcc %g3, -4, %g3 |
| or %g2, %g5, %g2 |
| - add %o1, 16, %o1 |
| - st %g2, [%o0 + 12] |
| - add %o0, 16, %o0 |
| + add %i1, 16, %i1 |
| + st %g2, [%i0 + 12] |
| + add %i0, 16, %i0 |
| bne,a 5b |
| - ld [%o1], %o3 |
| + ld [%i1], %i3 |
| 10: |
| - sll %o5, %g4, %g2 |
| - srl %g1, %g7, %g5 |
| - srl %g7, 3, %g3 |
| + sll %i5, %g4, %g2 |
| + srl %g1, %l0, %g5 |
| + srl %l0, 3, %g3 |
| or %g2, %g5, %g2 |
| - sub %o1, %g3, %o1 |
| - andcc %o2, 2, %g0 |
| - st %g2, [%o0] |
| + sub %i1, %g3, %i1 |
| + andcc %i2, 2, %g0 |
| + st %g2, [%i0] |
| be 1f |
| - andcc %o2, 1, %g0 |
| + andcc %i2, 1, %g0 |
| |
| - ldub [%o1], %g2 |
| - add %o1, 2, %o1 |
| - stb %g2, [%o0 + 4] |
| - add %o0, 2, %o0 |
| - ldub [%o1 - 1], %g2 |
| - stb %g2, [%o0 + 3] |
| + ldub [%i1], %g2 |
| + add %i1, 2, %i1 |
| + stb %g2, [%i0 + 4] |
| + add %i0, 2, %i0 |
| + ldub [%i1 - 1], %g2 |
| + stb %g2, [%i0 + 3] |
| 1: |
| be 1f |
| nop |
| - ldub [%o1], %g2 |
| - stb %g2, [%o0 + 4] |
| + ldub [%i1], %g2 |
| + stb %g2, [%i0 + 4] |
| 1: |
| - retl |
| - RETL_INSN |
| + ret |
| + restore %g0, %g0, %o0 |
| |
| 88: /* short_end */ |
| |