aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/lib/checksum.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sh/lib/checksum.S')
-rw-r--r--arch/sh/lib/checksum.S69
1 files changed, 50 insertions, 19 deletions
diff --git a/arch/sh/lib/checksum.S b/arch/sh/lib/checksum.S
index cbdd0d40e545..356c8ec92893 100644
--- a/arch/sh/lib/checksum.S
+++ b/arch/sh/lib/checksum.S
@@ -36,8 +36,7 @@
36 */ 36 */
37 37
38/* 38/*
39 * unsigned int csum_partial(const unsigned char *buf, int len, 39 * asmlinkage __wsum csum_partial(const void *buf, int len, __wsum sum);
40 * unsigned int sum);
41 */ 40 */
42 41
43.text 42.text
@@ -49,11 +48,31 @@ ENTRY(csum_partial)
49 * Fortunately, it is easy to convert 2-byte alignment to 4-byte 48 * Fortunately, it is easy to convert 2-byte alignment to 4-byte
50 * alignment for the unrolled loop. 49 * alignment for the unrolled loop.
51 */ 50 */
52 mov r5, r1
53 mov r4, r0 51 mov r4, r0
54 tst #2, r0 ! Check alignment. 52 tst #3, r0 ! Check alignment.
55 bt 2f ! Jump if alignment is ok. 53 bt/s 2f ! Jump if alignment is ok.
54 mov r4, r7 ! Keep a copy to check for alignment
56 ! 55 !
56 tst #1, r0 ! Check alignment.
57 bt 21f ! Jump if alignment is boundary of 2bytes.
58
59 ! buf is odd
60 tst r5, r5
61 add #-1, r5
62 bt 9f
63 mov.b @r4+, r0
64 extu.b r0, r0
65 addc r0, r6 ! t=0 from previous tst
66 mov r6, r0
67 shll8 r6
68 shlr16 r0
69 shlr8 r0
70 or r0, r6
71 mov r4, r0
72 tst #2, r0
73 bt 2f
7421:
75 ! buf is 2 byte aligned (len could be 0)
57 add #-2, r5 ! Alignment uses up two bytes. 76 add #-2, r5 ! Alignment uses up two bytes.
58 cmp/pz r5 ! 77 cmp/pz r5 !
59 bt/s 1f ! Jump if we had at least two bytes. 78 bt/s 1f ! Jump if we had at least two bytes.
@@ -61,16 +80,17 @@ ENTRY(csum_partial)
61 bra 6f 80 bra 6f
62 add #2, r5 ! r5 was < 2. Deal with it. 81 add #2, r5 ! r5 was < 2. Deal with it.
631: 821:
64 mov r5, r1 ! Save new len for later use.
65 mov.w @r4+, r0 83 mov.w @r4+, r0
66 extu.w r0, r0 84 extu.w r0, r0
67 addc r0, r6 85 addc r0, r6
68 bf 2f 86 bf 2f
69 add #1, r6 87 add #1, r6
702: 882:
89 ! buf is 4 byte aligned (len could be 0)
90 mov r5, r1
71 mov #-5, r0 91 mov #-5, r0
72 shld r0, r5 92 shld r0, r1
73 tst r5, r5 93 tst r1, r1
74 bt/s 4f ! if it's =0, go to 4f 94 bt/s 4f ! if it's =0, go to 4f
75 clrt 95 clrt
76 .align 2 96 .align 2
@@ -92,30 +112,31 @@ ENTRY(csum_partial)
92 addc r0, r6 112 addc r0, r6
93 addc r2, r6 113 addc r2, r6
94 movt r0 114 movt r0
95 dt r5 115 dt r1
96 bf/s 3b 116 bf/s 3b
97 cmp/eq #1, r0 117 cmp/eq #1, r0
98 ! here, we know r5==0 118 ! here, we know r1==0
99 addc r5, r6 ! add carry to r6 119 addc r1, r6 ! add carry to r6
1004: 1204:
101 mov r1, r0 121 mov r5, r0
102 and #0x1c, r0 122 and #0x1c, r0
103 tst r0, r0 123 tst r0, r0
104 bt/s 6f 124 bt 6f
105 mov r0, r5 125 ! 4 bytes or more remaining
106 shlr2 r5 126 mov r0, r1
127 shlr2 r1
107 mov #0, r2 128 mov #0, r2
1085: 1295:
109 addc r2, r6 130 addc r2, r6
110 mov.l @r4+, r2 131 mov.l @r4+, r2
111 movt r0 132 movt r0
112 dt r5 133 dt r1
113 bf/s 5b 134 bf/s 5b
114 cmp/eq #1, r0 135 cmp/eq #1, r0
115 addc r2, r6 136 addc r2, r6
116 addc r5, r6 ! r5==0 here, so it means add carry-bit 137 addc r1, r6 ! r1==0 here, so it means add carry-bit
1176: 1386:
118 mov r1, r5 139 ! 3 bytes or less remaining
119 mov #3, r0 140 mov #3, r0
120 and r0, r5 141 and r0, r5
121 tst r5, r5 142 tst r5, r5
@@ -139,8 +160,18 @@ ENTRY(csum_partial)
1398: 1608:
140 addc r0, r6 161 addc r0, r6
141 mov #0, r0 162 mov #0, r0
142 addc r0, r6 163 addc r0, r6
1439: 1649:
165 ! Check if the buffer was misaligned, if so realign sum
166 mov r7, r0
167 tst #1, r0
168 bt 10f
169 mov r6, r0
170 shll8 r6
171 shlr16 r0
172 shlr8 r0
173 or r0, r6
17410:
144 rts 175 rts
145 mov r6, r0 176 mov r6, r0
146 177