diff options
| author | Lennox Wu <lennox.wu@gmail.com> | 2013-09-14 01:58:40 -0400 |
|---|---|---|
| committer | Lennox Wu <lennox.wu@gmail.com> | 2013-09-25 15:46:03 -0400 |
| commit | 1ed62ca648557b884d117a4a8bbcf2ae4e2d1153 (patch) | |
| tree | 988bce04a151062a599e89aa69695cb88b927d20 | |
| parent | 5fbbf8a1a93452b26e7791cf32cefce62b0a480b (diff) | |
Score: Implement the function csum_ipv6_magic
Signed-off-by: Lennox Wu <lennox.wu@gmail.com>
| -rw-r--r-- | arch/score/include/asm/checksum.h | 93 |
1 files changed, 51 insertions, 42 deletions
diff --git a/arch/score/include/asm/checksum.h b/arch/score/include/asm/checksum.h index f909ac3144a4..961bd64015a8 100644 --- a/arch/score/include/asm/checksum.h +++ b/arch/score/include/asm/checksum.h | |||
| @@ -184,48 +184,57 @@ static inline __sum16 csum_ipv6_magic(const struct in6_addr *saddr, | |||
| 184 | __wsum sum) | 184 | __wsum sum) |
| 185 | { | 185 | { |
| 186 | __asm__ __volatile__( | 186 | __asm__ __volatile__( |
| 187 | ".set\tnoreorder\t\t\t# csum_ipv6_magic\n\t" | 187 | ".set\tvolatile\t\t\t# csum_ipv6_magic\n\t" |
| 188 | ".set\tnoat\n\t" | 188 | "add\t%0, %0, %5\t\t\t# proto (long in network byte order)\n\t" |
| 189 | "addu\t%0, %5\t\t\t# proto (long in network byte order)\n\t" | 189 | "cmp.c\t%5, %0\n\t" |
| 190 | "sltu\t$1, %0, %5\n\t" | 190 | "bleu 1f\n\t" |
| 191 | "addu\t%0, $1\n\t" | 191 | "addi\t%0, 0x1\n\t" |
| 192 | "addu\t%0, %6\t\t\t# csum\n\t" | 192 | "1:add\t%0, %0, %6\t\t\t# csum\n\t" |
| 193 | "sltu\t$1, %0, %6\n\t" | 193 | "cmp.c\t%6, %0\n\t" |
| 194 | "lw\t%1, 0(%2)\t\t\t# four words source address\n\t" | 194 | "lw\t%1, [%2, 0]\t\t\t# four words source address\n\t" |
| 195 | "addu\t%0, $1\n\t" | 195 | "bleu 1f\n\t" |
| 196 | "addu\t%0, %1\n\t" | 196 | "addi\t%0, 0x1\n\t" |
| 197 | "sltu\t$1, %0, %1\n\t" | 197 | "1:add\t%0, %0, %1\n\t" |
| 198 | "lw\t%1, 4(%2)\n\t" | 198 | "cmp.c\t%1, %0\n\t" |
| 199 | "addu\t%0, $1\n\t" | 199 | "1:lw\t%1, [%2, 4]\n\t" |
| 200 | "addu\t%0, %1\n\t" | 200 | "bleu 1f\n\t" |
| 201 | "sltu\t$1, %0, %1\n\t" | 201 | "addi\t%0, 0x1\n\t" |
| 202 | "lw\t%1, 8(%2)\n\t" | 202 | "1:add\t%0, %0, %1\n\t" |
| 203 | "addu\t%0, $1\n\t" | 203 | "cmp.c\t%1, %0\n\t" |
| 204 | "addu\t%0, %1\n\t" | 204 | "lw\t%1, [%2,8]\n\t" |
| 205 | "sltu\t$1, %0, %1\n\t" | 205 | "bleu 1f\n\t" |
| 206 | "lw\t%1, 12(%2)\n\t" | 206 | "addi\t%0, 0x1\n\t" |
| 207 | "addu\t%0, $1\n\t" | 207 | "1:add\t%0, %0, %1\n\t" |
| 208 | "addu\t%0, %1\n\t" | 208 | "cmp.c\t%1, %0\n\t" |
| 209 | "sltu\t$1, %0, %1\n\t" | 209 | "lw\t%1, [%2, 12]\n\t" |
| 210 | "lw\t%1, 0(%3)\n\t" | 210 | "bleu 1f\n\t" |
| 211 | "addu\t%0, $1\n\t" | 211 | "addi\t%0, 0x1\n\t" |
| 212 | "addu\t%0, %1\n\t" | 212 | "1:add\t%0, %0,%1\n\t" |
| 213 | "sltu\t$1, %0, %1\n\t" | 213 | "cmp.c\t%1, %0\n\t" |
| 214 | "lw\t%1, 4(%3)\n\t" | 214 | "lw\t%1, [%3, 0]\n\t" |
| 215 | "addu\t%0, $1\n\t" | 215 | "bleu 1f\n\t" |
| 216 | "addu\t%0, %1\n\t" | 216 | "addi\t%0, 0x1\n\t" |
| 217 | "sltu\t$1, %0, %1\n\t" | 217 | "1:add\t%0, %0, %1\n\t" |
| 218 | "lw\t%1, 8(%3)\n\t" | 218 | "cmp.c\t%1, %0\n\t" |
| 219 | "addu\t%0, $1\n\t" | 219 | "lw\t%1, [%3, 4]\n\t" |
| 220 | "addu\t%0, %1\n\t" | 220 | "bleu 1f\n\t" |
| 221 | "sltu\t$1, %0, %1\n\t" | 221 | "addi\t%0, 0x1\n\t" |
| 222 | "lw\t%1, 12(%3)\n\t" | 222 | "1:add\t%0, %0, %1\n\t" |
| 223 | "addu\t%0, $1\n\t" | 223 | "cmp.c\t%1, %0\n\t" |
| 224 | "addu\t%0, %1\n\t" | 224 | "lw\t%1, [%3, 8]\n\t" |
| 225 | "sltu\t$1, %0, %1\n\t" | 225 | "bleu 1f\n\t" |
| 226 | "addu\t%0, $1\t\t\t# Add final carry\n\t" | 226 | "addi\t%0, 0x1\n\t" |
| 227 | ".set\tnoat\n\t" | 227 | "1:add\t%0, %0, %1\n\t" |
| 228 | ".set\tnoreorder" | 228 | "cmp.c\t%1, %0\n\t" |
| 229 | "lw\t%1, [%3, 12]\n\t" | ||
| 230 | "bleu 1f\n\t" | ||
| 231 | "addi\t%0, 0x1\n\t" | ||
| 232 | "1:add\t%0, %0, %1\n\t" | ||
| 233 | "cmp.c\t%1, %0\n\t" | ||
| 234 | "bleu 1f\n\t" | ||
| 235 | "addi\t%0, 0x1\n\t" | ||
| 236 | "1:\n\t" | ||
| 237 | ".set\toptimize" | ||
| 229 | : "=r" (sum), "=r" (proto) | 238 | : "=r" (sum), "=r" (proto) |
| 230 | : "r" (saddr), "r" (daddr), | 239 | : "r" (saddr), "r" (daddr), |
| 231 | "0" (htonl(len)), "1" (htonl(proto)), "r" (sum)); | 240 | "0" (htonl(len)), "1" (htonl(proto)), "r" (sum)); |
