[U-Boot] [PATCH] crc32: minor cleanups and smaller size.

Don't optimize for len < 4. This reduces size with 8 bytes too.
This crc32 impl is smaller that the orginal if crc32 and crc32_no_comp is impl. two separate functions(like the orginal). That would, however, be a waste of space when both are defined.
Signed-off-by: Joakim Tjernlund Joakim.Tjernlund@transmode.se --- lib_generic/crc32.c | 44 +++++++++++++++++++++----------------------- 1 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/lib_generic/crc32.c b/lib_generic/crc32.c index 05b1431..737587a 100644 --- a/lib_generic/crc32.c +++ b/lib_generic/crc32.c @@ -14,6 +14,7 @@ #include <stdint.h> #endif #include <asm/byteorder.h> +#include <u-boot/crc.h>
#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) #include <watchdog.h> @@ -175,47 +176,44 @@ const uint32_t * ZEXPORT get_crc_table() /* No ones complement version. JFFS2 (and other things ?) * don't use ones compliment in their CRC calculations. */ -uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *p, uInt len) +uint32_t ZEXPORT crc32_no_comp(uint32_t crc, const Bytef *buf, uInt len) { const uint32_t *tab = crc_table; - const uint32_t *b =(uint32_t *)p; - + const uint32_t *b =(uint32_t *)buf; + size_t save_len; #ifdef DYNAMIC_CRC_TABLE if (crc_table_empty) make_crc_table(); #endif crc = __cpu_to_le32(crc); /* Align it */ - if(((long)b)&3 && len){ + if(((long)b)&3 && len) { do { uint8_t *p = (uint8_t *)b; DO_CRC(*p++); b = (void *)p; } while ((--len) && ((long)b)&3 ); } - if(len >= 4){ + + save_len = len & 3; + len = len >> 2; + for (--b; len; --len) { /* load data 32 bits wide, xor data 32 bits wide. */ - size_t save_len = len & 3; - len = len >> 2; - --b; /* use pre increment below(*++b) for speed */ - do { - crc ^= *++b; - DO_CRC(0); - DO_CRC(0); - DO_CRC(0); - DO_CRC(0); - } while (--len); - b++; /* point to next byte(s) */ - len = save_len; + crc ^= *++b; /* use pre increment below(*++b) 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 */ - if(len){ - do { - uint8_t *p = (uint8_t *)b; - DO_CRC(*p++); - b = (void *)p; - } while (--len); + for (; len; --len) { + uint8_t *p = (uint8_t *)b; + DO_CRC(*p++); + b = (void *)p; } + return __le32_to_cpu(crc); } #undef DO_CRC
participants (1)
-
Joakim Tjernlund