[U-Boot] [PATCH] crc32: more optimizations
Joakim Tjernlund
Joakim.Tjernlund at transmode.se
Wed Nov 4 10:26:17 CET 2009
Shave off yet 4 bytes and make if faster for unaligned and/or
len & 3 != 0.
Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund at transmode.se>
---
Now I am done with crc32 optimizations.
Someone should look at porting over crc32_be from linux
since CRC32 BE is used by bzip and it could probably
benefit from a faster CRC routine.
lib_generic/crc32.c | 18 +++++++++---------
1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib_generic/crc32.c b/lib_generic/crc32.c
index 737587a..2837d93 100644
--- a/lib_generic/crc32.c
+++ b/lib_generic/crc32.c
@@ -188,30 +188,30 @@ uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len)
crc = __cpu_to_le32(crc);
/* Align it */
if(((long)b)&3 && len) {
+ uint8_t *p = (uint8_t *)b - 1;
do {
- uint8_t *p = (uint8_t *)b;
- DO_CRC(*p++);
- b = (void *)p;
+ DO_CRC(*++p); /* use pre increment for speed */
} while ((--len) && ((long)b)&3 );
+ b = (uint32_t *)p + 1;
}
save_len = len & 3;
len = len >> 2;
for (--b; len; --len) {
/* load data 32 bits wide, xor data 32 bits wide. */
- crc ^= *++b; /* use pre increment below(*++b) for speed */
+ crc ^= *++b; /* use pre increment for speed */
DO_CRC(0);
DO_CRC(0);
DO_CRC(0);
DO_CRC(0);
}
- b++; /* point to next byte(s) */
len = save_len;
/* And the last few bytes */
- for (; len; --len) {
- uint8_t *p = (uint8_t *)b;
- DO_CRC(*p++);
- b = (void *)p;
+ if (len) {
+ uint8_t *p = (uint8_t *)(b++) - 1;
+ do {
+ DO_CRC(*++p); /* use pre increment for speed */
+ } while (--len);
}
return __le32_to_cpu(crc);
--
1.6.4.4
More information about the U-Boot
mailing list