From 2bc803dd1428cacf56f37c838d9b5d11a88d5de5 Mon Sep 17 00:00:00 2001 From: Logan McNaughton Date: Thu, 7 Jul 2016 07:19:40 -0600 Subject: [PATCH] Add optimized CRC calculator when OPT is on --- src/CMakeLists.txt | 6 ++++++ src/CRC_OPT.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 src/CRC_OPT.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 819c1bda..daa5e2d8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -181,6 +181,12 @@ if(OPT) add_definitions( -D__VEC4_OPT ) + list(APPEND GLideN64_SOURCES + CRC_OPT.cpp + ) + list(REMOVE_ITEM GLideN64_SOURCES + CRC.cpp + ) if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") EXEC_PROGRAM(cat ARGS "/proc/cpuinfo" OUTPUT_VARIABLE CPUINFO) STRING(REGEX REPLACE "^.*(neon).*$" "\\1" NEON_THERE ${CPUINFO}) diff --git a/src/CRC_OPT.cpp b/src/CRC_OPT.cpp new file mode 100644 index 00000000..3a778ad5 --- /dev/null +++ b/src/CRC_OPT.cpp @@ -0,0 +1,41 @@ +#include "Types.h" + +void CRC_BuildTable() +{ +} + +u32 CRC_Calculate( u32 crc, const void * buffer, u32 count ) +{ + unsigned int i; + u32 *data = (u32 *) buffer; + + count /= 4; + for(i = 0; i < count; ++i) { + crc += data[i]; + crc += (crc << 10); + crc ^= (crc >> 6); + } + + crc += (crc << 3); + crc ^= (crc >> 11); + crc += (crc << 15); + return crc; +} + +u32 CRC_CalculatePalette( u32 crc, const void * buffer, u32 count ) +{ + unsigned int i; + u16 *data = (u16 *) buffer; + + count /= 4; + for(i = 0; i < count; ++i) { + crc += data[i << 2]; + crc += (crc << 10); + crc ^= (crc >> 6); + } + + crc += (crc << 3); + crc ^= (crc >> 11); + crc += (crc << 15); + return crc; +}