Blackfin arch: Faster Implementation of csum_tcpudp_nofold()
Avoid conditional branch instructions during carry bit additions. Special thanks to Bernd. Simplify: Use ((len + proto) << 8) like every other __LITTLE_ENDIAN__ machine Cc: Bernd Schmidt <bernds_cb1@t-online.de> Signed-off-by: Michael Hennerich <michael.hennerich@analog.com> Signed-off-by: Bryan Wu <cooloney@kernel.org>
This commit is contained in:
parent
0ce5eaf8ec
commit
aa9c33b496
@ -63,23 +63,23 @@ static inline __wsum
|
|||||||
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||||
unsigned short proto, __wsum sum)
|
unsigned short proto, __wsum sum)
|
||||||
{
|
{
|
||||||
|
unsigned int carry;
|
||||||
|
|
||||||
__asm__ ("%0 = %0 + %1;\n\t"
|
__asm__ ("%0 = %0 + %2;\n\t"
|
||||||
"CC = AC0;\n\t"
|
"CC = AC0;\n\t"
|
||||||
"if !CC jump 4;\n\t"
|
"%1 = CC;\n\t"
|
||||||
"%0 = %0 + %4;\n\t"
|
"%0 = %0 + %1;\n\t"
|
||||||
"%0 = %0 + %2;\n\t"
|
"%0 = %0 + %3;\n\t"
|
||||||
"CC = AC0;\n\t"
|
"CC = AC0;\n\t"
|
||||||
"if !CC jump 4;\n\t"
|
"%1 = CC;\n\t"
|
||||||
"%0 = %0 + %4;\n\t"
|
"%0 = %0 + %1;\n\t"
|
||||||
"%0 = %0 + %3;\n\t"
|
"%0 = %0 + %4;\n\t"
|
||||||
"CC = AC0;\n\t"
|
"CC = AC0;\n\t"
|
||||||
"if !CC jump 4;\n\t"
|
"%1 = CC;\n\t"
|
||||||
"%0 = %0 + %4;\n\t"
|
"%0 = %0 + %1;\n\t"
|
||||||
"NOP;\n\t"
|
: "=d" (sum), "=&d" (carry)
|
||||||
: "=d" (sum)
|
: "d" (daddr), "d" (saddr), "d" ((len + proto) << 8), "0"(sum)
|
||||||
: "d" (daddr), "d" (saddr), "d" ((ntohs(len)<<16)+proto*256), "d" (1), "0"(sum)
|
: "CC");
|
||||||
: "CC");
|
|
||||||
|
|
||||||
return (sum);
|
return (sum);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user