add CHD support.
[pcsx_rearmed.git] / deps / lzma-16.04 / C / 7zCrcOpt.c
1 /* 7zCrcOpt.c -- CRC32 calculation\r
2 2015-03-01 : Igor Pavlov : Public domain */\r
3 \r
4 #include "Precomp.h"\r
5 \r
6 #include "CpuArch.h"\r
7 \r
8 #ifndef MY_CPU_BE\r
9 \r
10 #define CRC_UPDATE_BYTE_2(crc, b) (table[((crc) ^ (b)) & 0xFF] ^ ((crc) >> 8))\r
11 \r
12 UInt32 MY_FAST_CALL CrcUpdateT4(UInt32 v, const void *data, size_t size, const UInt32 *table)\r
13 {\r
14   const Byte *p = (const Byte *)data;\r
15   for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)\r
16     v = CRC_UPDATE_BYTE_2(v, *p);\r
17   for (; size >= 4; size -= 4, p += 4)\r
18   {\r
19     v ^= *(const UInt32 *)p;\r
20     v =\r
21           table[0x300 + ((v      ) & 0xFF)]\r
22         ^ table[0x200 + ((v >>  8) & 0xFF)]\r
23         ^ table[0x100 + ((v >> 16) & 0xFF)]\r
24         ^ table[0x000 + ((v >> 24))];\r
25   }\r
26   for (; size > 0; size--, p++)\r
27     v = CRC_UPDATE_BYTE_2(v, *p);\r
28   return v;\r
29 }\r
30 \r
31 UInt32 MY_FAST_CALL CrcUpdateT8(UInt32 v, const void *data, size_t size, const UInt32 *table)\r
32 {\r
33   const Byte *p = (const Byte *)data;\r
34   for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)\r
35     v = CRC_UPDATE_BYTE_2(v, *p);\r
36   for (; size >= 8; size -= 8, p += 8)\r
37   {\r
38     UInt32 d;\r
39     v ^= *(const UInt32 *)p;\r
40     v =\r
41           table[0x700 + ((v      ) & 0xFF)]\r
42         ^ table[0x600 + ((v >>  8) & 0xFF)]\r
43         ^ table[0x500 + ((v >> 16) & 0xFF)]\r
44         ^ table[0x400 + ((v >> 24))];\r
45     d = *((const UInt32 *)p + 1);\r
46     v ^=\r
47           table[0x300 + ((d      ) & 0xFF)]\r
48         ^ table[0x200 + ((d >>  8) & 0xFF)]\r
49         ^ table[0x100 + ((d >> 16) & 0xFF)]\r
50         ^ table[0x000 + ((d >> 24))];\r
51   }\r
52   for (; size > 0; size--, p++)\r
53     v = CRC_UPDATE_BYTE_2(v, *p);\r
54   return v;\r
55 }\r
56 \r
57 #endif\r
58 \r
59 \r
60 #ifndef MY_CPU_LE\r
61 \r
62 #define CRC_UINT32_SWAP(v) ((v >> 24) | ((v >> 8) & 0xFF00) | ((v << 8) & 0xFF0000) | (v << 24))\r
63 \r
64 #define CRC_UPDATE_BYTE_2_BE(crc, b) (table[(((crc) >> 24) ^ (b))] ^ ((crc) << 8))\r
65 \r
66 UInt32 MY_FAST_CALL CrcUpdateT1_BeT4(UInt32 v, const void *data, size_t size, const UInt32 *table)\r
67 {\r
68   const Byte *p = (const Byte *)data;\r
69   table += 0x100;\r
70   v = CRC_UINT32_SWAP(v);\r
71   for (; size > 0 && ((unsigned)(ptrdiff_t)p & 3) != 0; size--, p++)\r
72     v = CRC_UPDATE_BYTE_2_BE(v, *p);\r
73   for (; size >= 4; size -= 4, p += 4)\r
74   {\r
75     v ^= *(const UInt32 *)p;\r
76     v =\r
77           table[0x000 + ((v      ) & 0xFF)]\r
78         ^ table[0x100 + ((v >>  8) & 0xFF)]\r
79         ^ table[0x200 + ((v >> 16) & 0xFF)]\r
80         ^ table[0x300 + ((v >> 24))];\r
81   }\r
82   for (; size > 0; size--, p++)\r
83     v = CRC_UPDATE_BYTE_2_BE(v, *p);\r
84   return CRC_UINT32_SWAP(v);\r
85 }\r
86 \r
87 UInt32 MY_FAST_CALL CrcUpdateT1_BeT8(UInt32 v, const void *data, size_t size, const UInt32 *table)\r
88 {\r
89   const Byte *p = (const Byte *)data;\r
90   table += 0x100;\r
91   v = CRC_UINT32_SWAP(v);\r
92   for (; size > 0 && ((unsigned)(ptrdiff_t)p & 7) != 0; size--, p++)\r
93     v = CRC_UPDATE_BYTE_2_BE(v, *p);\r
94   for (; size >= 8; size -= 8, p += 8)\r
95   {\r
96     UInt32 d;\r
97     v ^= *(const UInt32 *)p;\r
98     v =\r
99           table[0x400 + ((v      ) & 0xFF)]\r
100         ^ table[0x500 + ((v >>  8) & 0xFF)]\r
101         ^ table[0x600 + ((v >> 16) & 0xFF)]\r
102         ^ table[0x700 + ((v >> 24))];\r
103     d = *((const UInt32 *)p + 1);\r
104     v ^=\r
105           table[0x000 + ((d      ) & 0xFF)]\r
106         ^ table[0x100 + ((d >>  8) & 0xFF)]\r
107         ^ table[0x200 + ((d >> 16) & 0xFF)]\r
108         ^ table[0x300 + ((d >> 24))];\r
109   }\r
110   for (; size > 0; size--, p++)\r
111     v = CRC_UPDATE_BYTE_2_BE(v, *p);\r
112   return CRC_UINT32_SWAP(v);\r
113 }\r
114 \r
115 #endif\r