Merge pull request #511 from negativeExponent/updates
[pcsx_rearmed.git] / deps / lzma-16.04 / C / XzCrc64.c
CommitLineData
ce188d4d 1/* XzCrc64.c -- CRC64 calculation\r
22015-03-01 : Igor Pavlov : Public domain */\r
3\r
4#include "Precomp.h"\r
5\r
6#include "XzCrc64.h"\r
7#include "CpuArch.h"\r
8\r
9#define kCrc64Poly UINT64_CONST(0xC96C5795D7870F42)\r
10\r
11#ifdef MY_CPU_LE\r
12 #define CRC_NUM_TABLES 4\r
13#else\r
14 #define CRC_NUM_TABLES 5\r
15 #define CRC_UINT64_SWAP(v) \\r
16 ((v >> 56) \\r
17 | ((v >> 40) & ((UInt64)0xFF << 8)) \\r
18 | ((v >> 24) & ((UInt64)0xFF << 16)) \\r
19 | ((v >> 8) & ((UInt64)0xFF << 24)) \\r
20 | ((v << 8) & ((UInt64)0xFF << 32)) \\r
21 | ((v << 24) & ((UInt64)0xFF << 40)) \\r
22 | ((v << 40) & ((UInt64)0xFF << 48)) \\r
23 | ((v << 56)))\r
24\r
25 UInt64 MY_FAST_CALL XzCrc64UpdateT1_BeT4(UInt64 v, const void *data, size_t size, const UInt64 *table);\r
26#endif\r
27\r
28#ifndef MY_CPU_BE\r
29 UInt64 MY_FAST_CALL XzCrc64UpdateT4(UInt64 v, const void *data, size_t size, const UInt64 *table);\r
30#endif\r
31\r
32typedef UInt64 (MY_FAST_CALL *CRC_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table);\r
33\r
34static CRC_FUNC g_Crc64Update;\r
35UInt64 g_Crc64Table[256 * CRC_NUM_TABLES];\r
36\r
37UInt64 MY_FAST_CALL Crc64Update(UInt64 v, const void *data, size_t size)\r
38{\r
39 return g_Crc64Update(v, data, size, g_Crc64Table);\r
40}\r
41\r
42UInt64 MY_FAST_CALL Crc64Calc(const void *data, size_t size)\r
43{\r
44 return g_Crc64Update(CRC64_INIT_VAL, data, size, g_Crc64Table) ^ CRC64_INIT_VAL;\r
45}\r
46\r
47void MY_FAST_CALL Crc64GenerateTable()\r
48{\r
49 UInt32 i;\r
50 for (i = 0; i < 256; i++)\r
51 {\r
52 UInt64 r = i;\r
53 unsigned j;\r
54 for (j = 0; j < 8; j++)\r
55 r = (r >> 1) ^ (kCrc64Poly & ~((r & 1) - 1));\r
56 g_Crc64Table[i] = r;\r
57 }\r
58 for (; i < 256 * CRC_NUM_TABLES; i++)\r
59 {\r
60 UInt64 r = g_Crc64Table[i - 256];\r
61 g_Crc64Table[i] = g_Crc64Table[r & 0xFF] ^ (r >> 8);\r
62 }\r
63 \r
64 #ifdef MY_CPU_LE\r
65\r
66 g_Crc64Update = XzCrc64UpdateT4;\r
67\r
68 #else\r
69 {\r
70 #ifndef MY_CPU_BE\r
71 UInt32 k = 1;\r
72 if (*(const Byte *)&k == 1)\r
73 g_Crc64Update = XzCrc64UpdateT4;\r
74 else\r
75 #endif\r
76 {\r
77 for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--)\r
78 {\r
79 UInt64 x = g_Crc64Table[i - 256];\r
80 g_Crc64Table[i] = CRC_UINT64_SWAP(x);\r
81 }\r
82 g_Crc64Update = XzCrc64UpdateT1_BeT4;\r
83 }\r
84 }\r
85 #endif\r
86}\r