| #ifndef CRC32_BRAID_COMB_P_H_ |
| #define CRC32_BRAID_COMB_P_H_ |
| |
| /* |
| Return a(x) multiplied by b(x) modulo p(x), where p(x) is the CRC polynomial, |
| reflected. For speed, this requires that a not be zero. |
| */ |
| static uint32_t multmodp(uint32_t a, uint32_t b) { |
| uint32_t m, p; |
| |
| m = (uint32_t)1 << 31; |
| p = 0; |
| for (;;) { |
| if (a & m) { |
| p ^= b; |
| if ((a & (m - 1)) == 0) |
| break; |
| } |
| m >>= 1; |
| b = b & 1 ? (b >> 1) ^ POLY : b >> 1; |
| } |
| return p; |
| } |
| |
| /* |
| Return x^(n * 2^k) modulo p(x). Requires that x2n_table[] has been |
| initialized. |
| */ |
| static uint32_t x2nmodp(z_off64_t n, unsigned k) { |
| uint32_t p; |
| |
| p = (uint32_t)1 << 31; /* x^0 == 1 */ |
| while (n) { |
| if (n & 1) |
| p = multmodp(x2n_table[k & 31], p); |
| n >>= 1; |
| k++; |
| } |
| return p; |
| } |
| |
| #endif /* CRC32_BRAID_COMB_P_H_ */ |