Merge pull request #461 from negativeExponent/libchdr
[pcsx_rearmed.git] / deps / lzma-16.04 / C / 7zCrc.c
1 /* 7zCrc.c -- CRC32 init\r
2 2015-03-10 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Precomp.h"\r
5 \r
6 #include "7zCrc.h"\r
7 #include "CpuArch.h"\r
8 \r
9 #define kCrcPoly 0xEDB88320\r
10 \r
11 #ifdef MY_CPU_LE\r
12   #define CRC_NUM_TABLES 8\r
13 #else\r
14   #define CRC_NUM_TABLES 9\r
15 \r
16   #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))\r
17 \r
18   UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
19   UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
20 #endif\r
21 \r
22 #ifndef MY_CPU_BE\r
23   UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
24   UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
25 #endif\r
26 \r
27 typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
28 \r
29 CRC_FUNC g_CrcUpdateT4;\r
30 CRC_FUNC g_CrcUpdateT8;\r
31 CRC_FUNC g_CrcUpdate;\r
32 \r
33 UInt32 g_CrcTable[256 * CRC_NUM_TABLES];\r
34 \r
35 UInt32 MY_FAST_CALL CrcUpdate(UInt32 v, const void *data, size_t size)\r
36 {\r
37   return g_CrcUpdate(v, data, size, g_CrcTable);\r
38 }\r
39 \r
40 UInt32 MY_FAST_CALL CrcCalc(const void *data, size_t size)\r
41 {\r
42   return g_CrcUpdate(CRC_INIT_VAL, data, size, g_CrcTable) ^ CRC_INIT_VAL;\r
43 }\r
44 \r
45 #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\r
46 \r
47 UInt32 MY_FAST_CALL CrcUpdateT1(UInt32 v, const void *data, size_t size, const UInt32 *table)\r
48 {\r
49   const Byte *p = (const Byte *)data;\r
50   const Byte *pEnd = p + size;\r
51   for (; p != pEnd; p++)\r
52     v = CRC_UPDATE_BYTE_2(v, *p);\r
53   return v;\r
54 }\r
55 \r
56 void MY_FAST_CALL CrcGenerateTable()\r
57 {\r
58   UInt32 i;\r
59   for (i = 0; i < 256; i++)\r
60   {\r
61     UInt32 r = i;\r
62     unsigned j;\r
63     for (j = 0; j < 8; j++)\r
64       r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));\r
65     g_CrcTable[i] = r;\r
66   }\r
67   for (; i < 256 * CRC_NUM_TABLES; i++)\r
68   {\r
69     UInt32 r = g_CrcTable[i - 256];\r
70     g_CrcTable[i] = g_CrcTable[r & 0xFF] ^ (r >> 8);\r
71   }\r
72 \r
73   #if CRC_NUM_TABLES < 4\r
74   \r
75   g_CrcUpdate = CrcUpdateT1;\r
76   \r
77   #else\r
78  \r
79   #ifdef MY_CPU_LE\r
80 \r
81     g_CrcUpdateT4 = CrcUpdateT4;\r
82     g_CrcUpdate = CrcUpdateT4;\r
83 \r
84     #if CRC_NUM_TABLES >= 8\r
85       g_CrcUpdateT8 = CrcUpdateT8;\r
86   \r
87       #ifdef MY_CPU_X86_OR_AMD64\r
88       if (!CPU_Is_InOrder())\r
89         g_CrcUpdate = CrcUpdateT8;\r
90       #endif\r
91     #endif\r
92 \r
93   #else\r
94   {\r
95     #ifndef MY_CPU_BE\r
96     UInt32 k = 0x01020304;\r
97     const Byte *p = (const Byte *)&k;\r
98     if (p[0] == 4 && p[1] == 3)\r
99     {\r
100       g_CrcUpdateT4 = CrcUpdateT4;\r
101       g_CrcUpdate = CrcUpdateT4;\r
102       #if CRC_NUM_TABLES >= 8\r
103       g_CrcUpdateT8 = CrcUpdateT8;\r
104       // g_CrcUpdate = CrcUpdateT8;\r
105       #endif\r
106     }\r
107     else if (p[0] != 1 || p[1] != 2)\r
108       g_CrcUpdate = CrcUpdateT1;\r
109     else\r
110     #endif\r
111     {\r
112       for (i = 256 * CRC_NUM_TABLES - 1; i >= 256; i--)\r
113       {\r
114         UInt32 x = g_CrcTable[i - 256];\r
115         g_CrcTable[i] = CRC_UINT32_SWAP(x);\r
116       }\r
117       g_CrcUpdateT4 = CrcUpdateT1_BeT4;\r
118       g_CrcUpdate = CrcUpdateT1_BeT4;\r
119       #if CRC_NUM_TABLES >= 8\r
120       g_CrcUpdateT8 = CrcUpdateT1_BeT8;\r
121       // g_CrcUpdate = CrcUpdateT1_BeT8;\r
122       #endif\r
123     }\r
124   }\r
125   #endif\r
126 \r
127   #endif\r
128 }\r