On Wed, 2015-01-28 at 00:13 +0100, Karl Beldan wrote: > Here however I don't assume that a is "small", however I assume it has > never overflowed, which is trivial to verify since we only add 3 32bits > values and 2 16 bits values to a 64bits. > Now we just want (a + b + carry(a + b)) % 2^32, and here I assume > (a + b + carry(a + b)) % 2^32 == (a + b) % 2^32 + carry(a + b), I > guess this is the trick, and this is easy to convince oneself with: > 0xffffffff + 0xffffffff == 0x1fffffffe ==> > ((u32)-1 + (u32)-1 + 1) % 2^32 == 0xfffffffe % 2^32 + 1 > We get this carry pushed out from the MSbs side by the s+= addition > pushed back in to the LSbs side of the upper 32bits and this carry > doesn't make the upper side overflow. > > If this explanation is acceptable, I can reword the commit message with > it. Sorry if my initial commit log lacked details, and thanks for your > detailed input ... Look, we already have from32to16() helper : static inline unsigned short from32to16(unsigned int x) { /* add up 16-bit and 16-bit for 16+c bit */ x = (x & 0xffff) + (x >> 16); /* add up carry.. */ x = (x & 0xffff) + (x >> 16); return x; } Simply add a clean static inline u32 from64to32(u64 x) { x = (x & 0xffffffff) + (x >> 32); /* add up carry.. */ x = (x & 0xffffffff) + (x >> 32); return (u32)x; } This would be self explanatory. -- To unsubscribe from this list: send the line "unsubscribe stable" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html