Optimize the computation of 16-bit checksum
This commit was SVN r20965.
Этот коммит содержится в:
родитель
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;
|
||||
}
|
||||
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user