HLE: Merge HLE BIOS improvements from upstream
[pcsx_rearmed.git] / deps / lzma-16.04 / C / 7zCrc.c
CommitLineData
ce188d4d 1/* 7zCrc.c -- CRC32 init\r
22015-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
27typedef UInt32 (MY_FAST_CALL *CRC_FUNC)(UInt32 v, const void *data, size_t size, const UInt32 *table);\r
28\r
29CRC_FUNC g_CrcUpdateT4;\r
30CRC_FUNC g_CrcUpdateT8;\r
31CRC_FUNC g_CrcUpdate;\r
32\r
33UInt32 g_CrcTable[256 * CRC_NUM_TABLES];\r
34\r
35UInt32 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
40UInt32 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
47UInt32 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
56void 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