]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Improve crc32 in archive_crc32.h for its performance.
authorMichihiro NAKAJIMA <ggcueroad@gmail.com>
Mon, 15 Aug 2011 02:03:10 +0000 (22:03 -0400)
committerMichihiro NAKAJIMA <ggcueroad@gmail.com>
Mon, 15 Aug 2011 02:03:10 +0000 (22:03 -0400)
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

libarchive/archive_crc32.h

index 103e5df35c156166a6895a51fd2a9e72375e9338..cd633af89b4a5223d080a348985a28700925da15 100644 (file)
@@ -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);