bd0cf5a374e9ed153223f8c5d69245ce33a97cf5
[pcsx_rearmed.git] / deps / lzma-16.04 / C / XzCrc64.c
1 /* XzCrc64.c -- CRC64 calculation\r
2 2015-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
32 typedef UInt64 (MY_FAST_CALL *CRC_FUNC)(UInt64 v, const void *data, size_t size, const UInt64 *table);\r
33 \r
34 static CRC_FUNC g_Crc64Update;\r
35 UInt64 g_Crc64Table[256 * CRC_NUM_TABLES];\r
36 \r
37 UInt64 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
42 UInt64 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
47 void 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