diff options
Diffstat (limited to 'arch/arm/include/asm/checksum.h')
-rw-r--r-- | arch/arm/include/asm/checksum.h | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/arch/arm/include/asm/checksum.h b/arch/arm/include/asm/checksum.h index 6dcc16430868..523315115478 100644 --- a/arch/arm/include/asm/checksum.h +++ b/arch/arm/include/asm/checksum.h | |||
@@ -87,19 +87,33 @@ static inline __wsum | |||
87 | csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, | 87 | csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len, |
88 | unsigned short proto, __wsum sum) | 88 | unsigned short proto, __wsum sum) |
89 | { | 89 | { |
90 | __asm__( | 90 | u32 lenprot = len | proto << 16; |
91 | "adds %0, %1, %2 @ csum_tcpudp_nofold \n\ | 91 | if (__builtin_constant_p(sum) && sum == 0) { |
92 | adcs %0, %0, %3 \n" | 92 | __asm__( |
93 | "adds %0, %1, %2 @ csum_tcpudp_nofold0 \n\t" | ||
93 | #ifdef __ARMEB__ | 94 | #ifdef __ARMEB__ |
94 | "adcs %0, %0, %4 \n" | 95 | "adcs %0, %0, %3 \n\t" |
95 | #else | 96 | #else |
96 | "adcs %0, %0, %4, lsl #8 \n" | 97 | "adcs %0, %0, %3, ror #8 \n\t" |
97 | #endif | 98 | #endif |
98 | "adcs %0, %0, %5 \n\ | 99 | "adc %0, %0, #0" |
99 | adc %0, %0, #0" | 100 | : "=&r" (sum) |
100 | : "=&r"(sum) | 101 | : "r" (daddr), "r" (saddr), "r" (lenprot) |
101 | : "r" (sum), "r" (daddr), "r" (saddr), "r" (len), "Ir" (htons(proto)) | 102 | : "cc"); |
102 | : "cc"); | 103 | } else { |
104 | __asm__( | ||
105 | "adds %0, %1, %2 @ csum_tcpudp_nofold \n\t" | ||
106 | "adcs %0, %0, %3 \n\t" | ||
107 | #ifdef __ARMEB__ | ||
108 | "adcs %0, %0, %4 \n\t" | ||
109 | #else | ||
110 | "adcs %0, %0, %4, ror #8 \n\t" | ||
111 | #endif | ||
112 | "adc %0, %0, #0" | ||
113 | : "=&r"(sum) | ||
114 | : "r" (sum), "r" (daddr), "r" (saddr), "r" (lenprot) | ||
115 | : "cc"); | ||
116 | } | ||
103 | return sum; | 117 | return sum; |
104 | } | 118 | } |
105 | /* | 119 | /* |