uint32_t icap_crc(uint32_t addr, uint32_t data, uint32_t prev) { int kAddressBitWidth = 5; constexpr int kDataBitWidth = 32; constexpr uint32_t kCrc32CastagnoliPolynomial = 0x82F63B78; uint64_t poly = static_cast(kCrc32CastagnoliPolynomial) << 1; uint64_t val = (static_cast(addr) << 32) | data; uint64_t crc = prev; for (int i = 0; i < kAddressBitWidth + kDataBitWidth; i++) { if ((val & 1) != (crc & 1)) crc ^= poly; val >>= 1; crc >>= 1; } return crc; }