~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/lib/zstd/compress/hist.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /lib/zstd/compress/hist.c (Version linux-6.12-rc7) and /lib/zstd/compress/hist.c (Version linux-4.11.12)


  1 /* *******************************************      1 
  2  * hist : Histogram functions                     
  3  * part of Finite State Entropy project           
  4  * Copyright (c) Yann Collet, Facebook, Inc.      
  5  *                                                
  6  *  You can contact the author at :               
  7  *  - FSE source repository : https://github.c    
  8  *  - Public forum : https://groups.google.com    
  9  *                                                
 10  * This source code is licensed under both the    
 11  * LICENSE file in the root directory of this     
 12  * in the COPYING file in the root directory o    
 13  * You may select, at your option, one of the     
 14 **********************************************    
 15                                                   
 16 /* --- dependencies --- */                        
 17 #include "../common/mem.h"             /* U32,    
 18 #include "../common/debug.h"           /* asse    
 19 #include "../common/error_private.h"   /* ERRO    
 20 #include "hist.h"                                 
 21                                                   
 22                                                   
 23 /* --- Error management --- */                    
 24 unsigned HIST_isError(size_t code) { return ER    
 25                                                   
 26 /*-*******************************************    
 27  *  Histogram functions                           
 28  *********************************************    
 29 unsigned HIST_count_simple(unsigned* count, un    
 30                            const void* src, si    
 31 {                                                 
 32     const BYTE* ip = (const BYTE*)src;            
 33     const BYTE* const end = ip + srcSize;         
 34     unsigned maxSymbolValue = *maxSymbolValueP    
 35     unsigned largestCount=0;                      
 36                                                   
 37     ZSTD_memset(count, 0, (maxSymbolValue+1) *    
 38     if (srcSize==0) { *maxSymbolValuePtr = 0;     
 39                                                   
 40     while (ip<end) {                              
 41         assert(*ip <= maxSymbolValue);            
 42         count[*ip++]++;                           
 43     }                                             
 44                                                   
 45     while (!count[maxSymbolValue]) maxSymbolVa    
 46     *maxSymbolValuePtr = maxSymbolValue;          
 47                                                   
 48     {   U32 s;                                    
 49         for (s=0; s<=maxSymbolValue; s++)         
 50             if (count[s] > largestCount) large    
 51     }                                             
 52                                                   
 53     return largestCount;                          
 54 }                                                 
 55                                                   
 56 typedef enum { trustInput, checkMaxSymbolValue    
 57                                                   
 58 /* HIST_count_parallel_wksp() :                   
 59  * store histogram into 4 intermediate tables,    
 60  * this design makes better use of OoO cpus,      
 61  * and is noticeably faster when some values a    
 62  * But it needs some additional workspace for     
 63  * `workSpace` must be a U32 table of size >=     
 64  * @return : largest histogram frequency,         
 65  *           or an error code (notably when hi    
 66 static size_t HIST_count_parallel_wksp(           
 67                                 unsigned* coun    
 68                                 const void* so    
 69                                 HIST_checkInpu    
 70                                 U32* const wor    
 71 {                                                 
 72     const BYTE* ip = (const BYTE*)source;         
 73     const BYTE* const iend = ip+sourceSize;       
 74     size_t const countSize = (*maxSymbolValueP    
 75     unsigned max=0;                               
 76     U32* const Counting1 = workSpace;             
 77     U32* const Counting2 = Counting1 + 256;       
 78     U32* const Counting3 = Counting2 + 256;       
 79     U32* const Counting4 = Counting3 + 256;       
 80                                                   
 81     /* safety checks */                           
 82     assert(*maxSymbolValuePtr <= 255);            
 83     if (!sourceSize) {                            
 84         ZSTD_memset(count, 0, countSize);         
 85         *maxSymbolValuePtr = 0;                   
 86         return 0;                                 
 87     }                                             
 88     ZSTD_memset(workSpace, 0, 4*256*sizeof(uns    
 89                                                   
 90     /* by stripes of 16 bytes */                  
 91     {   U32 cached = MEM_read32(ip); ip += 4;     
 92         while (ip < iend-15) {                    
 93             U32 c = cached; cached = MEM_read3    
 94             Counting1[(BYTE) c     ]++;           
 95             Counting2[(BYTE)(c>>8) ]++;           
 96             Counting3[(BYTE)(c>>16)]++;           
 97             Counting4[       c>>24 ]++;           
 98             c = cached; cached = MEM_read32(ip    
 99             Counting1[(BYTE) c     ]++;           
100             Counting2[(BYTE)(c>>8) ]++;           
101             Counting3[(BYTE)(c>>16)]++;           
102             Counting4[       c>>24 ]++;           
103             c = cached; cached = MEM_read32(ip    
104             Counting1[(BYTE) c     ]++;           
105             Counting2[(BYTE)(c>>8) ]++;           
106             Counting3[(BYTE)(c>>16)]++;           
107             Counting4[       c>>24 ]++;           
108             c = cached; cached = MEM_read32(ip    
109             Counting1[(BYTE) c     ]++;           
110             Counting2[(BYTE)(c>>8) ]++;           
111             Counting3[(BYTE)(c>>16)]++;           
112             Counting4[       c>>24 ]++;           
113         }                                         
114         ip-=4;                                    
115     }                                             
116                                                   
117     /* finish last symbols */                     
118     while (ip<iend) Counting1[*ip++]++;           
119                                                   
120     {   U32 s;                                    
121         for (s=0; s<256; s++) {                   
122             Counting1[s] += Counting2[s] + Cou    
123             if (Counting1[s] > max) max = Coun    
124     }   }                                         
125                                                   
126     {   unsigned maxSymbolValue = 255;            
127         while (!Counting1[maxSymbolValue]) max    
128         if (check && maxSymbolValue > *maxSymb    
129         *maxSymbolValuePtr = maxSymbolValue;      
130         ZSTD_memmove(count, Counting1, countSi    
131     }                                             
132     return (size_t)max;                           
133 }                                                 
134                                                   
135 /* HIST_countFast_wksp() :                        
136  * Same as HIST_countFast(), but using an exte    
137  * `workSpace` is a writable buffer which must    
138  * `workSpaceSize` must be >= HIST_WKSP_SIZE      
139  */                                               
140 size_t HIST_countFast_wksp(unsigned* count, un    
141                           const void* source,     
142                           void* workSpace, siz    
143 {                                                 
144     if (sourceSize < 1500) /* heuristic thresh    
145         return HIST_count_simple(count, maxSym    
146     if ((size_t)workSpace & 3) return ERROR(GE    
147     if (workSpaceSize < HIST_WKSP_SIZE) return    
148     return HIST_count_parallel_wksp(count, max    
149 }                                                 
150                                                   
151 /* HIST_count_wksp() :                            
152  * Same as HIST_count(), but using an external    
153  * `workSpace` size must be table of >= HIST_W    
154 size_t HIST_count_wksp(unsigned* count, unsign    
155                        const void* source, siz    
156                        void* workSpace, size_t    
157 {                                                 
158     if ((size_t)workSpace & 3) return ERROR(GE    
159     if (workSpaceSize < HIST_WKSP_SIZE) return    
160     if (*maxSymbolValuePtr < 255)                 
161         return HIST_count_parallel_wksp(count,    
162     *maxSymbolValuePtr = 255;                     
163     return HIST_countFast_wksp(count, maxSymbo    
164 }                                                 
165                                                   
166                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php