crc32: optimize loop counter for x86
[linux-flexiantxendom0-3.2.10.git] / lib / crc32.c
index 826e163..4eac9c7 100644 (file)
@@ -66,6 +66,9 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
 # endif
        const u32 *b;
        size_t    rem_len;
+# ifdef CONFIG_X86
+       size_t i;
+# endif
        const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
        const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
        u32 q;
@@ -86,7 +89,12 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
 # endif
 
        b = (const u32 *)buf;
+# ifdef CONFIG_X86
+       --b;
+       for (i = 0; i < len; i++) {
+# else
        for (--b; len; --len) {
+# endif
                q = crc ^ *++b; /* use pre increment for speed */
 # if CRC_LE_BITS == 32
                crc = DO_CRC4;
@@ -100,9 +108,14 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
        /* And the last few bytes */
        if (len) {
                u8 *p = (u8 *)(b + 1) - 1;
+# ifdef CONFIG_X86
+               for (i = 0; i < len; i++)
+                       DO_CRC(*++p); /* use pre increment for speed */
+# else
                do {
                        DO_CRC(*++p); /* use pre increment for speed */
                } while (--len);
+# endif
        }
        return crc;
 #undef DO_CRC