Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/zlib/src/inffast.c

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /externals/zlib/src/inffast.c (Version 11.3.0) and /externals/zlib/src/inffast.c (Version 9.1.p3)


  1 /* inffast.c -- fast decoding                       1 
  2  * Copyright (C) 1995-2017 Mark Adler             
  3  * For conditions of distribution and use, see    
  4  */                                               
  5                                                   
  6 #include "zutil.h"                                
  7 #include "inftrees.h"                             
  8 #include "inflate.h"                              
  9 #include "inffast.h"                              
 10                                                   
 11 #ifdef ASMINF                                     
 12 #  pragma message("Assembler code may have bug    
 13 #else                                             
 14                                                   
 15 /*                                                
 16    Decode literal, length, and distance codes     
 17    literal and match bytes until either not en    
 18    available, an end-of-block is encountered,     
 19    When large enough input and output buffers     
 20    example, a 16K input buffer and a 64K outpu    
 21    inflate execution time is spent in this rou    
 22                                                   
 23    Entry assumptions:                             
 24                                                   
 25         state->mode == LEN                        
 26         strm->avail_in >= 6                       
 27         strm->avail_out >= 258                    
 28         start >= strm->avail_out                  
 29         state->bits < 8                           
 30                                                   
 31    On return, state->mode is one of:              
 32                                                   
 33         LEN -- ran out of enough output space     
 34         TYPE -- reached end of block code, inf    
 35         BAD -- error in block data                
 36                                                   
 37    Notes:                                         
 38                                                   
 39     - The maximum input bits used by a length/    
 40       length code, 5 bits for the length extra    
 41       and 13 bits for the distance extra.  Thi    
 42       Therefore if strm->avail_in >= 6, then t    
 43       checking for available input while decod    
 44                                                   
 45     - The maximum bytes that a single length/d    
 46       bytes, which is the maximum length that     
 47       requires strm->avail_out >= 258 for each    
 48       output space.                               
 49  */                                               
 50 void ZLIB_INTERNAL inflate_fast(strm, start)      
 51 z_streamp strm;                                   
 52 unsigned start;         /* inflate()'s startin    
 53 {                                                 
 54     struct inflate_state FAR *state;              
 55     z_const unsigned char FAR *in;      /* loc    
 56     z_const unsigned char FAR *last;    /* hav    
 57     unsigned char FAR *out;     /* local strm-    
 58     unsigned char FAR *beg;     /* inflate()'s    
 59     unsigned char FAR *end;     /* while out <    
 60 #ifdef INFLATE_STRICT                             
 61     unsigned dmax;              /* maximum dis    
 62 #endif                                            
 63     unsigned wsize;             /* window size    
 64     unsigned whave;             /* valid bytes    
 65     unsigned wnext;             /* window writ    
 66     unsigned char FAR *window;  /* allocated s    
 67     unsigned long hold;         /* local strm-    
 68     unsigned bits;              /* local strm-    
 69     code const FAR *lcode;      /* local strm-    
 70     code const FAR *dcode;      /* local strm-    
 71     unsigned lmask;             /* mask for fi    
 72     unsigned dmask;             /* mask for fi    
 73     code const *here;           /* retrieved t    
 74     unsigned op;                /* code bits,     
 75                                 /*  window pos    
 76     unsigned len;               /* match lengt    
 77     unsigned dist;              /* match dista    
 78     unsigned char FAR *from;    /* where to co    
 79                                                   
 80     /* copy state to local variables */           
 81     state = (struct inflate_state FAR *)strm->    
 82     in = strm->next_in;                           
 83     last = in + (strm->avail_in - 5);             
 84     out = strm->next_out;                         
 85     beg = out - (start - strm->avail_out);        
 86     end = out + (strm->avail_out - 257);          
 87 #ifdef INFLATE_STRICT                             
 88     dmax = state->dmax;                           
 89 #endif                                            
 90     wsize = state->wsize;                         
 91     whave = state->whave;                         
 92     wnext = state->wnext;                         
 93     window = state->window;                       
 94     hold = state->hold;                           
 95     bits = state->bits;                           
 96     lcode = state->lencode;                       
 97     dcode = state->distcode;                      
 98     lmask = (1U << state->lenbits) - 1;           
 99     dmask = (1U << state->distbits) - 1;          
100                                                   
101     /* decode literals and length/distances un    
102        input data or output space */              
103     do {                                          
104         if (bits < 15) {                          
105             hold += (unsigned long)(*in++) <<     
106             bits += 8;                            
107             hold += (unsigned long)(*in++) <<     
108             bits += 8;                            
109         }                                         
110         here = lcode + (hold & lmask);            
111       dolen:                                      
112         op = (unsigned)(here->bits);              
113         hold >>= op;                              
114         bits -= op;                               
115         op = (unsigned)(here->op);                
116         if (op == 0) {                            
117             Tracevv((stderr, here->val >= 0x20    
118                     "inflate:         literal     
119                     "inflate:         literal     
120             *out++ = (unsigned char)(here->val    
121         }                                         
122         else if (op & 16) {                       
123             len = (unsigned)(here->val);          
124             op &= 15;                             
125             if (op) {                             
126                 if (bits < op) {                  
127                     hold += (unsigned long)(*i    
128                     bits += 8;                    
129                 }                                 
130                 len += (unsigned)hold & ((1U <    
131                 hold >>= op;                      
132                 bits -= op;                       
133             }                                     
134             Tracevv((stderr, "inflate:            
135             if (bits < 15) {                      
136                 hold += (unsigned long)(*in++)    
137                 bits += 8;                        
138                 hold += (unsigned long)(*in++)    
139                 bits += 8;                        
140             }                                     
141             here = dcode + (hold & dmask);        
142           dodist:                                 
143             op = (unsigned)(here->bits);          
144             hold >>= op;                          
145             bits -= op;                           
146             op = (unsigned)(here->op);            
147             if (op & 16) {                        
148                 dist = (unsigned)(here->val);     
149                 op &= 15;                         
150                 if (bits < op) {                  
151                     hold += (unsigned long)(*i    
152                     bits += 8;                    
153                     if (bits < op) {              
154                         hold += (unsigned long    
155                         bits += 8;                
156                     }                             
157                 }                                 
158                 dist += (unsigned)hold & ((1U     
159 #ifdef INFLATE_STRICT                             
160                 if (dist > dmax) {                
161                     strm->msg = (char *)"inval    
162                     state->mode = BAD;            
163                     break;                        
164                 }                                 
165 #endif                                            
166                 hold >>= op;                      
167                 bits -= op;                       
168                 Tracevv((stderr, "inflate:        
169                 op = (unsigned)(out - beg);       
170                 if (dist > op) {                  
171                     op = dist - op;               
172                     if (op > whave) {             
173                         if (state->sane) {        
174                             strm->msg =           
175                                 (char *)"inval    
176                             state->mode = BAD;    
177                             break;                
178                         }                         
179 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_A    
180                         if (len <= op - whave)    
181                             do {                  
182                                 *out++ = 0;       
183                             } while (--len);      
184                             continue;             
185                         }                         
186                         len -= op - whave;        
187                         do {                      
188                             *out++ = 0;           
189                         } while (--op > whave)    
190                         if (op == 0) {            
191                             from = out - dist;    
192                             do {                  
193                                 *out++ = *from    
194                             } while (--len);      
195                             continue;             
196                         }                         
197 #endif                                            
198                     }                             
199                     from = window;                
200                     if (wnext == 0) {             
201                         from += wsize - op;       
202                         if (op < len) {           
203                             len -= op;            
204                             do {                  
205                                 *out++ = *from    
206                             } while (--op);       
207                             from = out - dist;    
208                         }                         
209                     }                             
210                     else if (wnext < op) {        
211                         from += wsize + wnext     
212                         op -= wnext;              
213                         if (op < len) {           
214                             len -= op;            
215                             do {                  
216                                 *out++ = *from    
217                             } while (--op);       
218                             from = window;        
219                             if (wnext < len) {    
220                                 op = wnext;       
221                                 len -= op;        
222                                 do {              
223                                     *out++ = *    
224                                 } while (--op)    
225                                 from = out - d    
226                             }                     
227                         }                         
228                     }                             
229                     else {                        
230                         from += wnext - op;       
231                         if (op < len) {           
232                             len -= op;            
233                             do {                  
234                                 *out++ = *from    
235                             } while (--op);       
236                             from = out - dist;    
237                         }                         
238                     }                             
239                     while (len > 2) {             
240                         *out++ = *from++;         
241                         *out++ = *from++;         
242                         *out++ = *from++;         
243                         len -= 3;                 
244                     }                             
245                     if (len) {                    
246                         *out++ = *from++;         
247                         if (len > 1)              
248                             *out++ = *from++;     
249                     }                             
250                 }                                 
251                 else {                            
252                     from = out - dist;            
253                     do {                          
254                         *out++ = *from++;         
255                         *out++ = *from++;         
256                         *out++ = *from++;         
257                         len -= 3;                 
258                     } while (len > 2);            
259                     if (len) {                    
260                         *out++ = *from++;         
261                         if (len > 1)              
262                             *out++ = *from++;     
263                     }                             
264                 }                                 
265             }                                     
266             else if ((op & 64) == 0) {            
267                 here = dcode + here->val + (ho    
268                 goto dodist;                      
269             }                                     
270             else {                                
271                 strm->msg = (char *)"invalid d    
272                 state->mode = BAD;                
273                 break;                            
274             }                                     
275         }                                         
276         else if ((op & 64) == 0) {                
277             here = lcode + here->val + (hold &    
278             goto dolen;                           
279         }                                         
280         else if (op & 32) {                       
281             Tracevv((stderr, "inflate:            
282             state->mode = TYPE;                   
283             break;                                
284         }                                         
285         else {                                    
286             strm->msg = (char *)"invalid liter    
287             state->mode = BAD;                    
288             break;                                
289         }                                         
290     } while (in < last && out < end);             
291                                                   
292     /* return unused bytes (on entry, bits < 8    
293     len = bits >> 3;                              
294     in -= len;                                    
295     bits -= len << 3;                             
296     hold &= (1U << bits) - 1;                     
297                                                   
298     /* update state and return */                 
299     strm->next_in = in;                           
300     strm->next_out = out;                         
301     strm->avail_in = (unsigned)(in < last ? 5     
302     strm->avail_out = (unsigned)(out < end ?      
303                                  257 + (end -     
304     state->hold = hold;                           
305     state->bits = bits;                           
306     return;                                       
307 }                                                 
308                                                   
309 /*                                                
310    inflate_fast() speedups that turned out slo    
311    - Using bit fields for code structure          
312    - Different op definition to avoid & for ex    
313    - Three separate decoding do-loops for dire    
314    - Special case for distance > 1 copies to d    
315    - Explicit branch predictions (based on mea    
316    - Deferring match copy and interspersed it     
317    - Swapping literal/length else                 
318    - Swapping window/direct else                  
319    - Larger unrolled copy loops (three is abou    
320    - Moving len -= 3 statement into middle of     
321  */                                               
322                                                   
323 #endif /* !ASMINF */                              
324