1 /**********************************************************************
2 Copyright(c) 2011-2016 Intel Corporation All rights reserved.
4 Redistribution and use in source and binary forms, with or without
5 modification, are permitted provided that the following conditions
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in
11 the documentation and/or other materials provided with the
13 * Neither the name of Intel Corporation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 **********************************************************************/
30 #include "huff_codes.h"
32 #include "flatten_ll.h"
34 /* The order code length codes are written in the dynamic code header. This is
35 * defined in RFC 1951 page 13 */
36 static const uint8_t code_length_code_order
[] =
37 { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
39 static const uint32_t len_code_extra_bits
[] = {
40 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
41 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2,
42 0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4,
43 0x5, 0x5, 0x5, 0x5, 0x0
46 static const uint32_t dist_code_extra_bits
[] = {
47 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x2,
48 0x3, 0x3, 0x4, 0x4, 0x5, 0x5, 0x6, 0x6,
49 0x7, 0x7, 0x8, 0x8, 0x9, 0x9, 0xa, 0xa,
50 0xb, 0xb, 0xc, 0xc, 0xd, 0xd
53 static struct hufftables_icf static_hufftables
= {
55 {{{.code_and_extra
= 0x00c,.length2
= 0x8}}},
56 {{{.code_and_extra
= 0x08c,.length2
= 0x8}}},
57 {{{.code_and_extra
= 0x04c,.length2
= 0x8}}},
58 {{{.code_and_extra
= 0x0cc,.length2
= 0x8}}},
59 {{{.code_and_extra
= 0x02c,.length2
= 0x8}}},
60 {{{.code_and_extra
= 0x0ac,.length2
= 0x8}}},
61 {{{.code_and_extra
= 0x06c,.length2
= 0x8}}},
62 {{{.code_and_extra
= 0x0ec,.length2
= 0x8}}},
63 {{{.code_and_extra
= 0x01c,.length2
= 0x8}}},
64 {{{.code_and_extra
= 0x09c,.length2
= 0x8}}},
65 {{{.code_and_extra
= 0x05c,.length2
= 0x8}}},
66 {{{.code_and_extra
= 0x0dc,.length2
= 0x8}}},
67 {{{.code_and_extra
= 0x03c,.length2
= 0x8}}},
68 {{{.code_and_extra
= 0x0bc,.length2
= 0x8}}},
69 {{{.code_and_extra
= 0x07c,.length2
= 0x8}}},
70 {{{.code_and_extra
= 0x0fc,.length2
= 0x8}}},
71 {{{.code_and_extra
= 0x002,.length2
= 0x8}}},
72 {{{.code_and_extra
= 0x082,.length2
= 0x8}}},
73 {{{.code_and_extra
= 0x042,.length2
= 0x8}}},
74 {{{.code_and_extra
= 0x0c2,.length2
= 0x8}}},
75 {{{.code_and_extra
= 0x022,.length2
= 0x8}}},
76 {{{.code_and_extra
= 0x0a2,.length2
= 0x8}}},
77 {{{.code_and_extra
= 0x062,.length2
= 0x8}}},
78 {{{.code_and_extra
= 0x0e2,.length2
= 0x8}}},
79 {{{.code_and_extra
= 0x012,.length2
= 0x8}}},
80 {{{.code_and_extra
= 0x092,.length2
= 0x8}}},
81 {{{.code_and_extra
= 0x052,.length2
= 0x8}}},
82 {{{.code_and_extra
= 0x0d2,.length2
= 0x8}}},
83 {{{.code_and_extra
= 0x032,.length2
= 0x8}}},
84 {{{.code_and_extra
= 0x0b2,.length2
= 0x8}}},
85 {{{.code_and_extra
= 0x072,.length2
= 0x8}}},
86 {{{.code_and_extra
= 0x0f2,.length2
= 0x8}}},
87 {{{.code_and_extra
= 0x00a,.length2
= 0x8}}},
88 {{{.code_and_extra
= 0x08a,.length2
= 0x8}}},
89 {{{.code_and_extra
= 0x04a,.length2
= 0x8}}},
90 {{{.code_and_extra
= 0x0ca,.length2
= 0x8}}},
91 {{{.code_and_extra
= 0x02a,.length2
= 0x8}}},
92 {{{.code_and_extra
= 0x0aa,.length2
= 0x8}}},
93 {{{.code_and_extra
= 0x06a,.length2
= 0x8}}},
94 {{{.code_and_extra
= 0x0ea,.length2
= 0x8}}},
95 {{{.code_and_extra
= 0x01a,.length2
= 0x8}}},
96 {{{.code_and_extra
= 0x09a,.length2
= 0x8}}},
97 {{{.code_and_extra
= 0x05a,.length2
= 0x8}}},
98 {{{.code_and_extra
= 0x0da,.length2
= 0x8}}},
99 {{{.code_and_extra
= 0x03a,.length2
= 0x8}}},
100 {{{.code_and_extra
= 0x0ba,.length2
= 0x8}}},
101 {{{.code_and_extra
= 0x07a,.length2
= 0x8}}},
102 {{{.code_and_extra
= 0x0fa,.length2
= 0x8}}},
103 {{{.code_and_extra
= 0x006,.length2
= 0x8}}},
104 {{{.code_and_extra
= 0x086,.length2
= 0x8}}},
105 {{{.code_and_extra
= 0x046,.length2
= 0x8}}},
106 {{{.code_and_extra
= 0x0c6,.length2
= 0x8}}},
107 {{{.code_and_extra
= 0x026,.length2
= 0x8}}},
108 {{{.code_and_extra
= 0x0a6,.length2
= 0x8}}},
109 {{{.code_and_extra
= 0x066,.length2
= 0x8}}},
110 {{{.code_and_extra
= 0x0e6,.length2
= 0x8}}},
111 {{{.code_and_extra
= 0x016,.length2
= 0x8}}},
112 {{{.code_and_extra
= 0x096,.length2
= 0x8}}},
113 {{{.code_and_extra
= 0x056,.length2
= 0x8}}},
114 {{{.code_and_extra
= 0x0d6,.length2
= 0x8}}},
115 {{{.code_and_extra
= 0x036,.length2
= 0x8}}},
116 {{{.code_and_extra
= 0x0b6,.length2
= 0x8}}},
117 {{{.code_and_extra
= 0x076,.length2
= 0x8}}},
118 {{{.code_and_extra
= 0x0f6,.length2
= 0x8}}},
119 {{{.code_and_extra
= 0x00e,.length2
= 0x8}}},
120 {{{.code_and_extra
= 0x08e,.length2
= 0x8}}},
121 {{{.code_and_extra
= 0x04e,.length2
= 0x8}}},
122 {{{.code_and_extra
= 0x0ce,.length2
= 0x8}}},
123 {{{.code_and_extra
= 0x02e,.length2
= 0x8}}},
124 {{{.code_and_extra
= 0x0ae,.length2
= 0x8}}},
125 {{{.code_and_extra
= 0x06e,.length2
= 0x8}}},
126 {{{.code_and_extra
= 0x0ee,.length2
= 0x8}}},
127 {{{.code_and_extra
= 0x01e,.length2
= 0x8}}},
128 {{{.code_and_extra
= 0x09e,.length2
= 0x8}}},
129 {{{.code_and_extra
= 0x05e,.length2
= 0x8}}},
130 {{{.code_and_extra
= 0x0de,.length2
= 0x8}}},
131 {{{.code_and_extra
= 0x03e,.length2
= 0x8}}},
132 {{{.code_and_extra
= 0x0be,.length2
= 0x8}}},
133 {{{.code_and_extra
= 0x07e,.length2
= 0x8}}},
134 {{{.code_and_extra
= 0x0fe,.length2
= 0x8}}},
135 {{{.code_and_extra
= 0x001,.length2
= 0x8}}},
136 {{{.code_and_extra
= 0x081,.length2
= 0x8}}},
137 {{{.code_and_extra
= 0x041,.length2
= 0x8}}},
138 {{{.code_and_extra
= 0x0c1,.length2
= 0x8}}},
139 {{{.code_and_extra
= 0x021,.length2
= 0x8}}},
140 {{{.code_and_extra
= 0x0a1,.length2
= 0x8}}},
141 {{{.code_and_extra
= 0x061,.length2
= 0x8}}},
142 {{{.code_and_extra
= 0x0e1,.length2
= 0x8}}},
143 {{{.code_and_extra
= 0x011,.length2
= 0x8}}},
144 {{{.code_and_extra
= 0x091,.length2
= 0x8}}},
145 {{{.code_and_extra
= 0x051,.length2
= 0x8}}},
146 {{{.code_and_extra
= 0x0d1,.length2
= 0x8}}},
147 {{{.code_and_extra
= 0x031,.length2
= 0x8}}},
148 {{{.code_and_extra
= 0x0b1,.length2
= 0x8}}},
149 {{{.code_and_extra
= 0x071,.length2
= 0x8}}},
150 {{{.code_and_extra
= 0x0f1,.length2
= 0x8}}},
151 {{{.code_and_extra
= 0x009,.length2
= 0x8}}},
152 {{{.code_and_extra
= 0x089,.length2
= 0x8}}},
153 {{{.code_and_extra
= 0x049,.length2
= 0x8}}},
154 {{{.code_and_extra
= 0x0c9,.length2
= 0x8}}},
155 {{{.code_and_extra
= 0x029,.length2
= 0x8}}},
156 {{{.code_and_extra
= 0x0a9,.length2
= 0x8}}},
157 {{{.code_and_extra
= 0x069,.length2
= 0x8}}},
158 {{{.code_and_extra
= 0x0e9,.length2
= 0x8}}},
159 {{{.code_and_extra
= 0x019,.length2
= 0x8}}},
160 {{{.code_and_extra
= 0x099,.length2
= 0x8}}},
161 {{{.code_and_extra
= 0x059,.length2
= 0x8}}},
162 {{{.code_and_extra
= 0x0d9,.length2
= 0x8}}},
163 {{{.code_and_extra
= 0x039,.length2
= 0x8}}},
164 {{{.code_and_extra
= 0x0b9,.length2
= 0x8}}},
165 {{{.code_and_extra
= 0x079,.length2
= 0x8}}},
166 {{{.code_and_extra
= 0x0f9,.length2
= 0x8}}},
167 {{{.code_and_extra
= 0x005,.length2
= 0x8}}},
168 {{{.code_and_extra
= 0x085,.length2
= 0x8}}},
169 {{{.code_and_extra
= 0x045,.length2
= 0x8}}},
170 {{{.code_and_extra
= 0x0c5,.length2
= 0x8}}},
171 {{{.code_and_extra
= 0x025,.length2
= 0x8}}},
172 {{{.code_and_extra
= 0x0a5,.length2
= 0x8}}},
173 {{{.code_and_extra
= 0x065,.length2
= 0x8}}},
174 {{{.code_and_extra
= 0x0e5,.length2
= 0x8}}},
175 {{{.code_and_extra
= 0x015,.length2
= 0x8}}},
176 {{{.code_and_extra
= 0x095,.length2
= 0x8}}},
177 {{{.code_and_extra
= 0x055,.length2
= 0x8}}},
178 {{{.code_and_extra
= 0x0d5,.length2
= 0x8}}},
179 {{{.code_and_extra
= 0x035,.length2
= 0x8}}},
180 {{{.code_and_extra
= 0x0b5,.length2
= 0x8}}},
181 {{{.code_and_extra
= 0x075,.length2
= 0x8}}},
182 {{{.code_and_extra
= 0x0f5,.length2
= 0x8}}},
183 {{{.code_and_extra
= 0x00d,.length2
= 0x8}}},
184 {{{.code_and_extra
= 0x08d,.length2
= 0x8}}},
185 {{{.code_and_extra
= 0x04d,.length2
= 0x8}}},
186 {{{.code_and_extra
= 0x0cd,.length2
= 0x8}}},
187 {{{.code_and_extra
= 0x02d,.length2
= 0x8}}},
188 {{{.code_and_extra
= 0x0ad,.length2
= 0x8}}},
189 {{{.code_and_extra
= 0x06d,.length2
= 0x8}}},
190 {{{.code_and_extra
= 0x0ed,.length2
= 0x8}}},
191 {{{.code_and_extra
= 0x01d,.length2
= 0x8}}},
192 {{{.code_and_extra
= 0x09d,.length2
= 0x8}}},
193 {{{.code_and_extra
= 0x05d,.length2
= 0x8}}},
194 {{{.code_and_extra
= 0x0dd,.length2
= 0x8}}},
195 {{{.code_and_extra
= 0x03d,.length2
= 0x8}}},
196 {{{.code_and_extra
= 0x0bd,.length2
= 0x8}}},
197 {{{.code_and_extra
= 0x07d,.length2
= 0x8}}},
198 {{{.code_and_extra
= 0x0fd,.length2
= 0x8}}},
199 {{{.code_and_extra
= 0x013,.length2
= 0x9}}},
200 {{{.code_and_extra
= 0x113,.length2
= 0x9}}},
201 {{{.code_and_extra
= 0x093,.length2
= 0x9}}},
202 {{{.code_and_extra
= 0x193,.length2
= 0x9}}},
203 {{{.code_and_extra
= 0x053,.length2
= 0x9}}},
204 {{{.code_and_extra
= 0x153,.length2
= 0x9}}},
205 {{{.code_and_extra
= 0x0d3,.length2
= 0x9}}},
206 {{{.code_and_extra
= 0x1d3,.length2
= 0x9}}},
207 {{{.code_and_extra
= 0x033,.length2
= 0x9}}},
208 {{{.code_and_extra
= 0x133,.length2
= 0x9}}},
209 {{{.code_and_extra
= 0x0b3,.length2
= 0x9}}},
210 {{{.code_and_extra
= 0x1b3,.length2
= 0x9}}},
211 {{{.code_and_extra
= 0x073,.length2
= 0x9}}},
212 {{{.code_and_extra
= 0x173,.length2
= 0x9}}},
213 {{{.code_and_extra
= 0x0f3,.length2
= 0x9}}},
214 {{{.code_and_extra
= 0x1f3,.length2
= 0x9}}},
215 {{{.code_and_extra
= 0x00b,.length2
= 0x9}}},
216 {{{.code_and_extra
= 0x10b,.length2
= 0x9}}},
217 {{{.code_and_extra
= 0x08b,.length2
= 0x9}}},
218 {{{.code_and_extra
= 0x18b,.length2
= 0x9}}},
219 {{{.code_and_extra
= 0x04b,.length2
= 0x9}}},
220 {{{.code_and_extra
= 0x14b,.length2
= 0x9}}},
221 {{{.code_and_extra
= 0x0cb,.length2
= 0x9}}},
222 {{{.code_and_extra
= 0x1cb,.length2
= 0x9}}},
223 {{{.code_and_extra
= 0x02b,.length2
= 0x9}}},
224 {{{.code_and_extra
= 0x12b,.length2
= 0x9}}},
225 {{{.code_and_extra
= 0x0ab,.length2
= 0x9}}},
226 {{{.code_and_extra
= 0x1ab,.length2
= 0x9}}},
227 {{{.code_and_extra
= 0x06b,.length2
= 0x9}}},
228 {{{.code_and_extra
= 0x16b,.length2
= 0x9}}},
229 {{{.code_and_extra
= 0x0eb,.length2
= 0x9}}},
230 {{{.code_and_extra
= 0x1eb,.length2
= 0x9}}},
231 {{{.code_and_extra
= 0x01b,.length2
= 0x9}}},
232 {{{.code_and_extra
= 0x11b,.length2
= 0x9}}},
233 {{{.code_and_extra
= 0x09b,.length2
= 0x9}}},
234 {{{.code_and_extra
= 0x19b,.length2
= 0x9}}},
235 {{{.code_and_extra
= 0x05b,.length2
= 0x9}}},
236 {{{.code_and_extra
= 0x15b,.length2
= 0x9}}},
237 {{{.code_and_extra
= 0x0db,.length2
= 0x9}}},
238 {{{.code_and_extra
= 0x1db,.length2
= 0x9}}},
239 {{{.code_and_extra
= 0x03b,.length2
= 0x9}}},
240 {{{.code_and_extra
= 0x13b,.length2
= 0x9}}},
241 {{{.code_and_extra
= 0x0bb,.length2
= 0x9}}},
242 {{{.code_and_extra
= 0x1bb,.length2
= 0x9}}},
243 {{{.code_and_extra
= 0x07b,.length2
= 0x9}}},
244 {{{.code_and_extra
= 0x17b,.length2
= 0x9}}},
245 {{{.code_and_extra
= 0x0fb,.length2
= 0x9}}},
246 {{{.code_and_extra
= 0x1fb,.length2
= 0x9}}},
247 {{{.code_and_extra
= 0x007,.length2
= 0x9}}},
248 {{{.code_and_extra
= 0x107,.length2
= 0x9}}},
249 {{{.code_and_extra
= 0x087,.length2
= 0x9}}},
250 {{{.code_and_extra
= 0x187,.length2
= 0x9}}},
251 {{{.code_and_extra
= 0x047,.length2
= 0x9}}},
252 {{{.code_and_extra
= 0x147,.length2
= 0x9}}},
253 {{{.code_and_extra
= 0x0c7,.length2
= 0x9}}},
254 {{{.code_and_extra
= 0x1c7,.length2
= 0x9}}},
255 {{{.code_and_extra
= 0x027,.length2
= 0x9}}},
256 {{{.code_and_extra
= 0x127,.length2
= 0x9}}},
257 {{{.code_and_extra
= 0x0a7,.length2
= 0x9}}},
258 {{{.code_and_extra
= 0x1a7,.length2
= 0x9}}},
259 {{{.code_and_extra
= 0x067,.length2
= 0x9}}},
260 {{{.code_and_extra
= 0x167,.length2
= 0x9}}},
261 {{{.code_and_extra
= 0x0e7,.length2
= 0x9}}},
262 {{{.code_and_extra
= 0x1e7,.length2
= 0x9}}},
263 {{{.code_and_extra
= 0x017,.length2
= 0x9}}},
264 {{{.code_and_extra
= 0x117,.length2
= 0x9}}},
265 {{{.code_and_extra
= 0x097,.length2
= 0x9}}},
266 {{{.code_and_extra
= 0x197,.length2
= 0x9}}},
267 {{{.code_and_extra
= 0x057,.length2
= 0x9}}},
268 {{{.code_and_extra
= 0x157,.length2
= 0x9}}},
269 {{{.code_and_extra
= 0x0d7,.length2
= 0x9}}},
270 {{{.code_and_extra
= 0x1d7,.length2
= 0x9}}},
271 {{{.code_and_extra
= 0x037,.length2
= 0x9}}},
272 {{{.code_and_extra
= 0x137,.length2
= 0x9}}},
273 {{{.code_and_extra
= 0x0b7,.length2
= 0x9}}},
274 {{{.code_and_extra
= 0x1b7,.length2
= 0x9}}},
275 {{{.code_and_extra
= 0x077,.length2
= 0x9}}},
276 {{{.code_and_extra
= 0x177,.length2
= 0x9}}},
277 {{{.code_and_extra
= 0x0f7,.length2
= 0x9}}},
278 {{{.code_and_extra
= 0x1f7,.length2
= 0x9}}},
279 {{{.code_and_extra
= 0x00f,.length2
= 0x9}}},
280 {{{.code_and_extra
= 0x10f,.length2
= 0x9}}},
281 {{{.code_and_extra
= 0x08f,.length2
= 0x9}}},
282 {{{.code_and_extra
= 0x18f,.length2
= 0x9}}},
283 {{{.code_and_extra
= 0x04f,.length2
= 0x9}}},
284 {{{.code_and_extra
= 0x14f,.length2
= 0x9}}},
285 {{{.code_and_extra
= 0x0cf,.length2
= 0x9}}},
286 {{{.code_and_extra
= 0x1cf,.length2
= 0x9}}},
287 {{{.code_and_extra
= 0x02f,.length2
= 0x9}}},
288 {{{.code_and_extra
= 0x12f,.length2
= 0x9}}},
289 {{{.code_and_extra
= 0x0af,.length2
= 0x9}}},
290 {{{.code_and_extra
= 0x1af,.length2
= 0x9}}},
291 {{{.code_and_extra
= 0x06f,.length2
= 0x9}}},
292 {{{.code_and_extra
= 0x16f,.length2
= 0x9}}},
293 {{{.code_and_extra
= 0x0ef,.length2
= 0x9}}},
294 {{{.code_and_extra
= 0x1ef,.length2
= 0x9}}},
295 {{{.code_and_extra
= 0x01f,.length2
= 0x9}}},
296 {{{.code_and_extra
= 0x11f,.length2
= 0x9}}},
297 {{{.code_and_extra
= 0x09f,.length2
= 0x9}}},
298 {{{.code_and_extra
= 0x19f,.length2
= 0x9}}},
299 {{{.code_and_extra
= 0x05f,.length2
= 0x9}}},
300 {{{.code_and_extra
= 0x15f,.length2
= 0x9}}},
301 {{{.code_and_extra
= 0x0df,.length2
= 0x9}}},
302 {{{.code_and_extra
= 0x1df,.length2
= 0x9}}},
303 {{{.code_and_extra
= 0x03f,.length2
= 0x9}}},
304 {{{.code_and_extra
= 0x13f,.length2
= 0x9}}},
305 {{{.code_and_extra
= 0x0bf,.length2
= 0x9}}},
306 {{{.code_and_extra
= 0x1bf,.length2
= 0x9}}},
307 {{{.code_and_extra
= 0x07f,.length2
= 0x9}}},
308 {{{.code_and_extra
= 0x17f,.length2
= 0x9}}},
309 {{{.code_and_extra
= 0x0ff,.length2
= 0x9}}},
310 {{{.code_and_extra
= 0x1ff,.length2
= 0x9}}},
311 {{{.code_and_extra
= 0x000,.length2
= 0x7}}},
312 {{{.code_and_extra
= 0x040,.length2
= 0x7}}},
313 {{{.code_and_extra
= 0x020,.length2
= 0x7}}},
314 {{{.code_and_extra
= 0x060,.length2
= 0x7}}},
315 {{{.code_and_extra
= 0x010,.length2
= 0x7}}},
316 {{{.code_and_extra
= 0x050,.length2
= 0x7}}},
317 {{{.code_and_extra
= 0x030,.length2
= 0x7}}},
318 {{{.code_and_extra
= 0x070,.length2
= 0x7}}},
319 {{{.code_and_extra
= 0x008,.length2
= 0x7}}},
320 {{{.code_and_extra
= 0x048,.length2
= 0x7}}},
321 {{{.code_and_extra
= 0x028,.length2
= 0x7}}},
322 {{{.code_and_extra
= 0x068,.length2
= 0x7}}},
323 {{{.code_and_extra
= 0x018,.length2
= 0x7}}},
324 {{{.code_and_extra
= 0x058,.length2
= 0x7}}},
325 {{{.code_and_extra
= 0x038,.length2
= 0x7}}},
326 {{{.code_and_extra
= 0x078,.length2
= 0x7}}},
327 {{{.code_and_extra
= 0x004,.length2
= 0x7}}},
328 {{{.code_and_extra
= 0x044,.length2
= 0x7}}},
329 {{{.code_and_extra
= 0x024,.length2
= 0x7}}},
330 {{{.code_and_extra
= 0x064,.length2
= 0x7}}},
331 {{{.code_and_extra
= 0x014,.length2
= 0x7}}},
332 {{{.code_and_extra
= 0x054,.length2
= 0x7}}},
333 {{{.code_and_extra
= 0x034,.length2
= 0x7}}},
334 {{{.code_and_extra
= 0x074,.length2
= 0x7}}},
335 {{{.code_and_extra
= 0x003,.length2
= 0x8}}},
336 {{{.code_and_extra
= 0x083,.length2
= 0x8}}},
337 {{{.code_and_extra
= 0x043,.length2
= 0x8}}},
338 {{{.code_and_extra
= 0x0c3,.length2
= 0x8}}},
339 {{{.code_and_extra
= 0x023,.length2
= 0x8}}},
340 {{{.code_and_extra
= 0x0a3,.length2
= 0x8}}},
341 {{{.code_and_extra
= 0x063,.length2
= 0x8}}},
342 {{{.code_and_extra
= 0x0e3,.length2
= 0x8}}},
343 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
344 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
345 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
346 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
347 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
348 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
349 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
350 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
351 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
352 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
353 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
354 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
355 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
356 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
357 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
358 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
359 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
360 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
361 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
362 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
363 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
364 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
365 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
366 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
367 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
368 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
369 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
370 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
371 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
372 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
373 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
374 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
375 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
376 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
377 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
378 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
379 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
380 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
381 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
382 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
383 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
384 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
385 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
386 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
387 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
388 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
389 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
390 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
391 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
392 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
393 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
394 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
395 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
396 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
397 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
398 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
399 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
400 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
401 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
402 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
403 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
404 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
405 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
406 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
407 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
408 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
409 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
410 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
411 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
412 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
413 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
414 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
415 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
416 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
417 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
418 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
419 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
420 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
421 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
422 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
423 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
424 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
425 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
426 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
427 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
428 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
429 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
430 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
431 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
432 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
433 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
434 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
435 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
436 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
437 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
438 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
439 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
440 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
441 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
442 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
443 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
444 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
445 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
446 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
447 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
448 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
449 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
450 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
451 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
452 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
453 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
454 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
455 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
456 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
457 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
458 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
459 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
460 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
461 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
462 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
463 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
464 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
465 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
466 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
467 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
468 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
469 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
470 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
471 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
472 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
473 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
474 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
475 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
476 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
477 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
478 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
479 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
480 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
481 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
482 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
483 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
484 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
485 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
486 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
487 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
488 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
489 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
490 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
491 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
492 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
493 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
494 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
495 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
496 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
497 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
498 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
499 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
500 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
501 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
502 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
503 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
504 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
505 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
506 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
507 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
508 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
509 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
510 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
511 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
512 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
513 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
514 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
515 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
516 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
517 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
518 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
519 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
520 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
521 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
522 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
523 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
524 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
525 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
526 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
527 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
528 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
529 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
530 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
531 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
532 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
533 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
534 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
535 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
536 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
537 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
538 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
539 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
540 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
541 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
542 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
543 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
544 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
545 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
546 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
547 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
548 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
549 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
550 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
551 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
552 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
553 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
554 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
555 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
556 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
557 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
558 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
559 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
560 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
561 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
562 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
563 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
564 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
565 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
566 {{{.code_and_extra
= 0x000,.length2
= 0x0}}},
567 {{{.code_and_extra
= 0x000,.length2
= 0x0}}}},
569 {{{.code_and_extra
= 0x000,.length2
= 0x5}}},
570 {{{.code_and_extra
= 0x010,.length2
= 0x5}}},
571 {{{.code_and_extra
= 0x008,.length2
= 0x5}}},
572 {{{.code_and_extra
= 0x018,.length2
= 0x5}}},
573 {{{.code_and_extra
= 0x10004,.length2
= 0x5}}},
574 {{{.code_and_extra
= 0x10014,.length2
= 0x5}}},
575 {{{.code_and_extra
= 0x2000c,.length2
= 0x5}}},
576 {{{.code_and_extra
= 0x2001c,.length2
= 0x5}}},
577 {{{.code_and_extra
= 0x30002,.length2
= 0x5}}},
578 {{{.code_and_extra
= 0x30012,.length2
= 0x5}}},
579 {{{.code_and_extra
= 0x4000a,.length2
= 0x5}}},
580 {{{.code_and_extra
= 0x4001a,.length2
= 0x5}}},
581 {{{.code_and_extra
= 0x50006,.length2
= 0x5}}},
582 {{{.code_and_extra
= 0x50016,.length2
= 0x5}}},
583 {{{.code_and_extra
= 0x6000e,.length2
= 0x5}}},
584 {{{.code_and_extra
= 0x6001e,.length2
= 0x5}}},
585 {{{.code_and_extra
= 0x70001,.length2
= 0x5}}},
586 {{{.code_and_extra
= 0x70011,.length2
= 0x5}}},
587 {{{.code_and_extra
= 0x80009,.length2
= 0x5}}},
588 {{{.code_and_extra
= 0x80019,.length2
= 0x5}}},
589 {{{.code_and_extra
= 0x90005,.length2
= 0x5}}},
590 {{{.code_and_extra
= 0x90015,.length2
= 0x5}}},
591 {{{.code_and_extra
= 0xa000d,.length2
= 0x5}}},
592 {{{.code_and_extra
= 0xa001d,.length2
= 0x5}}},
593 {{{.code_and_extra
= 0xb0003,.length2
= 0x5}}},
594 {{{.code_and_extra
= 0xb0013,.length2
= 0x5}}},
595 {{{.code_and_extra
= 0xc000b,.length2
= 0x5}}},
596 {{{.code_and_extra
= 0xc001b,.length2
= 0x5}}},
597 {{{.code_and_extra
= 0xd0007,.length2
= 0x5}}},
598 {{{.code_and_extra
= 0xd0017,.length2
= 0x5}}},
599 {{{.code_and_extra
= 0x000,.length2
= 0x0}}}}
609 struct slver isal_update_histogram_slver_00010085
;
610 struct slver isal_update_histogram_slver
= { 0x0085, 0x01, 0x00 };
612 struct slver isal_create_hufftables_slver_00010086
;
613 struct slver isal_create_hufftables_slver
= { 0x0086, 0x01, 0x00 };
615 struct slver isal_create_hufftables_subset_slver_00010087
;
616 struct slver isal_create_hufftables_subset_slver
= { 0x0087, 0x01, 0x00 };
618 extern uint32_t build_huff_tree(struct heap_tree
*heap
, uint64_t heap_size
, uint64_t node_ptr
);
619 extern void build_heap(uint64_t * heap
, uint64_t heap_size
);
621 static uint32_t convert_dist_to_dist_sym(uint32_t dist
);
622 static uint32_t convert_length_to_len_sym(uint32_t length
);
624 static const uint8_t bitrev8
[0x100] = {
625 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
626 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
627 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
628 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
629 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
630 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
631 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
632 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
633 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
634 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
635 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
636 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
637 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
638 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
639 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
640 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
641 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
642 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
643 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
644 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
645 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
646 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
647 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
648 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
649 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
650 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
651 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
652 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
653 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
654 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
655 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
656 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
659 // bit reverse low order LENGTH bits in code, and return result in low order bits
660 static inline uint16_t bit_reverse(uint16_t code
, uint32_t length
)
662 code
= (bitrev8
[code
& 0x00FF] << 8) | (bitrev8
[code
>> 8]);
663 return (code
>> (16 - length
));
666 void isal_update_histogram_base(uint8_t * start_stream
, int length
,
667 struct isal_huff_histogram
*histogram
)
669 uint32_t literal
= 0, hash
;
670 uint16_t seen
, *last_seen
= histogram
->hash_table
;
671 uint8_t *current
, *end_stream
, *next_hash
, *end
;
672 uint32_t match_length
;
674 uint64_t *lit_len_histogram
= histogram
->lit_len_histogram
;
675 uint64_t *dist_histogram
= histogram
->dist_histogram
;
680 end_stream
= start_stream
+ length
;
681 memset(last_seen
, 0, sizeof(histogram
->hash_table
)); /* Initialize last_seen to be 0. */
682 for (current
= start_stream
; current
< end_stream
- 3; current
++) {
683 literal
= load_u32(current
);
684 hash
= compute_hash(literal
) & LVL0_HASH_MASK
;
685 seen
= last_seen
[hash
];
686 last_seen
[hash
] = (current
- start_stream
) & 0xFFFF;
687 dist
= (current
- start_stream
- seen
) & 0xFFFF;
688 if (dist
- 1 < D
- 1) {
689 assert(start_stream
<= current
- dist
);
691 compare258(current
- dist
, current
, end_stream
- current
);
692 if (match_length
>= SHORTEST_MATCH
) {
694 #ifdef ISAL_LIMIT_HASH_UPDATE
697 end
= next_hash
+ match_length
;
699 if (end
> end_stream
- 3)
700 end
= end_stream
- 3;
702 for (; next_hash
< end
; next_hash
++) {
703 literal
= load_u32(next_hash
);
704 hash
= compute_hash(literal
) & LVL0_HASH_MASK
;
705 last_seen
[hash
] = (next_hash
- start_stream
) & 0xFFFF;
708 dist_histogram
[convert_dist_to_dist_sym(dist
)] += 1;
709 lit_len_histogram
[convert_length_to_len_sym(match_length
)] +=
711 current
+= match_length
- 1;
715 lit_len_histogram
[literal
& 0xFF] += 1;
718 for (; current
< end_stream
; current
++)
719 lit_len_histogram
[*current
] += 1;
721 lit_len_histogram
[256] += 1;
726 * @brief Returns the deflate symbol value for a look back distance.
728 static uint32_t convert_dist_to_dist_sym(uint32_t dist
)
730 assert(dist
<= 32768 && dist
> 0);
732 uint32_t msb
= dist
> 4 ? bsr(dist
- 1) - 2 : 0;
733 return (msb
* 2) + ((dist
- 1) >> msb
);
740 * @brief Returns the deflate symbol value for a repeat length.
742 static uint32_t convert_length_to_len_sym(uint32_t length
)
744 assert(length
> 2 && length
< 259);
746 /* Based on tables on page 11 in RFC 1951 */
748 return 257 + length
- 3;
749 else if (length
< 19)
750 return 261 + (length
- 3) / 2;
751 else if (length
< 35)
752 return 265 + (length
- 3) / 4;
753 else if (length
< 67)
754 return 269 + (length
- 3) / 8;
755 else if (length
< 131)
756 return 273 + (length
- 3) / 16;
757 else if (length
< 258)
758 return 277 + (length
- 3) / 32;
763 // Upon return, codes[] contains the code lengths,
764 // and bl_count is the count of the lengths
766 /* Init heap with the histogram, and return the histogram size */
767 static inline uint32_t init_heap32(struct heap_tree
*heap_space
, uint32_t * histogram
,
770 uint32_t heap_size
, i
;
772 memset(heap_space
, 0, sizeof(struct heap_tree
));
775 for (i
= 0; i
< hist_size
; i
++) {
776 if (histogram
[i
] != 0)
777 heap_space
->heap
[++heap_size
] =
778 (((uint64_t) histogram
[i
]) << FREQ_SHIFT
) | i
;
781 // make sure heap has at least two elements in it
783 if (heap_size
== 0) {
784 heap_space
->heap
[1] = 1ULL << FREQ_SHIFT
;
785 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
789 if (histogram
[0] == 0)
790 heap_space
->heap
[2] = 1ULL << FREQ_SHIFT
;
792 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
797 build_heap(heap_space
->heap
, heap_size
);
802 static inline uint32_t init_heap64(struct heap_tree
*heap_space
, uint64_t * histogram
,
805 uint32_t heap_size
, i
;
807 memset(heap_space
, 0, sizeof(struct heap_tree
));
810 for (i
= 0; i
< hist_size
; i
++) {
811 if (histogram
[i
] != 0)
812 heap_space
->heap
[++heap_size
] = ((histogram
[i
]) << FREQ_SHIFT
) | i
;
815 // make sure heap has at least two elements in it
817 if (heap_size
== 0) {
818 heap_space
->heap
[1] = 1ULL << FREQ_SHIFT
;
819 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
823 if (histogram
[0] == 0)
824 heap_space
->heap
[2] = 1ULL << FREQ_SHIFT
;
826 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
831 build_heap(heap_space
->heap
, heap_size
);
836 static inline uint32_t init_heap64_semi_complete(struct heap_tree
*heap_space
,
837 uint64_t * histogram
, uint64_t hist_size
,
838 uint64_t complete_start
)
840 uint32_t heap_size
, i
;
842 memset(heap_space
, 0, sizeof(struct heap_tree
));
845 for (i
= 0; i
< complete_start
; i
++) {
846 if (histogram
[i
] != 0)
847 heap_space
->heap
[++heap_size
] = ((histogram
[i
]) << FREQ_SHIFT
) | i
;
850 for (; i
< hist_size
; i
++)
851 heap_space
->heap
[++heap_size
] = ((histogram
[i
]) << FREQ_SHIFT
) | i
;
853 // make sure heap has at least two elements in it
855 if (heap_size
== 0) {
856 heap_space
->heap
[1] = 1ULL << FREQ_SHIFT
;
857 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
861 if (histogram
[0] == 0)
862 heap_space
->heap
[2] = 1ULL << FREQ_SHIFT
;
864 heap_space
->heap
[2] = (1ULL << FREQ_SHIFT
) | 1;
869 build_heap(heap_space
->heap
, heap_size
);
874 static inline uint32_t init_heap64_complete(struct heap_tree
*heap_space
, uint64_t * histogram
,
877 uint32_t heap_size
, i
;
879 memset(heap_space
, 0, sizeof(struct heap_tree
));
882 for (i
= 0; i
< hist_size
; i
++)
883 heap_space
->heap
[++heap_size
] = ((histogram
[i
]) << FREQ_SHIFT
) | i
;
885 build_heap(heap_space
->heap
, heap_size
);
890 static inline uint32_t fix_code_lens(struct heap_tree
*heap_space
, uint32_t root_node
,
891 uint32_t * bl_count
, uint32_t max_code_len
)
893 struct tree_node
*tree
= heap_space
->tree
;
894 uint64_t *code_len_count
= heap_space
->code_len_count
;
895 uint32_t i
, j
, k
, child
, depth
, code_len
;
897 // compute code lengths and code length counts
900 for (i
= root_node
; i
<= HEAP_TREE_NODE_START
; i
++) {
901 child
= tree
[i
].child
;
902 if (child
> MAX_HISTHEAP_SIZE
) {
903 depth
= 1 + tree
[i
].depth
;
905 tree
[child
].depth
= depth
;
906 tree
[child
- 1].depth
= depth
;
909 depth
= tree
[i
].depth
;
910 while (code_len
< depth
) {
912 code_len_count
[code_len
] = 0;
914 code_len_count
[depth
]++;
918 if (code_len
> max_code_len
) {
919 while (code_len
> max_code_len
) {
920 assert(code_len_count
[code_len
] > 1);
921 for (i
= max_code_len
- 1; i
!= 0; i
--)
922 if (code_len_count
[i
] != 0)
926 code_len_count
[i
+ 1] += 2;
927 code_len_count
[code_len
- 1]++;
928 code_len_count
[code_len
] -= 2;
929 if (code_len_count
[code_len
] == 0)
934 for (i
= 1; i
<= code_len
; i
++)
935 bl_count
[i
] = code_len_count
[i
];
936 for (; i
<= max_code_len
; i
++)
939 for (k
= 1; code_len_count
[k
] == 0; k
++) ;
940 for (i
= root_node
; i
< j
; i
++) {
943 for (; code_len_count
[k
] == 0; k
++) ;
947 for (i
= 1; i
<= code_len
; i
++)
948 bl_count
[i
] = code_len_count
[i
];
949 for (; i
<= max_code_len
; i
++)
958 gen_huff_code_lens(struct heap_tree
*heap_space
, uint32_t heap_size
, uint32_t * bl_count
,
959 struct huff_code
*codes
, uint32_t codes_count
, uint32_t max_code_len
)
961 struct tree_node
*tree
= heap_space
->tree
;
962 uint32_t root_node
= HEAP_TREE_NODE_START
, node_ptr
;
965 root_node
= build_huff_tree(heap_space
, heap_size
, root_node
);
967 end_node
= fix_code_lens(heap_space
, root_node
, bl_count
, max_code_len
);
969 memset(codes
, 0, codes_count
* sizeof(*codes
));
970 for (node_ptr
= root_node
; node_ptr
< end_node
; node_ptr
++)
971 codes
[tree
[node_ptr
].child
].length
= tree
[node_ptr
].depth
;
976 * @brief Determines the code each element of a deflate compliant huffman tree and stores
977 * it in a lookup table
978 * @requires table has been initialized to already contain the code length for each element.
979 * @param table: A lookup table used to store the codes.
980 * @param table_length: The length of table.
981 * @param count: a histogram representing the number of occurences of codes of a given length
983 static inline uint32_t set_huff_codes(struct huff_code
*huff_code_table
, int table_length
,
986 /* Uses the algorithm mentioned in the deflate standard, Rfc 1951. */
989 uint16_t next_code
[MAX_HUFF_TREE_DEPTH
+ 1];
990 uint32_t max_code
= 0;
994 for (i
= 1; i
< MAX_HUFF_TREE_DEPTH
+ 1; i
++)
995 next_code
[i
] = (next_code
[i
- 1] + count
[i
- 1]) << 1;
997 for (i
= 0; i
< table_length
; i
++) {
998 if (huff_code_table
[i
].length
!= 0) {
999 huff_code_table
[i
].code
=
1000 bit_reverse(next_code
[huff_code_table
[i
].length
],
1001 huff_code_table
[i
].length
);
1002 next_code
[huff_code_table
[i
].length
] += 1;
1010 // on input, codes contain the code lengths
1011 // on output, code contains:
1012 // 23:16 code length
1013 // 15:0 code value in low order bits
1014 // returns max code value
1015 static inline uint32_t set_dist_huff_codes(struct huff_code
*codes
, uint32_t * bl_count
)
1017 uint32_t code
, code_len
, bits
, i
;
1018 uint32_t next_code
[MAX_DEFLATE_CODE_LEN
+ 1];
1019 uint32_t max_code
= 0;
1020 const uint32_t num_codes
= DIST_LEN
;
1022 code
= bl_count
[0] = 0;
1023 for (bits
= 1; bits
<= MAX_HUFF_TREE_DEPTH
; bits
++) {
1024 code
= (code
+ bl_count
[bits
- 1]) << 1;
1025 next_code
[bits
] = code
;
1027 for (i
= 0; i
< num_codes
; i
++) {
1028 code_len
= codes
[i
].length
;
1029 if (code_len
!= 0) {
1030 codes
[i
].code
= bit_reverse(next_code
[code_len
], code_len
);
1031 codes
[i
].extra_bit_count
= dist_code_extra_bits
[i
];
1032 next_code
[code_len
] += 1;
1040 * @brief Creates the header for run length encoded huffman trees.
1041 * @param header: the output header.
1042 * @param lookup_table: a huffman lookup table.
1043 * @param huffman_rep: a run length encoded huffman tree.
1044 * @extra_bits: extra bits associated with the corresponding spot in huffman_rep
1045 * @param huffman_rep_length: the length of huffman_rep.
1046 * @param end_of_block: Value determining whether end of block header is produced or not;
1047 * 0 corresponds to not end of block and all other inputs correspond to end of block.
1048 * @param hclen: Length of huffman code for huffman codes minus 4.
1049 * @param hlit: Length of literal/length table minus 257.
1050 * @parm hdist: Length of distance table minus 1.
1052 static int create_huffman_header(struct BitBuf2
*header_bitbuf
,
1053 struct huff_code
*lookup_table
,
1054 struct rl_code
*huffman_rep
,
1055 uint16_t huffman_rep_length
, uint32_t end_of_block
,
1056 uint32_t hclen
, uint32_t hlit
, uint32_t hdist
)
1058 /* hlit, hdist, hclen are as defined in the deflate standard, head is the
1059 * first three deflate header bits.*/
1063 struct huff_code huffman_value
;
1064 const uint32_t extra_bits
[3] = { 2, 3, 7 };
1066 bit_count
= buffer_bits_used(header_bitbuf
);
1068 data
= (end_of_block
? 5 : 4) | (hlit
<< 3) | (hdist
<< 8) | (hclen
<< 13);
1069 data
|= ((lookup_table
[code_length_code_order
[0]].length
) << DYN_HDR_START_LEN
);
1070 write_bits(header_bitbuf
, data
, DYN_HDR_START_LEN
+ 3);
1072 for (i
= hclen
+ 3; i
>= 1; i
--)
1073 data
= (data
<< 3) | lookup_table
[code_length_code_order
[i
]].length
;
1075 write_bits(header_bitbuf
, data
, (hclen
+ 3) * 3);
1077 for (i
= 0; i
< huffman_rep_length
; i
++) {
1078 huffman_value
= lookup_table
[huffman_rep
[i
].code
];
1080 write_bits(header_bitbuf
, (uint64_t) huffman_value
.code
,
1081 (uint32_t) huffman_value
.length
);
1083 if (huffman_rep
[i
].code
> 15) {
1084 write_bits(header_bitbuf
, (uint64_t) huffman_rep
[i
].extra_bits
,
1085 (uint32_t) extra_bits
[huffman_rep
[i
].code
- 16]);
1088 bit_count
= buffer_bits_used(header_bitbuf
) - bit_count
;
1094 * @brief Creates the dynamic huffman deflate header.
1095 * @returns Returns the length of header in bits.
1096 * @requires This function requires header is large enough to store the whole header.
1097 * @param header: The output header.
1098 * @param lit_huff_table: A literal/length code huffman lookup table.\
1099 * @param dist_huff_table: A distance huffman code lookup table.
1100 * @param end_of_block: Value determining whether end of block header is produced or not;
1101 * 0 corresponds to not end of block and all other inputs correspond to end of block.
1103 static inline int create_header(struct BitBuf2
*header_bitbuf
, struct rl_code
*huffman_rep
,
1104 uint32_t length
, uint64_t * histogram
, uint32_t hlit
,
1105 uint32_t hdist
, uint32_t end_of_block
)
1110 struct heap_tree heap_space
;
1111 uint32_t code_len_count
[MAX_HUFF_TREE_DEPTH
+ 1];
1112 struct huff_code lookup_table
[HUFF_LEN
];
1114 /* hlit, hdist, and hclen are defined in RFC 1951 page 13 */
1118 /* Create a huffman tree to encode run length encoded representation. */
1119 heap_size
= init_heap64(&heap_space
, histogram
, HUFF_LEN
);
1120 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1121 (struct huff_code
*)lookup_table
, HUFF_LEN
, 7);
1122 set_huff_codes(lookup_table
, HUFF_LEN
, code_len_count
);
1124 /* Calculate hclen */
1125 for (i
= CODE_LEN_CODES
- 1; i
> 3; i
--) /* i must be at least 4 */
1126 if (lookup_table
[code_length_code_order
[i
]].length
!= 0)
1131 /* Generate actual header. */
1132 bit_count
= create_huffman_header(header_bitbuf
, lookup_table
, huffman_rep
,
1133 length
, end_of_block
, hclen
, hlit
, hdist
);
1139 struct rl_code
*write_rl(struct rl_code
*pout
, uint16_t last_len
, uint32_t run_len
,
1142 if (last_len
== 0) {
1143 while (run_len
> 138) {
1145 pout
->extra_bits
= 138 - 11;
1150 // 1 <= run_len <= 138
1153 pout
->extra_bits
= run_len
- 11;
1156 } else if (run_len
> 2) {
1158 pout
->extra_bits
= run_len
- 3;
1161 } else if (run_len
== 1) {
1163 pout
->extra_bits
= 0;
1167 assert(run_len
== 2);
1169 pout
[0].extra_bits
= 0;
1171 pout
[1].extra_bits
= 0;
1177 pout
->code
= last_len
;
1178 pout
->extra_bits
= 0;
1183 while (run_len
> 6) {
1185 pout
->extra_bits
= 6 - 3;
1190 // 1 <= run_len <= 6
1193 pout
->code
= last_len
;
1194 pout
->extra_bits
= 0;
1199 pout
[0].code
= last_len
;
1200 pout
[0].extra_bits
= 0;
1201 pout
[1].code
= last_len
;
1202 pout
[1].extra_bits
= 0;
1204 counts
[last_len
] += 2;
1208 pout
->extra_bits
= run_len
- 3;
1217 // convert codes into run-length symbols, write symbols into OUT
1218 // generate histogram into COUNTS (assumed to be initialized to 0)
1220 // 4:0 code (0...18)
1221 // 15:8 Extra bits (0...127)
1222 // returns number of symbols in out
1223 static inline uint32_t rl_encode(uint16_t * codes
, uint32_t num_codes
, uint64_t * counts
,
1224 struct rl_code
*out
)
1226 uint32_t i
, run_len
;
1227 uint16_t last_len
, len
;
1228 struct rl_code
*pout
;
1231 last_len
= codes
[0];
1233 for (i
= 1; i
< num_codes
; i
++) {
1235 if (len
== last_len
) {
1239 pout
= write_rl(pout
, last_len
, run_len
, counts
);
1243 pout
= write_rl(pout
, last_len
, run_len
, counts
);
1245 return (uint32_t) (pout
- out
);
1249 * @brief Creates a two table representation of huffman codes.
1250 * @param code_table: output table containing the code
1251 * @param code_size_table: output table containing the code length
1252 * @param length: the lenght of hufftable
1253 * @param hufftable: a huffman lookup table
1255 static void create_code_tables(uint16_t * code_table
, uint8_t * code_length_table
,
1256 uint32_t length
, struct huff_code
*hufftable
)
1259 for (i
= 0; i
< length
; i
++) {
1260 code_table
[i
] = hufftable
[i
].code
;
1261 code_length_table
[i
] = hufftable
[i
].length
;
1266 * @brief Creates a packed representation of length huffman codes.
1267 * @details In packed_table, bits 32:8 contain the extra bits appended to the huffman
1268 * code and bits 8:0 contain the code length.
1269 * @param packed_table: the output table
1270 * @param length: the length of lit_len_hufftable
1271 * @param lit_len_hufftable: a literal/length huffman lookup table
1273 static void create_packed_len_table(uint32_t * packed_table
,
1274 struct huff_code
*lit_len_hufftable
)
1277 uint16_t extra_bits
;
1278 uint16_t extra_bits_count
= 0;
1280 /* Gain extra bits is the next place where the number of extra bits in
1281 * lenght codes increases. */
1282 uint16_t gain_extra_bits
= LEN_EXTRA_BITS_START
;
1284 for (i
= 257; i
< LIT_LEN
- 1; i
++) {
1285 for (extra_bits
= 0; extra_bits
< (1 << extra_bits_count
); extra_bits
++) {
1288 packed_table
[count
++] =
1289 (extra_bits
<< (lit_len_hufftable
[i
].length
+ LENGTH_BITS
)) |
1290 (lit_len_hufftable
[i
].code
<< LENGTH_BITS
) |
1291 (lit_len_hufftable
[i
].length
+ extra_bits_count
);
1294 if (i
== gain_extra_bits
) {
1295 gain_extra_bits
+= LEN_EXTRA_BITS_INTERVAL
;
1296 extra_bits_count
+= 1;
1300 packed_table
[count
] = (lit_len_hufftable
[LIT_LEN
- 1].code
<< LENGTH_BITS
) |
1301 (lit_len_hufftable
[LIT_LEN
- 1].length
);
1305 * @brief Creates a packed representation of distance huffman codes.
1306 * @details In packed_table, bits 32:8 contain the extra bits appended to the huffman
1307 * code and bits 8:0 contain the code length.
1308 * @param packed_table: the output table
1309 * @param length: the length of lit_len_hufftable
1310 * @param dist_hufftable: a distance huffman lookup table
1312 static void create_packed_dist_table(uint32_t * packed_table
, uint32_t length
,
1313 struct huff_code
*dist_hufftable
)
1316 uint16_t extra_bits
;
1317 uint16_t extra_bits_count
= 0;
1319 /* Gain extra bits is the next place where the number of extra bits in
1320 * distance codes increases. */
1321 uint16_t gain_extra_bits
= DIST_EXTRA_BITS_START
;
1323 for (i
= 0; i
< DIST_LEN
; i
++) {
1324 for (extra_bits
= 0; extra_bits
< (1 << extra_bits_count
); extra_bits
++) {
1325 if (count
>= length
)
1328 packed_table
[count
++] =
1329 (extra_bits
<< (dist_hufftable
[i
].length
+ LENGTH_BITS
)) |
1330 (dist_hufftable
[i
].code
<< LENGTH_BITS
) |
1331 (dist_hufftable
[i
].length
+ extra_bits_count
);
1335 if (i
== gain_extra_bits
) {
1336 gain_extra_bits
+= DIST_EXTRA_BITS_INTERVAL
;
1337 extra_bits_count
+= 1;
1343 * @brief Checks to see if the hufftable is usable by igzip
1345 * @param lit_len_hufftable: literal/length huffman code
1346 * @param dist_hufftable: distance huffman code
1347 * @returns Returns 0 if the table is usable
1349 static int are_hufftables_useable(struct huff_code
*lit_len_hufftable
,
1350 struct huff_code
*dist_hufftable
)
1352 int max_lit_code_len
= 0, max_len_code_len
= 0, max_dist_code_len
= 0;
1353 int dist_extra_bits
= 0, len_extra_bits
= 0;
1354 int gain_dist_extra_bits
= DIST_EXTRA_BITS_START
;
1355 int gain_len_extra_bits
= LEN_EXTRA_BITS_START
;
1359 for (i
= 0; i
< LIT_LEN
; i
++)
1360 if (lit_len_hufftable
[i
].length
> max_lit_code_len
)
1361 max_lit_code_len
= lit_len_hufftable
[i
].length
;
1363 for (i
= 257; i
< LIT_LEN
- 1; i
++) {
1364 if (lit_len_hufftable
[i
].length
+ len_extra_bits
> max_len_code_len
)
1365 max_len_code_len
= lit_len_hufftable
[i
].length
+ len_extra_bits
;
1367 if (i
== gain_len_extra_bits
) {
1368 gain_len_extra_bits
+= LEN_EXTRA_BITS_INTERVAL
;
1369 len_extra_bits
+= 1;
1373 for (i
= 0; i
< DIST_LEN
; i
++) {
1374 if (dist_hufftable
[i
].length
+ dist_extra_bits
> max_dist_code_len
)
1375 max_dist_code_len
= dist_hufftable
[i
].length
+ dist_extra_bits
;
1377 if (i
== gain_dist_extra_bits
) {
1378 gain_dist_extra_bits
+= DIST_EXTRA_BITS_INTERVAL
;
1379 dist_extra_bits
+= 1;
1383 max_code_len
= max_lit_code_len
+ max_len_code_len
+ max_dist_code_len
;
1385 /* Some versions of igzip can write upto one literal, one length and one
1386 * distance code at the same time. This checks to make sure that is
1387 * always writeable in bitbuf*/
1388 return (max_code_len
> MAX_BITBUF_BIT_WRITE
);
1391 int isal_create_hufftables(struct isal_hufftables
*hufftables
,
1392 struct isal_huff_histogram
*histogram
)
1394 struct huff_code lit_huff_table
[LIT_LEN
], dist_huff_table
[DIST_LEN
];
1396 int max_dist
= convert_dist_to_dist_sym(IGZIP_HIST_SIZE
);
1397 struct heap_tree heap_space
;
1399 uint32_t code_len_count
[MAX_HUFF_TREE_DEPTH
+ 1];
1400 struct BitBuf2 header_bitbuf
;
1401 uint32_t max_lit_len_sym
;
1402 uint32_t max_dist_sym
;
1403 uint32_t hlit
, hdist
, i
;
1404 uint16_t combined_table
[LIT_LEN
+ DIST_LEN
];
1405 uint64_t count_histogram
[HUFF_LEN
];
1406 struct rl_code rl_huff
[LIT_LEN
+ DIST_LEN
];
1407 uint32_t rl_huff_len
;
1409 uint32_t *dist_table
= hufftables
->dist_table
;
1410 uint32_t *len_table
= hufftables
->len_table
;
1411 uint16_t *lit_table
= hufftables
->lit_table
;
1412 uint16_t *dcodes
= hufftables
->dcodes
;
1413 uint8_t *lit_table_sizes
= hufftables
->lit_table_sizes
;
1414 uint8_t *dcodes_sizes
= hufftables
->dcodes_sizes
;
1415 uint64_t *lit_len_histogram
= histogram
->lit_len_histogram
;
1416 uint64_t *dist_histogram
= histogram
->dist_histogram
;
1418 memset(hufftables
, 0, sizeof(struct isal_hufftables
));
1420 heap_size
= init_heap64_complete(&heap_space
, lit_len_histogram
, LIT_LEN
);
1421 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1422 (struct huff_code
*)lit_huff_table
, LIT_LEN
, MAX_DEFLATE_CODE_LEN
);
1423 max_lit_len_sym
= set_huff_codes(lit_huff_table
, LIT_LEN
, code_len_count
);
1425 heap_size
= init_heap64_complete(&heap_space
, dist_histogram
, DIST_LEN
);
1426 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1427 (struct huff_code
*)dist_huff_table
, max_dist
,
1428 MAX_DEFLATE_CODE_LEN
);
1429 max_dist_sym
= set_huff_codes(dist_huff_table
, DIST_LEN
, code_len_count
);
1431 if (are_hufftables_useable(lit_huff_table
, dist_huff_table
)) {
1432 heap_size
= init_heap64_complete(&heap_space
, lit_len_histogram
, LIT_LEN
);
1433 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1434 (struct huff_code
*)lit_huff_table
, LIT_LEN
,
1435 MAX_SAFE_LIT_CODE_LEN
);
1436 max_lit_len_sym
= set_huff_codes(lit_huff_table
, LIT_LEN
, code_len_count
);
1438 heap_size
= init_heap64_complete(&heap_space
, dist_histogram
, DIST_LEN
);
1439 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1440 (struct huff_code
*)dist_huff_table
, max_dist
,
1441 MAX_SAFE_DIST_CODE_LEN
);
1442 max_dist_sym
= set_huff_codes(dist_huff_table
, DIST_LEN
, code_len_count
);
1446 create_code_tables(dcodes
, dcodes_sizes
, DIST_LEN
- DCODE_OFFSET
,
1447 dist_huff_table
+ DCODE_OFFSET
);
1449 create_code_tables(lit_table
, lit_table_sizes
, IGZIP_LIT_TABLE_SIZE
, lit_huff_table
);
1451 create_packed_len_table(len_table
, lit_huff_table
);
1452 create_packed_dist_table(dist_table
, IGZIP_DIST_TABLE_SIZE
, dist_huff_table
);
1454 set_buf(&header_bitbuf
, hufftables
->deflate_hdr
, sizeof(hufftables
->deflate_hdr
));
1455 init(&header_bitbuf
);
1457 hlit
= max_lit_len_sym
- 256;
1458 hdist
= max_dist_sym
;
1460 /* Run length encode the length and distance huffman codes */
1461 memset(count_histogram
, 0, sizeof(count_histogram
));
1462 for (i
= 0; i
< 257 + hlit
; i
++)
1463 combined_table
[i
] = lit_huff_table
[i
].length
;
1464 for (i
= 0; i
< 1 + hdist
; i
++)
1465 combined_table
[i
+ hlit
+ 257] = dist_huff_table
[i
].length
;
1467 rl_encode(combined_table
, hlit
+ 257 + hdist
+ 1, count_histogram
, rl_huff
);
1471 create_header(&header_bitbuf
, rl_huff
, rl_huff_len
,
1472 count_histogram
, hlit
, hdist
, LAST_BLOCK
);
1473 flush(&header_bitbuf
);
1475 hufftables
->deflate_hdr_count
= bit_count
/ 8;
1476 hufftables
->deflate_hdr_extra_bits
= bit_count
% 8;
1481 int isal_create_hufftables_subset(struct isal_hufftables
*hufftables
,
1482 struct isal_huff_histogram
*histogram
)
1484 struct huff_code lit_huff_table
[LIT_LEN
], dist_huff_table
[DIST_LEN
];
1486 int max_dist
= convert_dist_to_dist_sym(IGZIP_HIST_SIZE
);
1487 struct heap_tree heap_space
;
1489 uint32_t code_len_count
[MAX_HUFF_TREE_DEPTH
+ 1];
1490 struct BitBuf2 header_bitbuf
;
1491 uint32_t max_lit_len_sym
;
1492 uint32_t max_dist_sym
;
1493 uint32_t hlit
, hdist
, i
;
1494 uint16_t combined_table
[LIT_LEN
+ DIST_LEN
];
1495 uint64_t count_histogram
[HUFF_LEN
];
1496 struct rl_code rl_huff
[LIT_LEN
+ DIST_LEN
];
1497 uint32_t rl_huff_len
;
1499 uint32_t *dist_table
= hufftables
->dist_table
;
1500 uint32_t *len_table
= hufftables
->len_table
;
1501 uint16_t *lit_table
= hufftables
->lit_table
;
1502 uint16_t *dcodes
= hufftables
->dcodes
;
1503 uint8_t *lit_table_sizes
= hufftables
->lit_table_sizes
;
1504 uint8_t *dcodes_sizes
= hufftables
->dcodes_sizes
;
1505 uint64_t *lit_len_histogram
= histogram
->lit_len_histogram
;
1506 uint64_t *dist_histogram
= histogram
->dist_histogram
;
1508 memset(hufftables
, 0, sizeof(struct isal_hufftables
));
1511 init_heap64_semi_complete(&heap_space
, lit_len_histogram
, LIT_LEN
,
1512 ISAL_DEF_LIT_SYMBOLS
);
1513 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1514 (struct huff_code
*)lit_huff_table
, LIT_LEN
, MAX_DEFLATE_CODE_LEN
);
1515 max_lit_len_sym
= set_huff_codes(lit_huff_table
, LIT_LEN
, code_len_count
);
1517 heap_size
= init_heap64_complete(&heap_space
, dist_histogram
, DIST_LEN
);
1518 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1519 (struct huff_code
*)dist_huff_table
, max_dist
,
1520 MAX_DEFLATE_CODE_LEN
);
1521 max_dist_sym
= set_huff_codes(dist_huff_table
, DIST_LEN
, code_len_count
);
1523 if (are_hufftables_useable(lit_huff_table
, dist_huff_table
)) {
1524 heap_size
= init_heap64_complete(&heap_space
, lit_len_histogram
, LIT_LEN
);
1525 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1526 (struct huff_code
*)lit_huff_table
, LIT_LEN
,
1527 MAX_SAFE_LIT_CODE_LEN
);
1528 max_lit_len_sym
= set_huff_codes(lit_huff_table
, LIT_LEN
, code_len_count
);
1530 heap_size
= init_heap64_complete(&heap_space
, dist_histogram
, DIST_LEN
);
1531 gen_huff_code_lens(&heap_space
, heap_size
, code_len_count
,
1532 (struct huff_code
*)dist_huff_table
, max_dist
,
1533 MAX_SAFE_DIST_CODE_LEN
);
1534 max_dist_sym
= set_huff_codes(dist_huff_table
, DIST_LEN
, code_len_count
);
1538 create_code_tables(dcodes
, dcodes_sizes
, DIST_LEN
- DCODE_OFFSET
,
1539 dist_huff_table
+ DCODE_OFFSET
);
1541 create_code_tables(lit_table
, lit_table_sizes
, IGZIP_LIT_TABLE_SIZE
, lit_huff_table
);
1543 create_packed_len_table(len_table
, lit_huff_table
);
1544 create_packed_dist_table(dist_table
, IGZIP_DIST_TABLE_SIZE
, dist_huff_table
);
1546 set_buf(&header_bitbuf
, hufftables
->deflate_hdr
, sizeof(hufftables
->deflate_hdr
));
1547 init(&header_bitbuf
);
1549 hlit
= max_lit_len_sym
- 256;
1550 hdist
= max_dist_sym
;
1552 /* Run length encode the length and distance huffman codes */
1553 memset(count_histogram
, 0, sizeof(count_histogram
));
1554 for (i
= 0; i
< 257 + hlit
; i
++)
1555 combined_table
[i
] = lit_huff_table
[i
].length
;
1556 for (i
= 0; i
< 1 + hdist
; i
++)
1557 combined_table
[i
+ hlit
+ 257] = dist_huff_table
[i
].length
;
1559 rl_encode(combined_table
, hlit
+ 257 + hdist
+ 1, count_histogram
, rl_huff
);
1563 create_header(&header_bitbuf
, rl_huff
, rl_huff_len
,
1564 count_histogram
, hlit
, hdist
, LAST_BLOCK
);
1565 flush(&header_bitbuf
);
1567 hufftables
->deflate_hdr_count
= bit_count
/ 8;
1568 hufftables
->deflate_hdr_extra_bits
= bit_count
% 8;
1573 static void expand_hufftables_icf(struct hufftables_icf
*hufftables
)
1575 uint32_t i
, eb
, j
, k
, len
, code
;
1576 struct huff_code orig
[21], *p_code
;
1577 struct huff_code
*lit_len_codes
= hufftables
->lit_len_table
;
1578 struct huff_code
*dist_codes
= hufftables
->dist_table
;
1580 for (i
= 0; i
< 21; i
++)
1581 orig
[i
] = lit_len_codes
[i
+ 265];
1583 p_code
= &lit_len_codes
[265];
1586 for (eb
= 1; eb
< 6; eb
++) {
1587 for (k
= 0; k
< 4; k
++) {
1588 len
= orig
[i
].length
;
1589 code
= orig
[i
++].code
;
1590 for (j
= 0; j
< (1u << eb
); j
++) {
1591 p_code
->code_and_extra
= code
| (j
<< len
);
1592 p_code
->length
= len
+ eb
;
1597 // fix up last record
1598 p_code
[-1] = orig
[i
];
1600 dist_codes
[DIST_LEN
].code_and_extra
= 0;
1601 dist_codes
[DIST_LEN
].length
= 0;
1605 create_hufftables_icf(struct BitBuf2
*bb
, struct hufftables_icf
*hufftables
,
1606 struct isal_mod_hist
*hist
, uint32_t end_of_block
)
1608 uint32_t bl_count
[MAX_DEFLATE_CODE_LEN
+ 1];
1609 uint32_t max_ll_code
, max_d_code
;
1610 struct heap_tree heap_space
;
1612 struct rl_code cl_tokens
[LIT_LEN
+ DIST_LEN
];
1613 uint32_t num_cl_tokens
;
1614 uint64_t cl_counts
[CODE_LEN_CODES
];
1615 uint16_t combined_table
[LIT_LEN
+ DIST_LEN
];
1617 uint64_t compressed_len
= 0;
1618 uint64_t static_compressed_len
= 3; /* The static header size */
1619 struct BitBuf2 bb_tmp
;
1621 struct huff_code
*ll_codes
= hufftables
->lit_len_table
;
1622 struct huff_code
*d_codes
= hufftables
->dist_table
;
1623 uint32_t *ll_hist
= hist
->ll_hist
;
1624 uint32_t *d_hist
= hist
->d_hist
;
1625 struct huff_code
*static_ll_codes
= static_hufftables
.lit_len_table
;
1626 struct huff_code
*static_d_codes
= static_hufftables
.dist_table
;
1628 memcpy(&bb_tmp
, bb
, sizeof(struct BitBuf2
));
1630 flatten_ll(hist
->ll_hist
);
1632 // make sure EOB is present
1633 if (ll_hist
[256] == 0)
1636 heap_size
= init_heap32(&heap_space
, ll_hist
, LIT_LEN
);
1637 gen_huff_code_lens(&heap_space
, heap_size
, bl_count
,
1638 ll_codes
, LIT_LEN
, MAX_DEFLATE_CODE_LEN
);
1639 max_ll_code
= set_huff_codes(ll_codes
, LIT_LEN
, bl_count
);
1641 heap_size
= init_heap32(&heap_space
, d_hist
, DIST_LEN
);
1642 gen_huff_code_lens(&heap_space
, heap_size
, bl_count
, d_codes
,
1643 DIST_LEN
, MAX_DEFLATE_CODE_LEN
);
1644 max_d_code
= set_dist_huff_codes(d_codes
, bl_count
);
1646 assert(max_ll_code
>= 256); // must be EOB code
1647 assert(max_d_code
!= 0);
1649 /* Run length encode the length and distance huffman codes */
1650 memset(cl_counts
, 0, sizeof(cl_counts
));
1652 for (i
= 0; i
<= 256; i
++) {
1653 combined_table
[i
] = ll_codes
[i
].length
;
1654 compressed_len
+= ll_codes
[i
].length
* ll_hist
[i
];
1655 static_compressed_len
+= static_ll_codes
[i
].length
* ll_hist
[i
];
1658 for (; i
< max_ll_code
+ 1; i
++) {
1659 combined_table
[i
] = ll_codes
[i
].length
;
1661 (ll_codes
[i
].length
+ len_code_extra_bits
[i
- 257]) * ll_hist
[i
];
1662 static_compressed_len
+=
1663 (static_ll_codes
[i
].length
+ len_code_extra_bits
[i
- 257]) * ll_hist
[i
];
1666 for (i
= 0; i
< max_d_code
+ 1; i
++) {
1667 combined_table
[i
+ max_ll_code
+ 1] = d_codes
[i
].length
;
1668 compressed_len
+= (d_codes
[i
].length
+ dist_code_extra_bits
[i
]) * d_hist
[i
];
1669 static_compressed_len
+=
1670 (static_d_codes
[i
].length
+ dist_code_extra_bits
[i
]) * d_hist
[i
];
1673 if (static_compressed_len
> compressed_len
) {
1674 num_cl_tokens
= rl_encode(combined_table
, max_ll_code
+ max_d_code
+ 2,
1675 cl_counts
, cl_tokens
);
1678 create_header(bb
, cl_tokens
, num_cl_tokens
, cl_counts
, max_ll_code
- 256,
1679 max_d_code
, end_of_block
);
1680 compressed_len
+= 8 * buffer_used(bb
) + bb
->m_bit_count
;
1683 /* Substitute in static block since it creates smaller block */
1684 if (static_compressed_len
<= compressed_len
) {
1685 memcpy(hufftables
, &static_hufftables
, sizeof(struct hufftables_icf
));
1686 memcpy(bb
, &bb_tmp
, sizeof(struct BitBuf2
));
1687 end_of_block
= end_of_block
? 1 : 0;
1688 write_bits(bb
, 0x2 | end_of_block
, 3);
1689 compressed_len
= static_compressed_len
;
1692 expand_hufftables_icf(hufftables
);
1693 return compressed_len
;