1
1

Optimize the computation of 16-bit checksum

This commit was SVN r20965.
Этот коммит содержится в:
Nysal Jan 2009-04-09 11:04:38 +00:00
родитель b4df8bcf85
Коммит 2500d88380

Просмотреть файл

@ -104,17 +104,26 @@ opal_csum(const void * source, size_t csumlen)
size_t lastPartialLength = 0;
return opal_csum_partial(source, csumlen, &lastPartialLong, &lastPartialLength);
}
/*
* The buffer passed to this function is assumed to be 16-bit aligned
*/
static inline uint16_t
opal_csum16 (const void * source, size_t csumlen)
{
unsigned char *src = (unsigned char *) source;
uint16_t csum = 0;
size_t i;
uint16_t *src = (uint16_t *) source;
register uint32_t csum = 0;
for(i = 0; i < csumlen; i++) {
while (csumlen > 1) {
csum += *src++;
}
csumlen -= 2;
}
/* Add leftover byte, if any */
if(csumlen > 0)
csum += *((unsigned char*)src);
/* Fold 32-bit checksum to 16 bits */
while(csum >> 16) {
csum = (csum & 0xFFFF) + (csum >> 16);
}
return csum;
}