XzCrc64Opt.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /* XzCrc64Opt.c -- CRC64 calculation
  2. 2015-03-01 : Igor Pavlov : Public domain */
  3. #include "Precomp.h"
  4. #include "CpuArch.h"
  5. #ifndef MY_CPU_BE
  6. #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))
  7. UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table)
  8. {
  9. const Byte *p = (const Byte *)data;
  10. for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
  11. v = CRC_UPDATE_BYTE_2(v, *p);
  12. for (; size >= 4; size -= 4, p += 4)
  13. {
  14. UInt32 d = (UInt32)v ^ *(const UInt32 *)p;
  15. v = (v >> 32)
  16. ^ table[0x300 + ((d ) & 0xFF)]
  17. ^ table[0x200 + ((d >> 8) & 0xFF)]
  18. ^ table[0x100 + ((d >> 16) & 0xFF)]
  19. ^ table[0x000 + ((d >> 24))];
  20. }
  21. for (; size > 0; size--, p++)
  22. v = CRC_UPDATE_BYTE_2(v, *p);
  23. return v;
  24. }
  25. #endif
  26. #ifndef MY_CPU_LE
  27. #define CRC_UINT64_SWAP(v) \
  28. ((v >> 56) \
  29. | ((v >> 40) & ((UInt64)0xFF << 8)) \
  30. | ((v >> 24) & ((UInt64)0xFF << 16)) \
  31. | ((v >> 8) & ((UInt64)0xFF << 24)) \
  32. | ((v << 8) & ((UInt64)0xFF << 32)) \
  33. | ((v << 24) & ((UInt64)0xFF << 40)) \
  34. | ((v << 40) & ((UInt64)0xFF << 48)) \
  35. | ((v << 56)))
  36. #define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(Byte)((crc) >> 56) ^ (b)] ^ ((crc) << 8))
  37. UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table)
  38. {
  39. const Byte *p = (const Byte *)data;
  40. table += 0x100;
  41. v = CRC_UINT64_SWAP(v);
  42. for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)
  43. v = CRC_UPDATE_BYTE_2_BE(v, *p);
  44. for (; size >= 4; size -= 4, p += 4)
  45. {
  46. UInt32 d = (UInt32)(v >> 32) ^ *(const UInt32 *)p;
  47. v = (v << 32)
  48. ^ table[0x000 + ((d ) & 0xFF)]
  49. ^ table[0x100 + ((d >> 8) & 0xFF)]
  50. ^ table[0x200 + ((d >> 16) & 0xFF)]
  51. ^ table[0x300 + ((d >> 24))];
  52. }
  53. for (; size > 0; size--, p++)
  54. v = CRC_UPDATE_BYTE_2_BE(v, *p);
  55. return CRC_UINT64_SWAP(v);
  56. }
  57. #endif