mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2025-12-17 13:02:27 +01:00
Speedup calculate_checksum by ~9%
Skips unnecessary `rol32`s
This commit is contained in:
committed by
GitHub
parent
d15112dcb3
commit
ab43bf74d5
@@ -932,7 +932,7 @@ extern "C"
|
|||||||
|
|
||||||
int object_calculate_checksum(const rct_object_entry * entry, const void * data, size_t dataLength)
|
int object_calculate_checksum(const rct_object_entry * entry, const void * data, size_t dataLength)
|
||||||
{
|
{
|
||||||
const uint8 *entryBytePtr = (uint8*)entry;
|
const uint8 * entryBytePtr = (uint8 *)entry;
|
||||||
|
|
||||||
uint32 checksum = 0xF369A75B;
|
uint32 checksum = 0xF369A75B;
|
||||||
checksum ^= entryBytePtr[0];
|
checksum ^= entryBytePtr[0];
|
||||||
@@ -943,8 +943,17 @@ extern "C"
|
|||||||
checksum = rol32(checksum, 11);
|
checksum = rol32(checksum, 11);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 * dataBytes = (uint8 *)data;
|
uint8 * dataBytes = (uint8 *)data;
|
||||||
for (size_t i = 0; i < dataLength; i++)
|
const size_t dataLength32 = dataLength - (dataLength & 31);
|
||||||
|
for (size_t i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
for (size_t j = i; j < dataLength32; j += 32)
|
||||||
|
{
|
||||||
|
checksum ^= dataBytes[j];
|
||||||
|
}
|
||||||
|
checksum = rol32(checksum, 11);
|
||||||
|
}
|
||||||
|
for (size_t i = dataLength32; i < dataLength; i++)
|
||||||
{
|
{
|
||||||
checksum ^= dataBytes[i];
|
checksum ^= dataBytes[i];
|
||||||
checksum = rol32(checksum, 11);
|
checksum = rol32(checksum, 11);
|
||||||
|
|||||||
Reference in New Issue
Block a user