Commit 21f74d36 authored by David S. Miller's avatar David S. Miller

sparc32: Remove uses of %g7 in memcpy implementation.

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: default avatarDavid S. Miller <davem@davemloft.net>
Tested-by: default avatarKjetil Oftedal <oftedal@gmail.com>
parent 045b7de9
...@@ -235,7 +235,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ ...@@ -235,7 +235,7 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
add %o1, 4, %o1 add %o1, 4, %o1
add %o0, 4, %o0 add %o0, 4, %o0
2: 2:
andcc %g1, 0xffffff80, %g7 andcc %g1, 0xffffff80, %g0
be 3f be 3f
andcc %o0, 4, %g0 andcc %o0, 4, %g0
...@@ -245,22 +245,23 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ ...@@ -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, 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, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGCHUNK(o1, o0, 0x60, 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 add %o1, 128, %o1
bne 5b cmp %g1, 128
bge 5b
add %o0, 128, %o0 add %o0, 128, %o0
3: 3:
andcc %g1, 0x70, %g7 andcc %g1, 0x70, %g4
be 80f be 80f
andcc %g1, 8, %g0 andcc %g1, 8, %g0
sethi %hi(80f), %o5 sethi %hi(80f), %o5
srl %g7, 1, %o4 srl %g4, 1, %o4
add %g7, %o4, %o4 add %g4, %o4, %o4
add %o1, %g7, %o1 add %o1, %g4, %o1
sub %o5, %o4, %o5 sub %o5, %o4, %o5
jmpl %o5 + %lo(80f), %g0 jmpl %o5 + %lo(80f), %g0
add %o0, %g7, %o0 add %o0, %g4, %o0
79: /* memcpy_table */ 79: /* memcpy_table */
...@@ -314,20 +315,21 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ ...@@ -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, 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, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
MOVE_BIGALIGNCHUNK(o1, o0, 0x60, 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 add %o1, 128, %o1
bne 82b cmp %g1, 128
bge 82b
add %o0, 128, %o0 add %o0, 128, %o0
andcc %g1, 0x70, %g7 andcc %g1, 0x70, %g4
be 84f be 84f
andcc %g1, 8, %g0 andcc %g1, 8, %g0
sethi %hi(84f), %o5 sethi %hi(84f), %o5
add %o1, %g7, %o1 add %o1, %g4, %o1
sub %o5, %g7, %o5 sub %o5, %g4, %o5
jmpl %o5 + %lo(84f), %g0 jmpl %o5 + %lo(84f), %g0
add %o0, %g7, %o0 add %o0, %g4, %o0
83: /* amemcpy_table */ 83: /* amemcpy_table */
...@@ -376,124 +378,127 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */ ...@@ -376,124 +378,127 @@ FUNC(memcpy) /* %o0=dst %o1=src %o2=len */
86: /* non_aligned */ 86: /* non_aligned */
cmp %o2, 6 cmp %o2, 6
bleu 88f bleu 88f
andcc %o0, 3, %g0 nop
save %sp, -96, %sp
andcc %i0, 3, %g0
be 61f be 61f
andcc %o0, 1, %g0 andcc %i0, 1, %g0
be 60f be 60f
andcc %o0, 2, %g0 andcc %i0, 2, %g0
ldub [%o1], %g5 ldub [%i1], %g5
add %o1, 1, %o1 add %i1, 1, %i1
stb %g5, [%o0] stb %g5, [%i0]
sub %o2, 1, %o2 sub %i2, 1, %i2
bne 61f bne 61f
add %o0, 1, %o0 add %i0, 1, %i0
60: 60:
ldub [%o1], %g3 ldub [%i1], %g3
add %o1, 2, %o1 add %i1, 2, %i1
stb %g3, [%o0] stb %g3, [%i0]
sub %o2, 2, %o2 sub %i2, 2, %i2
ldub [%o1 - 1], %g3 ldub [%i1 - 1], %g3
add %o0, 2, %o0 add %i0, 2, %i0
stb %g3, [%o0 - 1] stb %g3, [%i0 - 1]
61: 61:
and %o1, 3, %g2 and %i1, 3, %g2
and %o2, 0xc, %g3 and %i2, 0xc, %g3
and %o1, -4, %o1 and %i1, -4, %i1
cmp %g3, 4 cmp %g3, 4
sll %g2, 3, %g4 sll %g2, 3, %g4
mov 32, %g2 mov 32, %g2
be 4f be 4f
sub %g2, %g4, %g7 sub %g2, %g4, %l0
blu 3f blu 3f
cmp %g3, 0x8 cmp %g3, 0x8
be 2f be 2f
srl %o2, 2, %g3 srl %i2, 2, %g3
ld [%o1], %o3 ld [%i1], %i3
add %o0, -8, %o0 add %i0, -8, %i0
ld [%o1 + 4], %o4 ld [%i1 + 4], %i4
b 8f b 8f
add %g3, 1, %g3 add %g3, 1, %g3
2: 2:
ld [%o1], %o4 ld [%i1], %i4
add %o0, -12, %o0 add %i0, -12, %i0
ld [%o1 + 4], %o5 ld [%i1 + 4], %i5
add %g3, 2, %g3 add %g3, 2, %g3
b 9f b 9f
add %o1, -4, %o1 add %i1, -4, %i1
3: 3:
ld [%o1], %g1 ld [%i1], %g1
add %o0, -4, %o0 add %i0, -4, %i0
ld [%o1 + 4], %o3 ld [%i1 + 4], %i3
srl %o2, 2, %g3 srl %i2, 2, %g3
b 7f b 7f
add %o1, 4, %o1 add %i1, 4, %i1
4: 4:
ld [%o1], %o5 ld [%i1], %i5
cmp %o2, 7 cmp %i2, 7
ld [%o1 + 4], %g1 ld [%i1 + 4], %g1
srl %o2, 2, %g3 srl %i2, 2, %g3
bleu 10f bleu 10f
add %o1, 8, %o1 add %i1, 8, %i1
ld [%o1], %o3 ld [%i1], %i3
add %g3, -1, %g3 add %g3, -1, %g3
5: 5:
sll %o5, %g4, %g2 sll %i5, %g4, %g2
srl %g1, %g7, %g5 srl %g1, %l0, %g5
or %g2, %g5, %g2 or %g2, %g5, %g2
st %g2, [%o0] st %g2, [%i0]
7: 7:
ld [%o1 + 4], %o4 ld [%i1 + 4], %i4
sll %g1, %g4, %g2 sll %g1, %g4, %g2
srl %o3, %g7, %g5 srl %i3, %l0, %g5
or %g2, %g5, %g2 or %g2, %g5, %g2
st %g2, [%o0 + 4] st %g2, [%i0 + 4]
8: 8:
ld [%o1 + 8], %o5 ld [%i1 + 8], %i5
sll %o3, %g4, %g2 sll %i3, %g4, %g2
srl %o4, %g7, %g5 srl %i4, %l0, %g5
or %g2, %g5, %g2 or %g2, %g5, %g2
st %g2, [%o0 + 8] st %g2, [%i0 + 8]
9: 9:
ld [%o1 + 12], %g1 ld [%i1 + 12], %g1
sll %o4, %g4, %g2 sll %i4, %g4, %g2
srl %o5, %g7, %g5 srl %i5, %l0, %g5
addcc %g3, -4, %g3 addcc %g3, -4, %g3
or %g2, %g5, %g2 or %g2, %g5, %g2
add %o1, 16, %o1 add %i1, 16, %i1
st %g2, [%o0 + 12] st %g2, [%i0 + 12]
add %o0, 16, %o0 add %i0, 16, %i0
bne,a 5b bne,a 5b
ld [%o1], %o3 ld [%i1], %i3
10: 10:
sll %o5, %g4, %g2 sll %i5, %g4, %g2
srl %g1, %g7, %g5 srl %g1, %l0, %g5
srl %g7, 3, %g3 srl %l0, 3, %g3
or %g2, %g5, %g2 or %g2, %g5, %g2
sub %o1, %g3, %o1 sub %i1, %g3, %i1
andcc %o2, 2, %g0 andcc %i2, 2, %g0
st %g2, [%o0] st %g2, [%i0]
be 1f be 1f
andcc %o2, 1, %g0 andcc %i2, 1, %g0
ldub [%o1], %g2 ldub [%i1], %g2
add %o1, 2, %o1 add %i1, 2, %i1
stb %g2, [%o0 + 4] stb %g2, [%i0 + 4]
add %o0, 2, %o0 add %i0, 2, %i0
ldub [%o1 - 1], %g2 ldub [%i1 - 1], %g2
stb %g2, [%o0 + 3] stb %g2, [%i0 + 3]
1: 1:
be 1f be 1f
nop nop
ldub [%o1], %g2 ldub [%i1], %g2
stb %g2, [%o0 + 4] stb %g2, [%i0 + 4]
1: 1:
retl ret
RETL_INSN restore %g0, %g0, %o0
88: /* short_end */ 88: /* short_end */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment