Fix CRC errors on MacOS(/Linux?) (#375)

Fixes graphic packs (like FPS++) not working even when enabled.
This commit is contained in:
Tillsunset 2022-10-15 06:38:06 -05:00 committed by GitHub
parent df0e2f7881
commit f0938e1a23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -322,29 +322,34 @@ unsigned int crc32_calc_slice_by_8(unsigned int previousCrc32, const void* data,
// process eight bytes at once (Slicing-by-8)
while (length >= 8)
{
#if __BYTE_ORDER == __BIG_ENDIAN
uint32_t one = *current++ ^ swap(crc);
uint32_t two = *current++;
crc = Crc32Lookup[0][two & 0xFF] ^
Crc32Lookup[1][(two >> 8) & 0xFF] ^
Crc32Lookup[2][(two >> 16) & 0xFF] ^
Crc32Lookup[3][(two >> 24) & 0xFF] ^
Crc32Lookup[4][one & 0xFF] ^
Crc32Lookup[5][(one >> 8) & 0xFF] ^
Crc32Lookup[6][(one >> 16) & 0xFF] ^
Crc32Lookup[7][(one >> 24) & 0xFF];
#else
uint32_t one = *current++ ^ crc;
uint32_t two = *current++;
crc = Crc32Lookup[0][(two >> 24) & 0xFF] ^
Crc32Lookup[1][(two >> 16) & 0xFF] ^
Crc32Lookup[2][(two >> 8) & 0xFF] ^
Crc32Lookup[3][two & 0xFF] ^
Crc32Lookup[4][(one >> 24) & 0xFF] ^
Crc32Lookup[5][(one >> 16) & 0xFF] ^
Crc32Lookup[6][(one >> 8) & 0xFF] ^
Crc32Lookup[7][one & 0xFF];
#endif
if constexpr (std::endian::native == std::endian::big){
uint32_t one = *current++ ^ swap(crc);
uint32_t two = *current++;
crc = Crc32Lookup[0][two & 0xFF] ^
Crc32Lookup[1][(two >> 8) & 0xFF] ^
Crc32Lookup[2][(two >> 16) & 0xFF] ^
Crc32Lookup[3][(two >> 24) & 0xFF] ^
Crc32Lookup[4][one & 0xFF] ^
Crc32Lookup[5][(one >> 8) & 0xFF] ^
Crc32Lookup[6][(one >> 16) & 0xFF] ^
Crc32Lookup[7][(one >> 24) & 0xFF];
}
else if constexpr (std::endian::native == std::endian::little)
{
uint32_t one = *current++ ^ crc;
uint32_t two = *current++;
crc = Crc32Lookup[0][(two >> 24) & 0xFF] ^
Crc32Lookup[1][(two >> 16) & 0xFF] ^
Crc32Lookup[2][(two >> 8) & 0xFF] ^
Crc32Lookup[3][two & 0xFF] ^
Crc32Lookup[4][(one >> 24) & 0xFF] ^
Crc32Lookup[5][(one >> 16) & 0xFF] ^
Crc32Lookup[6][(one >> 8) & 0xFF] ^
Crc32Lookup[7][one & 0xFF];
}
else {
cemu_assert(false);
}
length -= 8;
}