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 13:38:06 +02:00
committed by GitHub
parent df0e2f7881
commit f0938e1a23
+28 -23
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;
}