1370b324cSopenharmony_ci/* XzCrc64Opt.c -- CRC64 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 CRC64_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8)) 11370b324cSopenharmony_ci 12370b324cSopenharmony_ciUInt64 Z7_FASTCALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table); 13370b324cSopenharmony_ciUInt64 Z7_FASTCALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *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 = CRC64_UPDATE_BYTE_2(v, *p); 18370b324cSopenharmony_ci for (; size >= 4; size -= 4, p += 4) 19370b324cSopenharmony_ci { 20370b324cSopenharmony_ci const UInt32 d = (UInt32)v ^ *(const UInt32 *)(const void *)p; 21370b324cSopenharmony_ci v = (v >> 32) 22370b324cSopenharmony_ci ^ (table + 0x300)[((d ) & 0xFF)] 23370b324cSopenharmony_ci ^ (table + 0x200)[((d >> 8) & 0xFF)] 24370b324cSopenharmony_ci ^ (table + 0x100)[((d >> 16) & 0xFF)] 25370b324cSopenharmony_ci ^ (table + 0x000)[((d >> 24))]; 26370b324cSopenharmony_ci } 27370b324cSopenharmony_ci for (; size > 0; size--, p++) 28370b324cSopenharmony_ci v = CRC64_UPDATE_BYTE_2(v, *p); 29370b324cSopenharmony_ci return v; 30370b324cSopenharmony_ci} 31370b324cSopenharmony_ci 32370b324cSopenharmony_ci#endif 33370b324cSopenharmony_ci 34370b324cSopenharmony_ci 35370b324cSopenharmony_ci#ifndef MY_CPU_LE 36370b324cSopenharmony_ci 37370b324cSopenharmony_ci#define CRC64_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8)) 38370b324cSopenharmony_ci 39370b324cSopenharmony_ciUInt64 Z7_FASTCALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table); 40370b324cSopenharmony_ciUInt64 Z7_FASTCALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table) 41370b324cSopenharmony_ci{ 42370b324cSopenharmony_ci const Byte *p = (const Byte *)data; 43370b324cSopenharmony_ci table += 0x100; 44370b324cSopenharmony_ci v = Z7_BSWAP64(v); 45370b324cSopenharmony_ci for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++) 46370b324cSopenharmony_ci v = CRC64_UPDATE_BYTE_2_BE(v, *p); 47370b324cSopenharmony_ci for (; size >= 4; size -= 4, p += 4) 48370b324cSopenharmony_ci { 49370b324cSopenharmony_ci const UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)(const void *)p; 50370b324cSopenharmony_ci v = (v << 32) 51370b324cSopenharmony_ci ^ (table + 0x000)[((d ) & 0xFF)] 52370b324cSopenharmony_ci ^ (table + 0x100)[((d >> 8) & 0xFF)] 53370b324cSopenharmony_ci ^ (table + 0x200)[((d >> 16) & 0xFF)] 54370b324cSopenharmony_ci ^ (table + 0x300)[((d >> 24))]; 55370b324cSopenharmony_ci } 56370b324cSopenharmony_ci for (; size > 0; size--, p++) 57370b324cSopenharmony_ci v = CRC64_UPDATE_BYTE_2_BE(v, *p); 58370b324cSopenharmony_ci return Z7_BSWAP64(v); 59370b324cSopenharmony_ci} 60370b324cSopenharmony_ci 61370b324cSopenharmony_ci#endif 62