+#if CRC_LE_BITS > 8
+static inline u32 crc32_le_body(u32 crc, u8 const *buf, size_t len)
+{
+ const u8 *p8;
+ const u32 *p32;
+ int init_bytes, end_bytes;
+ size_t words;
+ int i;
+ u32 q;
+ u8 i0, i1, i2, i3;
+
+ crc = (__force u32) __cpu_to_le32(crc);
+
+#if CRC_LE_BITS == 64
+ p8 = buf;
+ p32 = (u32 *)(((uintptr_t)p8 + 7) & ~7);
+
+ init_bytes = (uintptr_t)p32 - (uintptr_t)p8;
+ if (init_bytes > len)
+ init_bytes = len;
+ words = (len - init_bytes) >> 3;
+ end_bytes = (len - init_bytes) & 7;
+#else
+ p8 = buf;
+ p32 = (u32 *)(((uintptr_t)p8 + 3) & ~3);
+
+ init_bytes = (uintptr_t)p32 - (uintptr_t)p8;
+ if (init_bytes > len)
+ init_bytes = len;
+ words = (len - init_bytes) >> 2;
+ end_bytes = (len - init_bytes) & 3;
+#endif
+
+ for (i = 0; i < init_bytes; i++) {
+#ifdef __LITTLE_ENDIAN
+ i0 = *p8++ ^ crc;
+ crc = t0_le[i0] ^ (crc >> 8);
+#else
+ i0 = *p8++ ^ (crc >> 24);
+ crc = t0_le[i0] ^ (crc << 8);
+#endif
+ }
+
+ for (i = 0; i < words; i++) {
+#ifdef __LITTLE_ENDIAN
+# if CRC_LE_BITS == 64
+ /* slice by 8 algorithm */
+ q = *p32++ ^ crc;
+ i3 = q;
+ i2 = q >> 8;
+ i1 = q >> 16;
+ i0 = q >> 24;
+ crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
+
+ q = *p32++;
+ i3 = q;
+ i2 = q >> 8;
+ i1 = q >> 16;
+ i0 = q >> 24;
+ crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
+# else
+ /* slice by 4 algorithm */
+ q = *p32++ ^ crc;
+ i3 = q;
+ i2 = q >> 8;
+ i1 = q >> 16;
+ i0 = q >> 24;
+ crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
+# endif
+#else
+# if CRC_LE_BITS == 64
+ q = *p32++ ^ crc;
+ i3 = q >> 24;
+ i2 = q >> 16;
+ i1 = q >> 8;
+ i0 = q;
+ crc = t7_le[i3] ^ t6_le[i2] ^ t5_le[i1] ^ t4_le[i0];
+
+ q = *p32++;
+ i3 = q >> 24;
+ i2 = q >> 16;
+ i1 = q >> 8;
+ i0 = q;
+ crc ^= t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
+# else
+ q = *p32++ ^ crc;
+ i3 = q >> 24;
+ i2 = q >> 16;
+ i1 = q >> 8;
+ i0 = q;
+ crc = t3_le[i3] ^ t2_le[i2] ^ t1_le[i1] ^ t0_le[i0];
+# endif
+#endif
+ }
+
+ p8 = (u8 *)p32;
+
+ for (i = 0; i < end_bytes; i++) {
+#ifdef __LITTLE_ENDIAN
+ i0 = *p8++ ^ crc;
+ crc = t0_le[i0] ^ (crc >> 8);
+#else
+ i0 = *p8++ ^ (crc >> 24);
+ crc = t0_le[i0] ^ (crc << 8);
+#endif
+ }
+
+ return __le32_to_cpu((__force __le32)crc);
+}
+#endif