1 /* inffast.c -- fast decoding
2 * Copyright (C) 1995-2017 Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h
12 # pragma message("Assembler code may have bugs -- use at your own risk")
16 Decode literal, length, and distance codes and write out the resulting
17 literal and match bytes until either not enough input or output is
18 available, an end-of-block is encountered, or a data error is encountered.
19 When large enough input and output buffers are supplied to inflate(), for
20 example, a 16K input buffer and a 64K output buffer, more than 95% of the
21 inflate execution time is spent in this routine.
27 strm->avail_out >= 258
28 start >= strm->avail_out
31 On return, state->mode is one of:
33 LEN -- ran out of enough output space or enough available input
34 TYPE -- reached end of block code, inflate() to interpret next block
35 BAD -- error in block data
39 - The maximum input bits used by a length/distance pair is 15 bits for the
40 length code, 5 bits for the length extra, 15 bits for the distance code,
41 and 13 bits for the distance extra. This totals 48 bits, or six bytes.
42 Therefore if strm->avail_in >= 6, then there is enough input to avoid
43 checking for available input while decoding.
45 - The maximum bytes that a single length/distance pair can output is 258
46 bytes, which is the maximum length that can be coded. inflate_fast()
47 requires strm->avail_out >= 258 for each loop to avoid checking for
50 void ZLIB_INTERNAL inflate_fast(z_streamp strm, unsigned start) {
51 struct inflate_state FAR *state;
52 z_const unsigned char FAR *in; /* local strm->next_in */
53 z_const unsigned char FAR *last; /* have enough input while in < last */
54 unsigned char FAR *out; /* local strm->next_out */
55 unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
56 unsigned char FAR *end; /* while out < end, enough space available */
58 unsigned dmax; /* maximum distance from zlib header */
60 unsigned wsize; /* window size or zero if not using window */
61 unsigned whave; /* valid bytes in the window */
62 unsigned wnext; /* window write index */
63 unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
64 unsigned long hold; /* local strm->hold */
65 unsigned bits; /* local strm->bits */
66 code const FAR *lcode; /* local strm->lencode */
67 code const FAR *dcode; /* local strm->distcode */
68 unsigned lmask; /* mask for first level of length codes */
69 unsigned dmask; /* mask for first level of distance codes */
70 code const *here; /* retrieved table entry */
71 unsigned op; /* code bits, operation, extra bits, or */
72 /* window position, window bytes to copy */
73 unsigned len; /* match length, unused bytes */
74 unsigned dist; /* match distance */
75 unsigned char FAR *from; /* where to copy match from */
77 /* copy state to local variables */
78 state = (struct inflate_state FAR *)strm->state;
80 last = in + (strm->avail_in - 5);
82 beg = out - (start - strm->avail_out);
83 end = out + (strm->avail_out - 257);
90 window = state->window;
93 lcode = state->lencode;
94 dcode = state->distcode;
95 lmask = (1U << state->lenbits) - 1;
96 dmask = (1U << state->distbits) - 1;
98 /* decode literals and length/distances until end-of-block or not enough
99 input data or output space */
102 hold += (unsigned long)(*in++) << bits;
104 hold += (unsigned long)(*in++) << bits;
107 here = lcode + (hold & lmask);
109 op = (unsigned)(here->bits);
112 op = (unsigned)(here->op);
113 if (op == 0) { /* literal */
114 Tracevv((stderr, here->val >= 0x20 && here->val < 0x7f ?
115 "inflate: literal '%c'\n" :
116 "inflate: literal 0x%02x\n", here->val));
117 *out++ = (unsigned char)(here->val);
119 else if (op & 16) { /* length base */
120 len = (unsigned)(here->val);
121 op &= 15; /* number of extra bits */
124 hold += (unsigned long)(*in++) << bits;
127 len += (unsigned)hold & ((1U << op) - 1);
131 Tracevv((stderr, "inflate: length %u\n", len));
133 hold += (unsigned long)(*in++) << bits;
135 hold += (unsigned long)(*in++) << bits;
138 here = dcode + (hold & dmask);
140 op = (unsigned)(here->bits);
143 op = (unsigned)(here->op);
144 if (op & 16) { /* distance base */
145 dist = (unsigned)(here->val);
146 op &= 15; /* number of extra bits */
148 hold += (unsigned long)(*in++) << bits;
151 hold += (unsigned long)(*in++) << bits;
155 dist += (unsigned)hold & ((1U << op) - 1);
156 #ifdef INFLATE_STRICT
158 strm->msg = (char *)"invalid distance too far back";
165 Tracevv((stderr, "inflate: distance %u\n", dist));
166 op = (unsigned)(out - beg); /* max distance in output */
167 if (dist > op) { /* see if copy from window */
168 op = dist - op; /* distance back in window */
172 (char *)"invalid distance too far back";
176 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
177 if (len <= op - whave) {
186 } while (--op > whave);
197 if (wnext == 0) { /* very common case */
199 if (op < len) { /* some from window */
204 from = out - dist; /* rest from output */
207 else if (wnext < op) { /* wrap around window */
208 from += wsize + wnext - op;
210 if (op < len) { /* some from end of window */
216 if (wnext < len) { /* some from start of window */
222 from = out - dist; /* rest from output */
226 else { /* contiguous in window */
228 if (op < len) { /* some from window */
233 from = out - dist; /* rest from output */
249 from = out - dist; /* copy direct from output */
250 do { /* minimum length is three */
263 else if ((op & 64) == 0) { /* 2nd level distance code */
264 here = dcode + here->val + (hold & ((1U << op) - 1));
268 strm->msg = (char *)"invalid distance code";
273 else if ((op & 64) == 0) { /* 2nd level length code */
274 here = lcode + here->val + (hold & ((1U << op) - 1));
277 else if (op & 32) { /* end-of-block */
278 Tracevv((stderr, "inflate: end of block\n"));
283 strm->msg = (char *)"invalid literal/length code";
287 } while (in < last && out < end);
289 /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
293 hold &= (1U << bits) - 1;
295 /* update state and return */
297 strm->next_out = out;
298 strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
299 strm->avail_out = (unsigned)(out < end ?
300 257 + (end - out) : 257 - (out - end));
307 inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
308 - Using bit fields for code structure
309 - Different op definition to avoid & for extra bits (do & for table bits)
310 - Three separate decoding do-loops for direct, window, and wnext == 0
311 - Special case for distance > 1 copies to do overlapped load and store copy
312 - Explicit branch predictions (based on measured branch probabilities)
313 - Deferring match copy and interspersed it with decoding subsequent codes
314 - Swapping literal/length else
315 - Swapping window/direct else
316 - Larger unrolled copy loops (three is about right)
317 - Moving len -= 3 statement into middle of loop