aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/crc32.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/crc32.c b/lib/crc32.c
index 826e16352e0e..4eac9c770cd4 100644
--- a/lib/crc32.c
+++ b/lib/crc32.c
@@ -66,6 +66,9 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
66# endif 66# endif
67 const u32 *b; 67 const u32 *b;
68 size_t rem_len; 68 size_t rem_len;
69# ifdef CONFIG_X86
70 size_t i;
71# endif
69 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3]; 72 const u32 *t0=tab[0], *t1=tab[1], *t2=tab[2], *t3=tab[3];
70 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7]; 73 const u32 *t4 = tab[4], *t5 = tab[5], *t6 = tab[6], *t7 = tab[7];
71 u32 q; 74 u32 q;
@@ -86,7 +89,12 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
86# endif 89# endif
87 90
88 b = (const u32 *)buf; 91 b = (const u32 *)buf;
92# ifdef CONFIG_X86
93 --b;
94 for (i = 0; i < len; i++) {
95# else
89 for (--b; len; --len) { 96 for (--b; len; --len) {
97# endif
90 q = crc ^ *++b; /* use pre increment for speed */ 98 q = crc ^ *++b; /* use pre increment for speed */
91# if CRC_LE_BITS == 32 99# if CRC_LE_BITS == 32
92 crc = DO_CRC4; 100 crc = DO_CRC4;
@@ -100,9 +108,14 @@ crc32_body(u32 crc, unsigned char const *buf, size_t len, const u32 (*tab)[256])
100 /* And the last few bytes */ 108 /* And the last few bytes */
101 if (len) { 109 if (len) {
102 u8 *p = (u8 *)(b + 1) - 1; 110 u8 *p = (u8 *)(b + 1) - 1;
111# ifdef CONFIG_X86
112 for (i = 0; i < len; i++)
113 DO_CRC(*++p); /* use pre increment for speed */
114# else
103 do { 115 do {
104 DO_CRC(*++p); /* use pre increment for speed */ 116 DO_CRC(*++p); /* use pre increment for speed */
105 } while (--len); 117 } while (--len);
118# endif
106 } 119 }
107 return crc; 120 return crc;
108#undef DO_CRC 121#undef DO_CRC