Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(179)

Side by Side Diff: third_party/zlib/deflate.c

Issue 671163003: Revert of Integrate SIMD optimisations for zlib (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/zlib/deflate.h ('k') | third_party/zlib/fill_window_sse.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* deflate.c -- compress data using the deflation algorithm 1 /* deflate.c -- compress data using the deflation algorithm
2 * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler 2 * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
3 * For conditions of distribution and use, see copyright notice in zlib.h 3 * For conditions of distribution and use, see copyright notice in zlib.h
4 */ 4 */
5 5
6 /* 6 /*
7 * ALGORITHM 7 * ALGORITHM
8 * 8 *
9 * The "deflation" process depends on being able to identify portions 9 * The "deflation" process depends on being able to identify portions
10 * of the input text which are identical to earlier input (within a 10 * of the input text which are identical to earlier input (within a
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 * "Algorithms" by R. Sedgewick, Addison-Wesley, p252. 43 * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
44 * 44 *
45 * Fiala,E.R., and Greene,D.H. 45 * Fiala,E.R., and Greene,D.H.
46 * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595 46 * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
47 * 47 *
48 */ 48 */
49 49
50 /* @(#) $Id$ */ 50 /* @(#) $Id$ */
51 51
52 #include "deflate.h" 52 #include "deflate.h"
53 #include "x86.h"
54 53
55 const char deflate_copyright[] = 54 const char deflate_copyright[] =
56 " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; 55 " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler ";
57 /* 56 /*
58 If you use the zlib library in a product, an acknowledgment is welcome 57 If you use the zlib library in a product, an acknowledgment is welcome
59 in the documentation of your product. If for some reason you cannot 58 in the documentation of your product. If for some reason you cannot
60 include such an acknowledgment, I would appreciate that you keep this 59 include such an acknowledgment, I would appreciate that you keep this
61 copyright string in the executable of your product. 60 copyright string in the executable of your product.
62 */ 61 */
63 62
(...skipping 15 matching lines...) Expand all
79 local block_state deflate_stored OF((deflate_state *s, int flush, int clas)); 78 local block_state deflate_stored OF((deflate_state *s, int flush, int clas));
80 local block_state deflate_fast OF((deflate_state *s, int flush, int clas)); 79 local block_state deflate_fast OF((deflate_state *s, int flush, int clas));
81 #ifndef FASTEST 80 #ifndef FASTEST
82 local block_state deflate_slow OF((deflate_state *s, int flush, int clas)); 81 local block_state deflate_slow OF((deflate_state *s, int flush, int clas));
83 #endif 82 #endif
84 local block_state deflate_rle OF((deflate_state *s, int flush)); 83 local block_state deflate_rle OF((deflate_state *s, int flush));
85 local block_state deflate_huff OF((deflate_state *s, int flush)); 84 local block_state deflate_huff OF((deflate_state *s, int flush));
86 local void lm_init OF((deflate_state *s)); 85 local void lm_init OF((deflate_state *s));
87 local void putShortMSB OF((deflate_state *s, uInt b)); 86 local void putShortMSB OF((deflate_state *s, uInt b));
88 local void flush_pending OF((z_streamp strm)); 87 local void flush_pending OF((z_streamp strm));
89 88 local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
90 #ifdef ASMV 89 #ifdef ASMV
91 void match_init OF((void)); /* asm code initialization */ 90 void match_init OF((void)); /* asm code initialization */
92 uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); 91 uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
93 #else 92 #else
94 local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas)); 93 local uInt longest_match OF((deflate_state *s, IPos cur_match, int clas));
95 #endif 94 #endif
96 95
97 #ifdef DEBUG 96 #ifdef DEBUG
98 local void check_match OF((deflate_state *s, IPos start, IPos match, 97 local void check_match OF((deflate_state *s, IPos start, IPos match,
99 int length)); 98 int length));
100 #endif 99 #endif
101 100
102 /* For fill_window_sse.c to use */
103 ZLIB_INTERNAL int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
104
105 /* From crc32.c */
106 extern void ZLIB_INTERNAL crc_reset(deflate_state *const s);
107 extern void ZLIB_INTERNAL crc_finalize(deflate_state *const s);
108 extern void ZLIB_INTERNAL copy_with_crc(z_streamp strm, Bytef *dst, long size);
109
110 /* =========================================================================== 101 /* ===========================================================================
111 * Local data 102 * Local data
112 */ 103 */
113 104
114 #define NIL 0 105 #define NIL 0
115 /* Tail of hash chains */ 106 /* Tail of hash chains */
116 107
117 #ifndef TOO_FAR 108 #ifndef TOO_FAR
118 # define TOO_FAR 4096 109 # define TOO_FAR 4096
119 #endif 110 #endif
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 #endif 157 #endif
167 158
168 /* =========================================================================== 159 /* ===========================================================================
169 * Update a hash value with the given input byte 160 * Update a hash value with the given input byte
170 * IN assertion: all calls to to UPDATE_HASH are made with consecutive 161 * IN assertion: all calls to to UPDATE_HASH are made with consecutive
171 * input characters, so that a running hash key can be computed from the 162 * input characters, so that a running hash key can be computed from the
172 * previous key instead of complete recalculation each time. 163 * previous key instead of complete recalculation each time.
173 */ 164 */
174 #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask) 165 #define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
175 166
176 #ifdef _MSC_VER
177 #define INLINE __inline
178 #else
179 #define INLINE inline
180 #endif
181 167
182 /* =========================================================================== 168 /* ===========================================================================
183 * Insert string str in the dictionary and set match_head to the previous head 169 * Insert string str in the dictionary and set match_head to the previous head
184 * of the hash chain (the most recent string with same hash key). Return 170 * of the hash chain (the most recent string with same hash key). Return
185 * the previous length of the hash chain. 171 * the previous length of the hash chain.
186 * If this file is compiled with -DFASTEST, the compression level is forced 172 * If this file is compiled with -DFASTEST, the compression level is forced
187 * to 1, and no hash chains are maintained. 173 * to 1, and no hash chains are maintained.
188 * IN assertion: all calls to to INSERT_STRING are made with consecutive 174 * IN assertion: all calls to to INSERT_STRING are made with consecutive
189 * input characters and the first MIN_MATCH bytes of str are valid 175 * input characters and the first MIN_MATCH bytes of str are valid
190 * (except for the last MIN_MATCH-1 bytes of the input file). 176 * (except for the last MIN_MATCH-1 bytes of the input file).
191 */ 177 */
192 local INLINE Pos insert_string_c(deflate_state *const s, const Pos str)
193 {
194 Pos ret;
195
196 UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]);
197 #ifdef FASTEST 178 #ifdef FASTEST
198 ret = s->head[s->ins_h]; 179 #define INSERT_STRING(s, str, match_head) \
180 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
181 match_head = s->head[s->ins_h], \
182 s->head[s->ins_h] = (Pos)(str))
199 #else 183 #else
200 ret = s->prev[str & s->w_mask] = s->head[s->ins_h]; 184 #define INSERT_STRING(s, str, match_head) \
185 (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
186 match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
187 s->head[s->ins_h] = (Pos)(str))
201 #endif 188 #endif
202 s->head[s->ins_h] = str;
203
204 return ret;
205 }
206
207 local INLINE Pos insert_string(deflate_state *const s, const Pos str)
208 {
209 if (x86_cpu_enable_simd)
210 return insert_string_sse(s, str);
211 return insert_string_c(s, str);
212 }
213
214 189
215 /* =========================================================================== 190 /* ===========================================================================
216 * Initialize the hash table (avoiding 64K overflow for 16 bit systems). 191 * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
217 * prev[] will be initialized on the fly. 192 * prev[] will be initialized on the fly.
218 */ 193 */
219 #define CLEAR_HASH(s) \ 194 #define CLEAR_HASH(s) \
220 s->head[s->hash_size-1] = NIL; \ 195 s->head[s->hash_size-1] = NIL; \
221 zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head)); 196 zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
222 197
223 /* ========================================================================= */ 198 /* ========================================================================= */
(...skipping 13 matching lines...) Expand all
237 version, stream_size) 212 version, stream_size)
238 z_streamp strm; 213 z_streamp strm;
239 int level; 214 int level;
240 int method; 215 int method;
241 int windowBits; 216 int windowBits;
242 int memLevel; 217 int memLevel;
243 int strategy; 218 int strategy;
244 const char *version; 219 const char *version;
245 int stream_size; 220 int stream_size;
246 { 221 {
247 unsigned window_padding = 8;
248 deflate_state *s; 222 deflate_state *s;
249 int wrap = 1; 223 int wrap = 1;
250 static const char my_version[] = ZLIB_VERSION; 224 static const char my_version[] = ZLIB_VERSION;
251 225
252 ushf *overlay; 226 ushf *overlay;
253 /* We overlay pending_buf and d_buf+l_buf. This works since the average 227 /* We overlay pending_buf and d_buf+l_buf. This works since the average
254 * output size for (length,distance) codes is <= 24 bits. 228 * output size for (length,distance) codes is <= 24 bits.
255 */ 229 */
256 230
257 x86_check_features();
258
259 if (version == Z_NULL || version[0] != my_version[0] || 231 if (version == Z_NULL || version[0] != my_version[0] ||
260 stream_size != sizeof(z_stream)) { 232 stream_size != sizeof(z_stream)) {
261 return Z_VERSION_ERROR; 233 return Z_VERSION_ERROR;
262 } 234 }
263 if (strm == Z_NULL) return Z_STREAM_ERROR; 235 if (strm == Z_NULL) return Z_STREAM_ERROR;
264 236
265 strm->msg = Z_NULL; 237 strm->msg = Z_NULL;
266 if (strm->zalloc == (alloc_func)0) { 238 if (strm->zalloc == (alloc_func)0) {
267 strm->zalloc = zcalloc; 239 strm->zalloc = zcalloc;
268 strm->opaque = (voidpf)0; 240 strm->opaque = (voidpf)0;
(...skipping 26 matching lines...) Expand all
295 if (s == Z_NULL) return Z_MEM_ERROR; 267 if (s == Z_NULL) return Z_MEM_ERROR;
296 strm->state = (struct internal_state FAR *)s; 268 strm->state = (struct internal_state FAR *)s;
297 s->strm = strm; 269 s->strm = strm;
298 270
299 s->wrap = wrap; 271 s->wrap = wrap;
300 s->gzhead = Z_NULL; 272 s->gzhead = Z_NULL;
301 s->w_bits = windowBits; 273 s->w_bits = windowBits;
302 s->w_size = 1 << s->w_bits; 274 s->w_size = 1 << s->w_bits;
303 s->w_mask = s->w_size - 1; 275 s->w_mask = s->w_size - 1;
304 276
305 if (x86_cpu_enable_simd) { 277 s->hash_bits = memLevel + 7;
306 s->hash_bits = 15;
307 } else {
308 s->hash_bits = memLevel + 7;
309 }
310
311 s->hash_size = 1 << s->hash_bits; 278 s->hash_size = 1 << s->hash_bits;
312 s->hash_mask = s->hash_size - 1; 279 s->hash_mask = s->hash_size - 1;
313 s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH); 280 s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
314 281
315 s->window = (Bytef *) ZALLOC(strm, s->w_size + window_padding, 2*sizeof(Byte )); 282 s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
316 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); 283 s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
317 s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); 284 s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
318 s->class_bitmap = NULL; 285 s->class_bitmap = NULL;
319 zmemzero(&s->cookie_locations, sizeof(s->cookie_locations)); 286 zmemzero(&s->cookie_locations, sizeof(s->cookie_locations));
320 strm->clas = 0; 287 strm->clas = 0;
321 288
322 s->high_water = 0; /* nothing written to s->window yet */ 289 s->high_water = 0; /* nothing written to s->window yet */
323 290
324 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ 291 s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
325 292
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 s->strstart = length; 340 s->strstart = length;
374 s->block_start = (long)length; 341 s->block_start = (long)length;
375 342
376 /* Insert all strings in the hash table (except for the last two bytes). 343 /* Insert all strings in the hash table (except for the last two bytes).
377 * s->lookahead stays null, so s->ins_h will be recomputed at the next 344 * s->lookahead stays null, so s->ins_h will be recomputed at the next
378 * call of fill_window. 345 * call of fill_window.
379 */ 346 */
380 s->ins_h = s->window[0]; 347 s->ins_h = s->window[0];
381 UPDATE_HASH(s, s->ins_h, s->window[1]); 348 UPDATE_HASH(s, s->ins_h, s->window[1]);
382 for (n = 0; n <= length - MIN_MATCH; n++) { 349 for (n = 0; n <= length - MIN_MATCH; n++) {
383 insert_string(s, n); 350 INSERT_STRING(s, n, hash_head);
384 } 351 }
385 if (hash_head) hash_head = 0; /* to make compiler happy */ 352 if (hash_head) hash_head = 0; /* to make compiler happy */
386 return Z_OK; 353 return Z_OK;
387 } 354 }
388 355
389 /* ========================================================================= */ 356 /* ========================================================================= */
390 int ZEXPORT deflateReset (strm) 357 int ZEXPORT deflateReset (strm)
391 z_streamp strm; 358 z_streamp strm;
392 { 359 {
393 deflate_state *s; 360 deflate_state *s;
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR); 606 if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
640 607
641 s->strm = strm; /* just in case */ 608 s->strm = strm; /* just in case */
642 old_flush = s->last_flush; 609 old_flush = s->last_flush;
643 s->last_flush = flush; 610 s->last_flush = flush;
644 611
645 /* Write the header */ 612 /* Write the header */
646 if (s->status == INIT_STATE) { 613 if (s->status == INIT_STATE) {
647 #ifdef GZIP 614 #ifdef GZIP
648 if (s->wrap == 2) { 615 if (s->wrap == 2) {
649 crc_reset(s); 616 strm->adler = crc32(0L, Z_NULL, 0);
650 put_byte(s, 31); 617 put_byte(s, 31);
651 put_byte(s, 139); 618 put_byte(s, 139);
652 put_byte(s, 8); 619 put_byte(s, 8);
653 if (s->gzhead == Z_NULL) { 620 if (s->gzhead == Z_NULL) {
654 put_byte(s, 0); 621 put_byte(s, 0);
655 put_byte(s, 0); 622 put_byte(s, 0);
656 put_byte(s, 0); 623 put_byte(s, 0);
657 put_byte(s, 0); 624 put_byte(s, 0);
658 put_byte(s, 0); 625 put_byte(s, 0);
659 put_byte(s, s->level == 9 ? 2 : 626 put_byte(s, s->level == 9 ? 2 :
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
917 } 884 }
918 } 885 }
919 Assert(strm->avail_out > 0, "bug2"); 886 Assert(strm->avail_out > 0, "bug2");
920 887
921 if (flush != Z_FINISH) return Z_OK; 888 if (flush != Z_FINISH) return Z_OK;
922 if (s->wrap <= 0) return Z_STREAM_END; 889 if (s->wrap <= 0) return Z_STREAM_END;
923 890
924 /* Write the trailer */ 891 /* Write the trailer */
925 #ifdef GZIP 892 #ifdef GZIP
926 if (s->wrap == 2) { 893 if (s->wrap == 2) {
927 crc_finalize(s);
928 put_byte(s, (Byte)(strm->adler & 0xff)); 894 put_byte(s, (Byte)(strm->adler & 0xff));
929 put_byte(s, (Byte)((strm->adler >> 8) & 0xff)); 895 put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
930 put_byte(s, (Byte)((strm->adler >> 16) & 0xff)); 896 put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
931 put_byte(s, (Byte)((strm->adler >> 24) & 0xff)); 897 put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
932 put_byte(s, (Byte)(strm->total_in & 0xff)); 898 put_byte(s, (Byte)(strm->total_in & 0xff));
933 put_byte(s, (Byte)((strm->total_in >> 8) & 0xff)); 899 put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
934 put_byte(s, (Byte)((strm->total_in >> 16) & 0xff)); 900 put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
935 put_byte(s, (Byte)((strm->total_in >> 24) & 0xff)); 901 put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
936 } 902 }
937 else 903 else
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1040 #endif /* MAXSEG_64K */ 1006 #endif /* MAXSEG_64K */
1041 } 1007 }
1042 1008
1043 /* =========================================================================== 1009 /* ===========================================================================
1044 * Read a new buffer from the current input stream, update the adler32 1010 * Read a new buffer from the current input stream, update the adler32
1045 * and total number of bytes read. All deflate() input goes through 1011 * and total number of bytes read. All deflate() input goes through
1046 * this function so some applications may wish to modify it to avoid 1012 * this function so some applications may wish to modify it to avoid
1047 * allocating a large strm->next_in buffer and copying from it. 1013 * allocating a large strm->next_in buffer and copying from it.
1048 * (See also flush_pending()). 1014 * (See also flush_pending()).
1049 */ 1015 */
1050 ZLIB_INTERNAL int read_buf(strm, buf, size) 1016 local int read_buf(strm, buf, size)
1051 z_streamp strm; 1017 z_streamp strm;
1052 Bytef *buf; 1018 Bytef *buf;
1053 unsigned size; 1019 unsigned size;
1054 { 1020 {
1055 unsigned len = strm->avail_in; 1021 unsigned len = strm->avail_in;
1056 1022
1057 if (len > size) len = size; 1023 if (len > size) len = size;
1058 if (len == 0) return 0; 1024 if (len == 0) return 0;
1059 1025
1060 strm->avail_in -= len; 1026 strm->avail_in -= len;
1061 1027
1028 if (strm->state->wrap == 1) {
1029 strm->adler = adler32(strm->adler, strm->next_in, len);
1030 }
1062 #ifdef GZIP 1031 #ifdef GZIP
1063 if (strm->state->wrap == 2) { 1032 else if (strm->state->wrap == 2) {
1064 copy_with_crc(strm, buf, len); 1033 strm->adler = crc32(strm->adler, strm->next_in, len);
1065 } 1034 }
1066 else
1067 #endif 1035 #endif
1068 { 1036 zmemcpy(buf, strm->next_in, len);
1069 zmemcpy(buf, strm->next_in, len);
1070 if (strm->state->wrap == 1)
1071 strm->adler = adler32(strm->adler, buf, len);
1072 }
1073 strm->next_in += len; 1037 strm->next_in += len;
1074 strm->total_in += len; 1038 strm->total_in += len;
1075 1039
1076 return (int)len; 1040 return (int)len;
1077 } 1041 }
1078 1042
1079 /* =========================================================================== 1043 /* ===========================================================================
1080 * Initialize the "longest match" routines for a new zlib stream 1044 * Initialize the "longest match" routines for a new zlib stream
1081 */ 1045 */
1082 local void lm_init (s) 1046 local void lm_init (s)
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
1474 /* =========================================================================== 1438 /* ===========================================================================
1475 * Fill the window when the lookahead becomes insufficient. 1439 * Fill the window when the lookahead becomes insufficient.
1476 * Updates strstart and lookahead. 1440 * Updates strstart and lookahead.
1477 * 1441 *
1478 * IN assertion: lookahead < MIN_LOOKAHEAD 1442 * IN assertion: lookahead < MIN_LOOKAHEAD
1479 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD 1443 * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
1480 * At least one byte has been read, or avail_in == 0; reads are 1444 * At least one byte has been read, or avail_in == 0; reads are
1481 * performed for at least two bytes (required for the zip translate_eol 1445 * performed for at least two bytes (required for the zip translate_eol
1482 * option -- not supported here). 1446 * option -- not supported here).
1483 */ 1447 */
1484 local void fill_window_c(deflate_state *s); 1448 local void fill_window(s)
1485
1486 local void fill_window(deflate_state *s)
1487 {
1488 if (x86_cpu_enable_simd) {
1489 fill_window_sse(s);
1490 return;
1491 }
1492
1493 fill_window_c(s);
1494 }
1495
1496 local void fill_window_c(s)
1497 deflate_state *s; 1449 deflate_state *s;
1498 { 1450 {
1499 register unsigned n, m; 1451 register unsigned n, m;
1500 register Posf *p; 1452 register Posf *p;
1501 unsigned more; /* Amount of free space at the end of the window. */ 1453 unsigned more; /* Amount of free space at the end of the window. */
1502 uInt wsize = s->w_size; 1454 uInt wsize = s->w_size;
1503 1455
1504 do { 1456 do {
1505 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart); 1457 more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
1506 1458
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1752 return need_more; 1704 return need_more;
1753 } 1705 }
1754 if (s->lookahead == 0) break; /* flush the current block */ 1706 if (s->lookahead == 0) break; /* flush the current block */
1755 } 1707 }
1756 1708
1757 /* Insert the string window[strstart .. strstart+2] in the 1709 /* Insert the string window[strstart .. strstart+2] in the
1758 * dictionary, and set hash_head to the head of the hash chain: 1710 * dictionary, and set hash_head to the head of the hash chain:
1759 */ 1711 */
1760 hash_head = NIL; 1712 hash_head = NIL;
1761 if (s->lookahead >= MIN_MATCH) { 1713 if (s->lookahead >= MIN_MATCH) {
1762 hash_head = insert_string(s, s->strstart); 1714 INSERT_STRING(s, s->strstart, hash_head);
1763 } 1715 }
1764 1716
1765 /* Find the longest match, discarding those <= prev_length. 1717 /* Find the longest match, discarding those <= prev_length.
1766 * At this point we have always match_length < MIN_MATCH 1718 * At this point we have always match_length < MIN_MATCH
1767 */ 1719 */
1768 if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) { 1720 if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
1769 /* To simplify the code, we prevent matches with the string 1721 /* To simplify the code, we prevent matches with the string
1770 * of window index 0 (in particular we have to avoid a match 1722 * of window index 0 (in particular we have to avoid a match
1771 * of the string with itself at the start of the input file). 1723 * of the string with itself at the start of the input file).
1772 */ 1724 */
(...skipping 10 matching lines...) Expand all
1783 1735
1784 /* Insert new strings in the hash table only if the match length 1736 /* Insert new strings in the hash table only if the match length
1785 * is not too large. This saves time but degrades compression. 1737 * is not too large. This saves time but degrades compression.
1786 */ 1738 */
1787 #ifndef FASTEST 1739 #ifndef FASTEST
1788 if (s->match_length <= s->max_insert_length && 1740 if (s->match_length <= s->max_insert_length &&
1789 s->lookahead >= MIN_MATCH) { 1741 s->lookahead >= MIN_MATCH) {
1790 s->match_length--; /* string at strstart already in table */ 1742 s->match_length--; /* string at strstart already in table */
1791 do { 1743 do {
1792 s->strstart++; 1744 s->strstart++;
1793 hash_head = insert_string(s, s->strstart); 1745 INSERT_STRING(s, s->strstart, hash_head);
1794 /* strstart never exceeds WSIZE-MAX_MATCH, so there are 1746 /* strstart never exceeds WSIZE-MAX_MATCH, so there are
1795 * always MIN_MATCH bytes ahead. 1747 * always MIN_MATCH bytes ahead.
1796 */ 1748 */
1797 } while (--s->match_length != 0); 1749 } while (--s->match_length != 0);
1798 s->strstart++; 1750 s->strstart++;
1799 } else 1751 } else
1800 #endif 1752 #endif
1801 { 1753 {
1802 s->strstart += s->match_length; 1754 s->strstart += s->match_length;
1803 s->match_length = 0; 1755 s->match_length = 0;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
1862 return need_more; 1814 return need_more;
1863 } 1815 }
1864 if (s->lookahead == 0) break; /* flush the current block */ 1816 if (s->lookahead == 0) break; /* flush the current block */
1865 } 1817 }
1866 1818
1867 /* Insert the string window[strstart .. strstart+2] in the 1819 /* Insert the string window[strstart .. strstart+2] in the
1868 * dictionary, and set hash_head to the head of the hash chain: 1820 * dictionary, and set hash_head to the head of the hash chain:
1869 */ 1821 */
1870 hash_head = NIL; 1822 hash_head = NIL;
1871 if (s->lookahead >= MIN_MATCH) { 1823 if (s->lookahead >= MIN_MATCH) {
1872 hash_head = insert_string(s, s->strstart); 1824 INSERT_STRING(s, s->strstart, hash_head);
1873 } 1825 }
1874 1826
1875 /* Find the longest match, discarding those <= prev_length. 1827 /* Find the longest match, discarding those <= prev_length.
1876 */ 1828 */
1877 s->prev_length = s->match_length, s->prev_match = s->match_start; 1829 s->prev_length = s->match_length, s->prev_match = s->match_start;
1878 s->match_length = MIN_MATCH-1; 1830 s->match_length = MIN_MATCH-1;
1879 1831
1880 if (clas == Z_CLASS_COOKIE && first) { 1832 if (clas == Z_CLASS_COOKIE && first) {
1881 s->match_length = cookie_match(s, s->strstart, input_length); 1833 s->match_length = cookie_match(s, s->strstart, input_length);
1882 } else if (clas == Z_CLASS_STANDARD && 1834 } else if (clas == Z_CLASS_STANDARD &&
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
1931 1883
1932 /* Insert in hash table all strings up to the end of the match. 1884 /* Insert in hash table all strings up to the end of the match.
1933 * strstart-1 and strstart are already inserted. If there is not 1885 * strstart-1 and strstart are already inserted. If there is not
1934 * enough lookahead, the last two strings are not inserted in 1886 * enough lookahead, the last two strings are not inserted in
1935 * the hash table. 1887 * the hash table.
1936 */ 1888 */
1937 s->lookahead -= s->prev_length-1; 1889 s->lookahead -= s->prev_length-1;
1938 s->prev_length -= 2; 1890 s->prev_length -= 2;
1939 do { 1891 do {
1940 if (++s->strstart <= max_insert) { 1892 if (++s->strstart <= max_insert) {
1941 hash_head = insert_string(s, s->strstart); 1893 INSERT_STRING(s, s->strstart, hash_head);
1942 } 1894 }
1943 } while (--s->prev_length != 0); 1895 } while (--s->prev_length != 0);
1944 s->match_available = 0; 1896 s->match_available = 0;
1945 s->match_length = MIN_MATCH-1; 1897 s->match_length = MIN_MATCH-1;
1946 s->strstart++; 1898 s->strstart++;
1947 1899
1948 if (bflush) FLUSH_BLOCK(s, 0); 1900 if (bflush) FLUSH_BLOCK(s, 0);
1949 1901
1950 } else if (s->match_available) { 1902 } else if (s->match_available) {
1951 /* If there was no match at the previous position, output a 1903 /* If there was no match at the previous position, output a
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
2072 s->match_length = 0; 2024 s->match_length = 0;
2073 Tracevv((stderr,"%c", s->window[s->strstart])); 2025 Tracevv((stderr,"%c", s->window[s->strstart]));
2074 _tr_tally_lit (s, s->window[s->strstart], bflush); 2026 _tr_tally_lit (s, s->window[s->strstart], bflush);
2075 s->lookahead--; 2027 s->lookahead--;
2076 s->strstart++; 2028 s->strstart++;
2077 if (bflush) FLUSH_BLOCK(s, 0); 2029 if (bflush) FLUSH_BLOCK(s, 0);
2078 } 2030 }
2079 FLUSH_BLOCK(s, flush == Z_FINISH); 2031 FLUSH_BLOCK(s, flush == Z_FINISH);
2080 return flush == Z_FINISH ? finish_done : block_done; 2032 return flush == Z_FINISH ? finish_done : block_done;
2081 } 2033 }
OLDNEW
« no previous file with comments | « third_party/zlib/deflate.h ('k') | third_party/zlib/fill_window_sse.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698