From ccedb4ca449cfa14e54cf82504008ba993c44e52 Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 16 Dec 2016 09:36:51 +0000 Subject: [PATCH] new version 'longest_match' git-svn-id: svn://kolibrios.org@6799 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/fs/kfar/trunk/zlib/deflate.asm | 32 +++++++++++++++---------- programs/fs/kfar/trunk/zlib/deflate.inc | 10 ++++---- programs/fs/kfar/trunk/zlib/trees.asm | 24 +++++++------------ programs/fs/kfar/trunk/zlib/zlib.asm | 2 +- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/programs/fs/kfar/trunk/zlib/deflate.asm b/programs/fs/kfar/trunk/zlib/deflate.asm index 41b2dd6127..dca03326db 100644 --- a/programs/fs/kfar/trunk/zlib/deflate.asm +++ b/programs/fs/kfar/trunk/zlib/deflate.asm @@ -162,8 +162,9 @@ if FASTEST eq 0 push ebx mov ebx,[s+deflate_state.w_mask] and ebx,str + shl ebx,2 add ebx,[s+deflate_state.prev] - mov byte[ebx],al + mov [ebx],eax pop ebx end if mov eax,[s+deflate_state.ins_h] @@ -179,13 +180,13 @@ end if macro CLEAR_HASH s { + ;mov eax,[s+deflate_state.hash_size] + ;dec eax + ;shl eax,2 + ;add eax,[s+deflate_state.head] + ;mov dword[eax],NIL mov eax,[s+deflate_state.hash_size] - dec eax - shl eax,2 - add eax,[s+deflate_state.head] - mov dword[eax],NIL - mov eax,[s+deflate_state.hash_size] - dec eax + ;dec eax shl eax,2 ;sizeof(*s.head) stdcall zmemzero, [s+deflate_state.head], eax } @@ -587,7 +588,6 @@ if GZIP eq 1 end if mov dword[ebx+z_stream.adler],eax mov dword[edi+deflate_state.last_flush],Z_NO_FLUSH - stdcall _tr_init, edi mov eax,Z_OK @@ -1925,6 +1925,8 @@ align 4 sub ecx,edi jz @f repe cmpsb + dec edi + dec esi @@: mov eax,[edx+deflate_state.window_size] @@ -1968,6 +1970,7 @@ align 4 dec dword[chain_length] cmp dword[chain_length],0 jne .cycle0 +align 4 .cycle0end: ;while (..>.. && ..!=0) mov eax,[edx+deflate_state.lookahead] @@ -2281,6 +2284,7 @@ end if jge .cycle0end cmp dword[edx+z_stream.avail_in],0 jne .cycle0 +align 4 .cycle0end: ;while (..<.. && ..!=..) ; If the WIN_INIT bytes after the end of the current data have never been @@ -2405,18 +2409,18 @@ proc deflate_stored uses ebx ecx edi, s:dword, flush:dword ; Stored blocks are limited to 0xffff bytes, pending_buf is limited ; to pending_buf_size, and each stored block has a 5 byte header: mov edi,[s] -zlib_debug 'deflate_stored' + zlib_debug 'deflate_stored' mov ecx,0xffff mov eax,[edi+deflate_state.pending_buf_size] sub eax,5 cmp ecx,eax - jle @f ;if (..>..) + jle .cycle0 ;if (..>..) mov ecx,eax - @@: ;ecx = max_block_size ; Copy as much as possible from input to output: +align 4 .cycle0: ;for (;;) { ; Fill the window as much as possible: cmp dword[edi+deflate_state.lookahead],1 @@ -2435,7 +2439,10 @@ zlib_debug 'deflate_stored' cmp dword[edi+deflate_state.lookahead],0 je .cycle0end ;if (..==0) break ;flush the current block .end0: -; Assert(s->block_start >= 0, "block gone"); + cmp dword[edi+deflate_state.block_start],0 + jge @f + zlib_assert 'block gone' ;Assert(..>=0) + @@: mov eax,[edi+deflate_state.lookahead] add [edi+deflate_state.strstart],eax @@ -2823,6 +2830,7 @@ end if dec dword[edi+deflate_state.lookahead] ;.end4: jmp .cycle0 +align 4 .cycle0end: cmp dword[flush],Z_NO_FLUSH jne @f diff --git a/programs/fs/kfar/trunk/zlib/deflate.inc b/programs/fs/kfar/trunk/zlib/deflate.inc index 2857f724ec..89cee355d1 100644 --- a/programs/fs/kfar/trunk/zlib/deflate.inc +++ b/programs/fs/kfar/trunk/zlib/deflate.inc @@ -46,7 +46,7 @@ FINISH_STATE equ 800 ; Stream status ; Data structure describing a single value and its code string. -struct ct_data ;ct_data_s +struct ct_data fc dw ? ;union ;uint_16 freq ;frequency count ;uint_16 code ;bit string @@ -60,7 +60,7 @@ Code equ ct_data.fc ;.code Dad equ ct_data.dale ;.dad Len equ ct_data.dale ;.len -struct tree_desc ;tree_desc_s +struct tree_desc dyn_tree dd ? ;ct_data * ;the dynamic tree max_code dd ? ;int ;largest code with non zero frequency stat_desc dd ? ;static_tree_desc * ;the corresponding static tree @@ -80,6 +80,7 @@ struct deflate_state ;internal_state gzhead dd ? ;gz_headerp ;gzip header information to write gzindex dd ? ;uInt ;where in extra, name, or comment method db ? ;Byte ;can only be DEFLATED + rb 3 ;for align last_flush dd ? ;int ;value of flush param for previous deflate call ; used by deflate.asm: @@ -171,7 +172,7 @@ struct deflate_state ;internal_state ; The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. ; The same heap array is used to build all trees. - depth rb 2*L_CODES+1 ;uch[] + depth rb ((2*L_CODES+1)+3) and (not 3) ;uch[] ; Depth of each subtree used as tie breaker for trees of equal frequency l_buf dd ? ;uchf * ;buffer for literals or lengths @@ -237,9 +238,6 @@ deflate_state.max_insert_length equ deflate_state.max_lazy_match macro put_byte s, c { -;xor eax,eax -;mov al,c -;zlib_debug '(%d)',eax movzx eax,word[s+deflate_state.pending] add eax,[s+deflate_state.pending_buf] mov byte[eax],c diff --git a/programs/fs/kfar/trunk/zlib/trees.asm b/programs/fs/kfar/trunk/zlib/trees.asm index 04997f765f..7873fc0b9e 100644 --- a/programs/fs/kfar/trunk/zlib/trees.asm +++ b/programs/fs/kfar/trunk/zlib/trees.asm @@ -386,7 +386,7 @@ endp ; Initialize the tree data structures for a new zlib stream. ;void (s) -; deflate_state* s; +; deflate_state* s align 4 proc _tr_init uses eax edi, s:dword mov edi,[s] @@ -425,7 +425,6 @@ endp ; deflate_state* s align 4 proc init_block uses eax ecx edi, s:dword -; int n ;iterates over tree elements mov edi,[s] ; Initialize the trees. @@ -451,8 +450,7 @@ proc init_block uses eax ecx edi, s:dword add eax,sizeof.ct_data loop @b - mov ecx,sizeof.ct_data*END_BLOCK+deflate_state.dyn_ltree+Freq - mov word[ecx+edi],1 + mov word[edi+sizeof.ct_data*END_BLOCK+deflate_state.dyn_ltree+Freq],1 mov dword[edi+deflate_state.static_len],0 mov dword[edi+deflate_state.opt_len],0 mov dword[edi+deflate_state.matches],0 @@ -1357,13 +1355,11 @@ endl mov eax,edi add eax,deflate_state.dyn_ltree stdcall scan_tree, edi, eax, [edi+deflate_state.l_desc.max_code] - mov eax,edi - add eax,deflate_state.dyn_dtree + add eax,deflate_state.dyn_dtree-deflate_state.dyn_ltree stdcall scan_tree, edi, eax, [edi+deflate_state.d_desc.max_code] ; Build the bit length tree: - mov eax,edi - add eax,deflate_state.bl_desc + add eax,deflate_state.bl_desc-deflate_state.dyn_dtree stdcall build_tree, edi, eax ; opt_len now includes the length of the tree representations, except ; the lengths of the bit lengths codes and the 5+5+4 bits for the counts. @@ -1506,7 +1502,7 @@ endp ; Flush the bits in the bit buffer to pending output (leaves at most 7 bits) ;void (s) -; deflate_state* s; +; deflate_state* s align 4 proc _tr_flush_bits, s:dword stdcall bi_flush, [s] @@ -1745,13 +1741,11 @@ proc _tr_tally uses ebx edi, s:dword, dist:dword, lc:dword add eax,LITERALS+1 imul eax,sizeof.ct_data add eax,edi - add eax,deflate_state.dyn_ltree+Freq - inc word[eax] + inc word[eax+deflate_state.dyn_ltree+Freq] d_code [dist] imul eax,sizeof.ct_data add eax,edi - add eax,deflate_state.dyn_dtree+Freq - inc word[eax] + inc word[eax+deflate_state.dyn_dtree+Freq] .end0: if TRUNCATE_BLOCK eq 1 @@ -1795,7 +1789,7 @@ endp ; Send the block data compressed using the given Huffman trees ;void (s, ltree, dtree) -; deflate_state* s; +; deflate_state* s ; ct_data *ltree ;literal tree ; ct_data *dtree ;distance tree align 4 @@ -1952,7 +1946,7 @@ endl .end0: mov ecx,32 mov ebx,edi - add ebx,deflate_state.dyn_ltree+Freq + add ebx,deflate_state.dyn_ltree+Freq+32*sizeof.ct_data .cycle1: cmp ecx,LITERALS jge .cycle1end ;for (..;..<..;..,..) diff --git a/programs/fs/kfar/trunk/zlib/zlib.asm b/programs/fs/kfar/trunk/zlib/zlib.asm index 3fd40204ba..23f637da8a 100644 --- a/programs/fs/kfar/trunk/zlib/zlib.asm +++ b/programs/fs/kfar/trunk/zlib/zlib.asm @@ -3,7 +3,7 @@ include '../../../../proc32.inc' include '../../../../macros.inc' include '../../../../KOSfuncs.inc' -FASTEST equ 1 +FASTEST equ 0 GEN_TREES_H equ 0 DEBUG equ 0 DYNAMIC_CRC_TABLE equ 1