From: Michihiro NAKAJIMA Date: Mon, 15 Aug 2011 02:03:10 +0000 (-0400) Subject: Improve crc32 in archive_crc32.h for its performance. X-Git-Tag: v3.0.0a~138 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ecd7359d3f04be8e421d096b3a9b2b7ee05f2d8;p=thirdparty%2Flibarchive.git Improve crc32 in archive_crc32.h for its performance. A use of expansion code can make crc32 fast about 20% -30% in any gcc optimization option(-O0,-O1,-O2 and -O3). SVN-Revision: 3604 --- diff --git a/libarchive/archive_crc32.h b/libarchive/archive_crc32.h index 103e5df35..cd633af89 100644 --- a/libarchive/archive_crc32.h +++ b/libarchive/archive_crc32.h @@ -60,6 +60,18 @@ crc32(unsigned long crc, const void *_p, size_t len) } crc = crc ^ 0xffffffffUL; + /* A use of this loop is about 20% - 30% faster than + * no use version in any optimization option of gcc. */ + for (;len >= 8; len -= 8) { + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); + } while (len--) crc = crc_tbl[(crc ^ *p++) & 0xff] ^ (crc >> 8); return (crc ^ 0xffffffffUL);