1370b324cSopenharmony_ci/* 7zCrcOpt.c -- CRC32 calculation 2370b324cSopenharmony_ci2023-04-02 : Igor Pavlov : Public domain */ 3370b324cSopenharmony_ci 4370b324cSopenharmony_ci#include "Precomp.h" 5370b324cSopenharmony_ci 6370b324cSopenharmony_ci#include "CpuArch.h" 7370b324cSopenharmony_ci 8370b324cSopenharmony_ci#ifndef MY_CPU_BE 9370b324cSopenharmony_ci 10370b324cSopenharmony_ci#define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) 11370b324cSopenharmony_ci 12370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table); 13370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table) 14370b324cSopenharmony_ci{ 15370b324cSopenharmony_ci const Byte *p = (const Byte *)data; 16370b324cSopenharmony_ci for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) 17370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2(v, *p); 18370b324cSopenharmony_ci for (; size >= 4; size -= 4, p += 4) 19370b324cSopenharmony_ci { 20370b324cSopenharmony_ci v ^= *(const UInt32 *)(const void *)p; 21370b324cSopenharmony_ci v = 22370b324cSopenharmony_ci (table + 0x300)[((v ) & 0xFF)] 23370b324cSopenharmony_ci ^ (table + 0x200)[((v >> 8) & 0xFF)] 24370b324cSopenharmony_ci ^ (table + 0x100)[((v >> 16) & 0xFF)] 25370b324cSopenharmony_ci ^ (table + 0x000)[((v >> 24))]; 26370b324cSopenharmony_ci } 27370b324cSopenharmony_ci for (; size > 0; size--, p++) 28370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2(v, *p); 29370b324cSopenharmony_ci return v; 30370b324cSopenharmony_ci} 31370b324cSopenharmony_ci 32370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table); 33370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table) 34370b324cSopenharmony_ci{ 35370b324cSopenharmony_ci const Byte *p = (const Byte *)data; 36370b324cSopenharmony_ci for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) 37370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2(v, *p); 38370b324cSopenharmony_ci for (; size >= 8; size -= 8, p += 8) 39370b324cSopenharmony_ci { 40370b324cSopenharmony_ci UInt32 d; 41370b324cSopenharmony_ci v ^= *(const UInt32 *)(const void *)p; 42370b324cSopenharmony_ci v = 43370b324cSopenharmony_ci (table + 0x700)[((v ) & 0xFF)] 44370b324cSopenharmony_ci ^ (table + 0x600)[((v >> 8) & 0xFF)] 45370b324cSopenharmony_ci ^ (table + 0x500)[((v >> 16) & 0xFF)] 46370b324cSopenharmony_ci ^ (table + 0x400)[((v >> 24))]; 47370b324cSopenharmony_ci d = *((const UInt32 *)(const void *)p + 1); 48370b324cSopenharmony_ci v ^= 49370b324cSopenharmony_ci (table + 0x300)[((d ) & 0xFF)] 50370b324cSopenharmony_ci ^ (table + 0x200)[((d >> 8) & 0xFF)] 51370b324cSopenharmony_ci ^ (table + 0x100)[((d >> 16) & 0xFF)] 52370b324cSopenharmony_ci ^ (table + 0x000)[((d >> 24))]; 53370b324cSopenharmony_ci } 54370b324cSopenharmony_ci for (; size > 0; size--, p++) 55370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2(v, *p); 56370b324cSopenharmony_ci return v; 57370b324cSopenharmony_ci} 58370b324cSopenharmony_ci 59370b324cSopenharmony_ci#endif 60370b324cSopenharmony_ci 61370b324cSopenharmony_ci 62370b324cSopenharmony_ci#ifndef MY_CPU_LE 63370b324cSopenharmony_ci 64370b324cSopenharmony_ci#define CRC_UINT32_SWAP(v) Z7_BSWAP32(v) 65370b324cSopenharmony_ci 66370b324cSopenharmony_ci#define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8)) 67370b324cSopenharmony_ci 68370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table) 69370b324cSopenharmony_ci{ 70370b324cSopenharmony_ci const Byte *p = (const Byte *)data; 71370b324cSopenharmony_ci table += 0x100; 72370b324cSopenharmony_ci v = CRC_UINT32_SWAP(v); 73370b324cSopenharmony_ci for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) 74370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2_BE(v, *p); 75370b324cSopenharmony_ci for (; size >= 4; size -= 4, p += 4) 76370b324cSopenharmony_ci { 77370b324cSopenharmony_ci v ^= *(const UInt32 *)(const void *)p; 78370b324cSopenharmony_ci v = 79370b324cSopenharmony_ci (table + 0x000)[((v ) & 0xFF)] 80370b324cSopenharmony_ci ^ (table + 0x100)[((v >> 8) & 0xFF)] 81370b324cSopenharmony_ci ^ (table + 0x200)[((v >> 16) & 0xFF)] 82370b324cSopenharmony_ci ^ (table + 0x300)[((v >> 24))]; 83370b324cSopenharmony_ci } 84370b324cSopenharmony_ci for (; size > 0; size--, p++) 85370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2_BE(v, *p); 86370b324cSopenharmony_ci return CRC_UINT32_SWAP(v); 87370b324cSopenharmony_ci} 88370b324cSopenharmony_ci 89370b324cSopenharmony_ciUInt32 Z7_FASTCALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table) 90370b324cSopenharmony_ci{ 91370b324cSopenharmony_ci const Byte *p = (const Byte *)data; 92370b324cSopenharmony_ci table += 0x100; 93370b324cSopenharmony_ci v = CRC_UINT32_SWAP(v); 94370b324cSopenharmony_ci for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++) 95370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2_BE(v, *p); 96370b324cSopenharmony_ci for (; size >= 8; size -= 8, p += 8) 97370b324cSopenharmony_ci { 98370b324cSopenharmony_ci UInt32 d; 99370b324cSopenharmony_ci v ^= *(const UInt32 *)(const void *)p; 100370b324cSopenharmony_ci v = 101370b324cSopenharmony_ci (table + 0x400)[((v ) & 0xFF)] 102370b324cSopenharmony_ci ^ (table + 0x500)[((v >> 8) & 0xFF)] 103370b324cSopenharmony_ci ^ (table + 0x600)[((v >> 16) & 0xFF)] 104370b324cSopenharmony_ci ^ (table + 0x700)[((v >> 24))]; 105370b324cSopenharmony_ci d = *((const UInt32 *)(const void *)p + 1); 106370b324cSopenharmony_ci v ^= 107370b324cSopenharmony_ci (table + 0x000)[((d ) & 0xFF)] 108370b324cSopenharmony_ci ^ (table + 0x100)[((d >> 8) & 0xFF)] 109370b324cSopenharmony_ci ^ (table + 0x200)[((d >> 16) & 0xFF)] 110370b324cSopenharmony_ci ^ (table + 0x300)[((d >> 24))]; 111370b324cSopenharmony_ci } 112370b324cSopenharmony_ci for (; size > 0; size--, p++) 113370b324cSopenharmony_ci v = CRC_UPDATE_BYTE_2_BE(v, *p); 114370b324cSopenharmony_ci return CRC_UINT32_SWAP(v); 115370b324cSopenharmony_ci} 116370b324cSopenharmony_ci 117370b324cSopenharmony_ci#endif 118