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<uint64_t>(kCrc32CastagnoliPolynomial) << 1; | |
uint64_t val = (static_cast<uint64_t>(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; | |
} |