mirror of
https://github.com/boostorg/beast.git
synced 2025-07-29 12:27:44 +02:00
Update zlib from 1.2.11 to 1.2.12
fix #2439 Because there is a CVE issue impact zlib before 1.2.12, update zlib to avoid any related problems. Please check the link below for detailed CVE information: https://access.redhat.com/security/cve/CVE-2018-25032
This commit is contained in:
@ -21,33 +21,39 @@ if (OPENSSL_FOUND)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set (ZLIB_SOURCES
|
set (ZLIB_SOURCES
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/crc32.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/crc32.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/deflate.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/deflate.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffast.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/gzguts.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffixed.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inffast.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inflate.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inffixed.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inftrees.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inflate.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/trees.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inftrees.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zlib.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/trees.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zutil.h
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/zconf.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/adler32.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/zlib.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/compress.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/zutil.h
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/crc32.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/adler32.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/deflate.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/compress.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/infback.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/crc32.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffast.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/deflate.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inflate.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/gzclose.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inftrees.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/gzlib.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/trees.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/gzread.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/uncompr.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/gzwrite.c
|
||||||
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zutil.c
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inflate.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/infback.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inftrees.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/inffast.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/trees.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/uncompr.c
|
||||||
|
${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12/zutil.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library (
|
add_library (
|
||||||
lib-zlib
|
lib-zlib
|
||||||
${ZLIB_SOURCES}
|
${ZLIB_SOURCES}
|
||||||
)
|
)
|
||||||
target_include_directories(lib-zlib PUBLIC "${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11")
|
target_include_directories(lib-zlib PUBLIC "${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.12")
|
||||||
set_property(TARGET lib-zlib PROPERTY FOLDER "static-libs")
|
set_property(TARGET lib-zlib PROPERTY FOLDER "static-libs")
|
||||||
|
|
||||||
set (TEST_MAIN ${PROJECT_SOURCE_DIR}/test/lib_beast.cpp)
|
set (TEST_MAIN ${PROJECT_SOURCE_DIR}/test/lib_beast.cpp)
|
||||||
|
27
test/Jamfile
27
test/Jamfile
@ -32,6 +32,7 @@ project /boost/beast/test
|
|||||||
]
|
]
|
||||||
<include>./extern
|
<include>./extern
|
||||||
<define>BOOST_BEAST_TESTS
|
<define>BOOST_BEAST_TESTS
|
||||||
|
<target-os>darwin:<define>Z_HAVE_UNISTD_H=1
|
||||||
<library>/boost/beast//lib-asio/<link>static
|
<library>/boost/beast//lib-asio/<link>static
|
||||||
<boost.beast.separate-compilation>on:<library>/boost/beast//lib-beast/<link>static
|
<boost.beast.separate-compilation>on:<library>/boost/beast//lib-beast/<link>static
|
||||||
<library>/boost/filesystem//boost_filesystem
|
<library>/boost/filesystem//boost_filesystem
|
||||||
@ -39,17 +40,21 @@ project /boost/beast/test
|
|||||||
;
|
;
|
||||||
|
|
||||||
path-constant ZLIB_SOURCES :
|
path-constant ZLIB_SOURCES :
|
||||||
extern/zlib-1.2.11/adler32.c
|
extern/zlib-1.2.12/adler32.c
|
||||||
extern/zlib-1.2.11/compress.c
|
extern/zlib-1.2.12/compress.c
|
||||||
extern/zlib-1.2.11/crc32.c
|
extern/zlib-1.2.12/crc32.c
|
||||||
extern/zlib-1.2.11/deflate.c
|
extern/zlib-1.2.12/deflate.c
|
||||||
extern/zlib-1.2.11/infback.c
|
extern/zlib-1.2.12/gzclose.c
|
||||||
extern/zlib-1.2.11/inffast.c
|
extern/zlib-1.2.12/gzlib.c
|
||||||
extern/zlib-1.2.11/inflate.c
|
extern/zlib-1.2.12/gzread.c
|
||||||
extern/zlib-1.2.11/inftrees.c
|
extern/zlib-1.2.12/gzwrite.c
|
||||||
extern/zlib-1.2.11/trees.c
|
extern/zlib-1.2.12/inflate.c
|
||||||
extern/zlib-1.2.11/uncompr.c
|
extern/zlib-1.2.12/infback.c
|
||||||
extern/zlib-1.2.11/zutil.c
|
extern/zlib-1.2.12/inftrees.c
|
||||||
|
extern/zlib-1.2.12/inffast.c
|
||||||
|
extern/zlib-1.2.12/trees.c
|
||||||
|
extern/zlib-1.2.12/uncompr.c
|
||||||
|
extern/zlib-1.2.12/zutil.c
|
||||||
;
|
;
|
||||||
|
|
||||||
alias run-tests :
|
alias run-tests :
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
GroupSources (include/boost/beast beast)
|
GroupSources (include/boost/beast beast)
|
||||||
GroupSources (test/extern/zlib-1.2.11 zlib)
|
GroupSources (test/extern/zlib-1.2.12 zlib)
|
||||||
GroupSources (test/beast/zlib "/")
|
GroupSources (test/beast/zlib "/")
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
#include "zlib-1.2.11/zlib.h"
|
#include "zlib-1.2.12/zlib.h"
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <random>
|
#include <random>
|
||||||
|
|
||||||
#include "zlib-1.2.11/zlib.h"
|
#include "zlib-1.2.12/zlib.h"
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
@ -8,5 +8,5 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
// Make sure symbols don't conflict with ZLib
|
// Make sure symbols don't conflict with ZLib
|
||||||
#include "zlib-1.2.11/zlib.h"
|
#include "zlib-1.2.12/zlib.h"
|
||||||
#include <boost/beast/zlib.hpp>
|
#include <boost/beast/zlib.hpp>
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
GroupSources (include/boost/beast beast)
|
GroupSources (include/boost/beast beast)
|
||||||
GroupSources (test/extern/zlib-1.2.11 zlib)
|
GroupSources (test/extern/zlib-1.2.12 zlib)
|
||||||
GroupSources (test/bench/zlib "/")
|
GroupSources (test/bench/zlib "/")
|
||||||
|
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include <random>
|
#include <random>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "zlib-1.2.11/zlib.h"
|
#include "zlib-1.2.12/zlib.h"
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
#include <random>
|
#include <random>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "zlib-1.2.11/zlib.h"
|
#include "zlib-1.2.12/zlib.h"
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace beast {
|
namespace beast {
|
||||||
|
452
test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S
vendored
452
test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S
vendored
@ -1,452 +0,0 @@
|
|||||||
/*
|
|
||||||
* match.S -- optimized version of longest_match()
|
|
||||||
* based on the similar work by Gilles Vollant, and Brian Raiter, written 1998
|
|
||||||
*
|
|
||||||
* This is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the BSD License. Use by owners of Che Guevarra
|
|
||||||
* parafernalia is prohibited, where possible, and highly discouraged
|
|
||||||
* elsewhere.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_UNDERLINE
|
|
||||||
# define match_init _match_init
|
|
||||||
# define longest_match _longest_match
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define scanend ebx
|
|
||||||
#define scanendw bx
|
|
||||||
#define chainlenwmask edx /* high word: current chain len low word: s->wmask */
|
|
||||||
#define curmatch rsi
|
|
||||||
#define curmatchd esi
|
|
||||||
#define windowbestlen r8
|
|
||||||
#define scanalign r9
|
|
||||||
#define scanalignd r9d
|
|
||||||
#define window r10
|
|
||||||
#define bestlen r11
|
|
||||||
#define bestlend r11d
|
|
||||||
#define scanstart r12d
|
|
||||||
#define scanstartw r12w
|
|
||||||
#define scan r13
|
|
||||||
#define nicematch r14d
|
|
||||||
#define limit r15
|
|
||||||
#define limitd r15d
|
|
||||||
#define prev rcx
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The 258 is a "magic number, not a parameter -- changing it
|
|
||||||
* breaks the hell loose
|
|
||||||
*/
|
|
||||||
#define MAX_MATCH (258)
|
|
||||||
#define MIN_MATCH (3)
|
|
||||||
#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
|
|
||||||
#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
|
|
||||||
|
|
||||||
/* stack frame offsets */
|
|
||||||
#define LocalVarsSize (112)
|
|
||||||
#define _chainlenwmask ( 8-LocalVarsSize)(%rsp)
|
|
||||||
#define _windowbestlen (16-LocalVarsSize)(%rsp)
|
|
||||||
#define save_r14 (24-LocalVarsSize)(%rsp)
|
|
||||||
#define save_rsi (32-LocalVarsSize)(%rsp)
|
|
||||||
#define save_rbx (40-LocalVarsSize)(%rsp)
|
|
||||||
#define save_r12 (56-LocalVarsSize)(%rsp)
|
|
||||||
#define save_r13 (64-LocalVarsSize)(%rsp)
|
|
||||||
#define save_r15 (80-LocalVarsSize)(%rsp)
|
|
||||||
|
|
||||||
|
|
||||||
.globl match_init, longest_match
|
|
||||||
|
|
||||||
/*
|
|
||||||
* On AMD64 the first argument of a function (in our case -- the pointer to
|
|
||||||
* deflate_state structure) is passed in %rdi, hence our offsets below are
|
|
||||||
* all off of that.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* you can check the structure offset by running
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "deflate.h"
|
|
||||||
|
|
||||||
void print_depl()
|
|
||||||
{
|
|
||||||
deflate_state ds;
|
|
||||||
deflate_state *s=&ds;
|
|
||||||
printf("size pointer=%u\n",(int)sizeof(void*));
|
|
||||||
|
|
||||||
printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s)));
|
|
||||||
printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s)));
|
|
||||||
printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s)));
|
|
||||||
printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s)));
|
|
||||||
printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s)));
|
|
||||||
printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s)));
|
|
||||||
printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s)));
|
|
||||||
printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s)));
|
|
||||||
printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s)));
|
|
||||||
printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s)));
|
|
||||||
printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s)));
|
|
||||||
printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s)));
|
|
||||||
printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s)));
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
to compile for XCode 3.2 on MacOSX x86_64
|
|
||||||
- run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S"
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE
|
|
||||||
#define dsWSize ( 68)(%rdi)
|
|
||||||
#define dsWMask ( 76)(%rdi)
|
|
||||||
#define dsWindow ( 80)(%rdi)
|
|
||||||
#define dsPrev ( 96)(%rdi)
|
|
||||||
#define dsMatchLen (144)(%rdi)
|
|
||||||
#define dsPrevMatch (148)(%rdi)
|
|
||||||
#define dsStrStart (156)(%rdi)
|
|
||||||
#define dsMatchStart (160)(%rdi)
|
|
||||||
#define dsLookahead (164)(%rdi)
|
|
||||||
#define dsPrevLen (168)(%rdi)
|
|
||||||
#define dsMaxChainLen (172)(%rdi)
|
|
||||||
#define dsGoodMatch (188)(%rdi)
|
|
||||||
#define dsNiceMatch (192)(%rdi)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef STRUCT_OFFSET
|
|
||||||
# define STRUCT_OFFSET (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsStrStart (148 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsLookahead (156 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi)
|
|
||||||
#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
|
|
||||||
|
|
||||||
longest_match:
|
|
||||||
/*
|
|
||||||
* Retrieve the function arguments. %curmatch will hold cur_match
|
|
||||||
* throughout the entire function (passed via rsi on amd64).
|
|
||||||
* rdi will hold the pointer to the deflate_state (first arg on amd64)
|
|
||||||
*/
|
|
||||||
mov %rsi, save_rsi
|
|
||||||
mov %rbx, save_rbx
|
|
||||||
mov %r12, save_r12
|
|
||||||
mov %r13, save_r13
|
|
||||||
mov %r14, save_r14
|
|
||||||
mov %r15, save_r15
|
|
||||||
|
|
||||||
/* uInt wmask = s->w_mask; */
|
|
||||||
/* unsigned chain_length = s->max_chain_length; */
|
|
||||||
/* if (s->prev_length >= s->good_match) { */
|
|
||||||
/* chain_length >>= 2; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
movl dsPrevLen, %eax
|
|
||||||
movl dsGoodMatch, %ebx
|
|
||||||
cmpl %ebx, %eax
|
|
||||||
movl dsWMask, %eax
|
|
||||||
movl dsMaxChainLen, %chainlenwmask
|
|
||||||
jl LastMatchGood
|
|
||||||
shrl $2, %chainlenwmask
|
|
||||||
LastMatchGood:
|
|
||||||
|
|
||||||
/* chainlen is decremented once beforehand so that the function can */
|
|
||||||
/* use the sign flag instead of the zero flag for the exit test. */
|
|
||||||
/* It is then shifted into the high word, to make room for the wmask */
|
|
||||||
/* value, which it will always accompany. */
|
|
||||||
|
|
||||||
decl %chainlenwmask
|
|
||||||
shll $16, %chainlenwmask
|
|
||||||
orl %eax, %chainlenwmask
|
|
||||||
|
|
||||||
/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
|
|
||||||
|
|
||||||
movl dsNiceMatch, %eax
|
|
||||||
movl dsLookahead, %ebx
|
|
||||||
cmpl %eax, %ebx
|
|
||||||
jl LookaheadLess
|
|
||||||
movl %eax, %ebx
|
|
||||||
LookaheadLess: movl %ebx, %nicematch
|
|
||||||
|
|
||||||
/* register Bytef *scan = s->window + s->strstart; */
|
|
||||||
|
|
||||||
mov dsWindow, %window
|
|
||||||
movl dsStrStart, %limitd
|
|
||||||
lea (%limit, %window), %scan
|
|
||||||
|
|
||||||
/* Determine how many bytes the scan ptr is off from being */
|
|
||||||
/* dword-aligned. */
|
|
||||||
|
|
||||||
mov %scan, %scanalign
|
|
||||||
negl %scanalignd
|
|
||||||
andl $3, %scanalignd
|
|
||||||
|
|
||||||
/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
|
|
||||||
/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
|
|
||||||
|
|
||||||
movl dsWSize, %eax
|
|
||||||
subl $MIN_LOOKAHEAD, %eax
|
|
||||||
xorl %ecx, %ecx
|
|
||||||
subl %eax, %limitd
|
|
||||||
cmovng %ecx, %limitd
|
|
||||||
|
|
||||||
/* int best_len = s->prev_length; */
|
|
||||||
|
|
||||||
movl dsPrevLen, %bestlend
|
|
||||||
|
|
||||||
/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */
|
|
||||||
|
|
||||||
lea (%window, %bestlen), %windowbestlen
|
|
||||||
mov %windowbestlen, _windowbestlen
|
|
||||||
|
|
||||||
/* register ush scan_start = *(ushf*)scan; */
|
|
||||||
/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
|
||||||
/* Posf *prev = s->prev; */
|
|
||||||
|
|
||||||
movzwl (%scan), %scanstart
|
|
||||||
movzwl -1(%scan, %bestlen), %scanend
|
|
||||||
mov dsPrev, %prev
|
|
||||||
|
|
||||||
/* Jump into the main loop. */
|
|
||||||
|
|
||||||
movl %chainlenwmask, _chainlenwmask
|
|
||||||
jmp LoopEntry
|
|
||||||
|
|
||||||
.balign 16
|
|
||||||
|
|
||||||
/* do {
|
|
||||||
* match = s->window + cur_match;
|
|
||||||
* if (*(ushf*)(match+best_len-1) != scan_end ||
|
|
||||||
* *(ushf*)match != scan_start) continue;
|
|
||||||
* [...]
|
|
||||||
* } while ((cur_match = prev[cur_match & wmask]) > limit
|
|
||||||
* && --chain_length != 0);
|
|
||||||
*
|
|
||||||
* Here is the inner loop of the function. The function will spend the
|
|
||||||
* majority of its time in this loop, and majority of that time will
|
|
||||||
* be spent in the first ten instructions.
|
|
||||||
*/
|
|
||||||
LookupLoop:
|
|
||||||
andl %chainlenwmask, %curmatchd
|
|
||||||
movzwl (%prev, %curmatch, 2), %curmatchd
|
|
||||||
cmpl %limitd, %curmatchd
|
|
||||||
jbe LeaveNow
|
|
||||||
subl $0x00010000, %chainlenwmask
|
|
||||||
js LeaveNow
|
|
||||||
LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw
|
|
||||||
jne LookupLoop
|
|
||||||
cmpw %scanstartw, (%window, %curmatch)
|
|
||||||
jne LookupLoop
|
|
||||||
|
|
||||||
/* Store the current value of chainlen. */
|
|
||||||
movl %chainlenwmask, _chainlenwmask
|
|
||||||
|
|
||||||
/* %scan is the string under scrutiny, and %prev to the string we */
|
|
||||||
/* are hoping to match it up with. In actuality, %esi and %edi are */
|
|
||||||
/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
|
|
||||||
/* initialized to -(MAX_MATCH_8 - scanalign). */
|
|
||||||
|
|
||||||
mov $(-MAX_MATCH_8), %rdx
|
|
||||||
lea (%curmatch, %window), %windowbestlen
|
|
||||||
lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen
|
|
||||||
lea MAX_MATCH_8(%scan, %scanalign), %prev
|
|
||||||
|
|
||||||
/* the prefetching below makes very little difference... */
|
|
||||||
prefetcht1 (%windowbestlen, %rdx)
|
|
||||||
prefetcht1 (%prev, %rdx)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test the strings for equality, 8 bytes at a time. At the end,
|
|
||||||
* adjust %rdx so that it is offset to the exact byte that mismatched.
|
|
||||||
*
|
|
||||||
* It should be confessed that this loop usually does not represent
|
|
||||||
* much of the total running time. Replacing it with a more
|
|
||||||
* straightforward "rep cmpsb" would not drastically degrade
|
|
||||||
* performance -- unrolling it, for example, makes no difference.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */
|
|
||||||
|
|
||||||
LoopCmps:
|
|
||||||
#ifdef USE_SSE
|
|
||||||
/* Preload the SSE registers */
|
|
||||||
movdqu (%windowbestlen, %rdx), %xmm1
|
|
||||||
movdqu (%prev, %rdx), %xmm2
|
|
||||||
pcmpeqb %xmm2, %xmm1
|
|
||||||
movdqu 16(%windowbestlen, %rdx), %xmm3
|
|
||||||
movdqu 16(%prev, %rdx), %xmm4
|
|
||||||
pcmpeqb %xmm4, %xmm3
|
|
||||||
movdqu 32(%windowbestlen, %rdx), %xmm5
|
|
||||||
movdqu 32(%prev, %rdx), %xmm6
|
|
||||||
pcmpeqb %xmm6, %xmm5
|
|
||||||
movdqu 48(%windowbestlen, %rdx), %xmm7
|
|
||||||
movdqu 48(%prev, %rdx), %xmm8
|
|
||||||
pcmpeqb %xmm8, %xmm7
|
|
||||||
|
|
||||||
/* Check the comparisions' results */
|
|
||||||
pmovmskb %xmm1, %rax
|
|
||||||
notw %ax
|
|
||||||
bsfw %ax, %ax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
/* this is the only iteration of the loop with a possibility of having
|
|
||||||
incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40
|
|
||||||
and (0x40*4)+8=0x108 */
|
|
||||||
add $8, %rdx
|
|
||||||
jz LenMaximum
|
|
||||||
add $8, %rdx
|
|
||||||
|
|
||||||
|
|
||||||
pmovmskb %xmm3, %rax
|
|
||||||
notw %ax
|
|
||||||
bsfw %ax, %ax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
|
|
||||||
add $16, %rdx
|
|
||||||
|
|
||||||
|
|
||||||
pmovmskb %xmm5, %rax
|
|
||||||
notw %ax
|
|
||||||
bsfw %ax, %ax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
add $16, %rdx
|
|
||||||
|
|
||||||
|
|
||||||
pmovmskb %xmm7, %rax
|
|
||||||
notw %ax
|
|
||||||
bsfw %ax, %ax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
add $16, %rdx
|
|
||||||
|
|
||||||
jmp LoopCmps
|
|
||||||
LeaveLoopCmps: add %rax, %rdx
|
|
||||||
#else
|
|
||||||
mov (%windowbestlen, %rdx), %rax
|
|
||||||
xor (%prev, %rdx), %rax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
mov 8(%windowbestlen, %rdx), %rax
|
|
||||||
xor 8(%prev, %rdx), %rax
|
|
||||||
jnz LeaveLoopCmps8
|
|
||||||
|
|
||||||
mov 16(%windowbestlen, %rdx), %rax
|
|
||||||
xor 16(%prev, %rdx), %rax
|
|
||||||
jnz LeaveLoopCmps16
|
|
||||||
|
|
||||||
add $24, %rdx
|
|
||||||
jnz LoopCmps
|
|
||||||
jmp LenMaximum
|
|
||||||
# if 0
|
|
||||||
/*
|
|
||||||
* This three-liner is tantalizingly simple, but bsf is a slow instruction,
|
|
||||||
* and the complicated alternative down below is quite a bit faster. Sad...
|
|
||||||
*/
|
|
||||||
|
|
||||||
LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */
|
|
||||||
shrl $3, %eax /* divide by 8 to get the byte */
|
|
||||||
add %rax, %rdx
|
|
||||||
# else
|
|
||||||
LeaveLoopCmps16:
|
|
||||||
add $8, %rdx
|
|
||||||
LeaveLoopCmps8:
|
|
||||||
add $8, %rdx
|
|
||||||
LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */
|
|
||||||
jnz Check16
|
|
||||||
add $4, %rdx
|
|
||||||
shr $32, %rax
|
|
||||||
Check16: testw $0xFFFF, %ax
|
|
||||||
jnz LenLower
|
|
||||||
add $2, %rdx
|
|
||||||
shrl $16, %eax
|
|
||||||
LenLower: subb $1, %al
|
|
||||||
adc $0, %rdx
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Calculate the length of the match. If it is longer than MAX_MATCH, */
|
|
||||||
/* then automatically accept it as the best possible match and leave. */
|
|
||||||
|
|
||||||
lea (%prev, %rdx), %rax
|
|
||||||
sub %scan, %rax
|
|
||||||
cmpl $MAX_MATCH, %eax
|
|
||||||
jge LenMaximum
|
|
||||||
|
|
||||||
/* If the length of the match is not longer than the best match we */
|
|
||||||
/* have so far, then forget it and return to the lookup loop. */
|
|
||||||
|
|
||||||
cmpl %bestlend, %eax
|
|
||||||
jg LongerMatch
|
|
||||||
mov _windowbestlen, %windowbestlen
|
|
||||||
mov dsPrev, %prev
|
|
||||||
movl _chainlenwmask, %edx
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
/* s->match_start = cur_match; */
|
|
||||||
/* best_len = len; */
|
|
||||||
/* if (len >= nice_match) break; */
|
|
||||||
/* scan_end = *(ushf*)(scan+best_len-1); */
|
|
||||||
|
|
||||||
LongerMatch:
|
|
||||||
movl %eax, %bestlend
|
|
||||||
movl %curmatchd, dsMatchStart
|
|
||||||
cmpl %nicematch, %eax
|
|
||||||
jge LeaveNow
|
|
||||||
|
|
||||||
lea (%window, %bestlen), %windowbestlen
|
|
||||||
mov %windowbestlen, _windowbestlen
|
|
||||||
|
|
||||||
movzwl -1(%scan, %rax), %scanend
|
|
||||||
mov dsPrev, %prev
|
|
||||||
movl _chainlenwmask, %chainlenwmask
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
/* Accept the current string, with the maximum possible length. */
|
|
||||||
|
|
||||||
LenMaximum:
|
|
||||||
movl $MAX_MATCH, %bestlend
|
|
||||||
movl %curmatchd, dsMatchStart
|
|
||||||
|
|
||||||
/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
|
|
||||||
/* return s->lookahead; */
|
|
||||||
|
|
||||||
LeaveNow:
|
|
||||||
movl dsLookahead, %eax
|
|
||||||
cmpl %eax, %bestlend
|
|
||||||
cmovngl %bestlend, %eax
|
|
||||||
LookaheadRet:
|
|
||||||
|
|
||||||
/* Restore the registers and return from whence we came. */
|
|
||||||
|
|
||||||
mov save_rsi, %rsi
|
|
||||||
mov save_rbx, %rbx
|
|
||||||
mov save_r12, %r12
|
|
||||||
mov save_r13, %r13
|
|
||||||
mov save_r14, %r14
|
|
||||||
mov save_r15, %r15
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
match_init: ret
|
|
@ -1,51 +0,0 @@
|
|||||||
This is a patched version of zlib, modified to use
|
|
||||||
Pentium-Pro-optimized assembly code in the deflation algorithm. The
|
|
||||||
files changed/added by this patch are:
|
|
||||||
|
|
||||||
README.686
|
|
||||||
match.S
|
|
||||||
|
|
||||||
The speedup that this patch provides varies, depending on whether the
|
|
||||||
compiler used to build the original version of zlib falls afoul of the
|
|
||||||
PPro's speed traps. My own tests show a speedup of around 10-20% at
|
|
||||||
the default compression level, and 20-30% using -9, against a version
|
|
||||||
compiled using gcc 2.7.2.3. Your mileage may vary.
|
|
||||||
|
|
||||||
Note that this code has been tailored for the PPro/PII in particular,
|
|
||||||
and will not perform particuarly well on a Pentium.
|
|
||||||
|
|
||||||
If you are using an assembler other than GNU as, you will have to
|
|
||||||
translate match.S to use your assembler's syntax. (Have fun.)
|
|
||||||
|
|
||||||
Brian Raiter
|
|
||||||
breadbox@muppetlabs.com
|
|
||||||
April, 1998
|
|
||||||
|
|
||||||
|
|
||||||
Added for zlib 1.1.3:
|
|
||||||
|
|
||||||
The patches come from
|
|
||||||
http://www.muppetlabs.com/~breadbox/software/assembly.html
|
|
||||||
|
|
||||||
To compile zlib with this asm file, copy match.S to the zlib directory
|
|
||||||
then do:
|
|
||||||
|
|
||||||
CFLAGS="-O3 -DASMV" ./configure
|
|
||||||
make OBJA=match.o
|
|
||||||
|
|
||||||
|
|
||||||
Update:
|
|
||||||
|
|
||||||
I've been ignoring these assembly routines for years, believing that
|
|
||||||
gcc's generated code had caught up with it sometime around gcc 2.95
|
|
||||||
and the major rearchitecting of the Pentium 4. However, I recently
|
|
||||||
learned that, despite what I believed, this code still has some life
|
|
||||||
in it. On the Pentium 4 and AMD64 chips, it continues to run about 8%
|
|
||||||
faster than the code produced by gcc 4.1.
|
|
||||||
|
|
||||||
In acknowledgement of its continuing usefulness, I've altered the
|
|
||||||
license to match that of the rest of zlib. Share and Enjoy!
|
|
||||||
|
|
||||||
Brian Raiter
|
|
||||||
breadbox@muppetlabs.com
|
|
||||||
April, 2007
|
|
357
test/extern/zlib-1.2.11/contrib/asm686/match.S
vendored
357
test/extern/zlib-1.2.11/contrib/asm686/match.S
vendored
@ -1,357 +0,0 @@
|
|||||||
/* match.S -- x86 assembly version of the zlib longest_match() function.
|
|
||||||
* Optimized for the Intel 686 chips (PPro and later).
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998, 2007 Brian Raiter <breadbox@muppetlabs.com>
|
|
||||||
*
|
|
||||||
* This software is provided 'as-is', without any express or implied
|
|
||||||
* warranty. In no event will the author be held liable for any damages
|
|
||||||
* arising from the use of this software.
|
|
||||||
*
|
|
||||||
* Permission is granted to anyone to use this software for any purpose,
|
|
||||||
* including commercial applications, and to alter it and redistribute it
|
|
||||||
* freely, subject to the following restrictions:
|
|
||||||
*
|
|
||||||
* 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
* claim that you wrote the original software. If you use this software
|
|
||||||
* in a product, an acknowledgment in the product documentation would be
|
|
||||||
* appreciated but is not required.
|
|
||||||
* 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
* misrepresented as being the original software.
|
|
||||||
* 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef NO_UNDERLINE
|
|
||||||
#define match_init _match_init
|
|
||||||
#define longest_match _longest_match
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MAX_MATCH (258)
|
|
||||||
#define MIN_MATCH (3)
|
|
||||||
#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
|
|
||||||
#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
|
|
||||||
|
|
||||||
/* stack frame offsets */
|
|
||||||
|
|
||||||
#define chainlenwmask 0 /* high word: current chain len */
|
|
||||||
/* low word: s->wmask */
|
|
||||||
#define window 4 /* local copy of s->window */
|
|
||||||
#define windowbestlen 8 /* s->window + bestlen */
|
|
||||||
#define scanstart 16 /* first two bytes of string */
|
|
||||||
#define scanend 12 /* last two bytes of string */
|
|
||||||
#define scanalign 20 /* dword-misalignment of string */
|
|
||||||
#define nicematch 24 /* a good enough match size */
|
|
||||||
#define bestlen 28 /* size of best match so far */
|
|
||||||
#define scan 32 /* ptr to string wanting match */
|
|
||||||
|
|
||||||
#define LocalVarsSize (36)
|
|
||||||
/* saved ebx 36 */
|
|
||||||
/* saved edi 40 */
|
|
||||||
/* saved esi 44 */
|
|
||||||
/* saved ebp 48 */
|
|
||||||
/* return address 52 */
|
|
||||||
#define deflatestate 56 /* the function arguments */
|
|
||||||
#define curmatch 60
|
|
||||||
|
|
||||||
/* All the +zlib1222add offsets are due to the addition of fields
|
|
||||||
* in zlib in the deflate_state structure since the asm code was first written
|
|
||||||
* (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
|
|
||||||
* (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
|
|
||||||
* if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define zlib1222add (8)
|
|
||||||
|
|
||||||
#define dsWSize (36+zlib1222add)
|
|
||||||
#define dsWMask (44+zlib1222add)
|
|
||||||
#define dsWindow (48+zlib1222add)
|
|
||||||
#define dsPrev (56+zlib1222add)
|
|
||||||
#define dsMatchLen (88+zlib1222add)
|
|
||||||
#define dsPrevMatch (92+zlib1222add)
|
|
||||||
#define dsStrStart (100+zlib1222add)
|
|
||||||
#define dsMatchStart (104+zlib1222add)
|
|
||||||
#define dsLookahead (108+zlib1222add)
|
|
||||||
#define dsPrevLen (112+zlib1222add)
|
|
||||||
#define dsMaxChainLen (116+zlib1222add)
|
|
||||||
#define dsGoodMatch (132+zlib1222add)
|
|
||||||
#define dsNiceMatch (136+zlib1222add)
|
|
||||||
|
|
||||||
|
|
||||||
.file "match.S"
|
|
||||||
|
|
||||||
.globl match_init, longest_match
|
|
||||||
|
|
||||||
.text
|
|
||||||
|
|
||||||
/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
|
|
||||||
.cfi_sections .debug_frame
|
|
||||||
|
|
||||||
longest_match:
|
|
||||||
|
|
||||||
.cfi_startproc
|
|
||||||
/* Save registers that the compiler may be using, and adjust %esp to */
|
|
||||||
/* make room for our stack frame. */
|
|
||||||
|
|
||||||
pushl %ebp
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
.cfi_offset ebp, -8
|
|
||||||
pushl %edi
|
|
||||||
.cfi_def_cfa_offset 12
|
|
||||||
pushl %esi
|
|
||||||
.cfi_def_cfa_offset 16
|
|
||||||
pushl %ebx
|
|
||||||
.cfi_def_cfa_offset 20
|
|
||||||
subl $LocalVarsSize, %esp
|
|
||||||
.cfi_def_cfa_offset LocalVarsSize+20
|
|
||||||
|
|
||||||
/* Retrieve the function arguments. %ecx will hold cur_match */
|
|
||||||
/* throughout the entire function. %edx will hold the pointer to the */
|
|
||||||
/* deflate_state structure during the function's setup (before */
|
|
||||||
/* entering the main loop). */
|
|
||||||
|
|
||||||
movl deflatestate(%esp), %edx
|
|
||||||
movl curmatch(%esp), %ecx
|
|
||||||
|
|
||||||
/* uInt wmask = s->w_mask; */
|
|
||||||
/* unsigned chain_length = s->max_chain_length; */
|
|
||||||
/* if (s->prev_length >= s->good_match) { */
|
|
||||||
/* chain_length >>= 2; */
|
|
||||||
/* } */
|
|
||||||
|
|
||||||
movl dsPrevLen(%edx), %eax
|
|
||||||
movl dsGoodMatch(%edx), %ebx
|
|
||||||
cmpl %ebx, %eax
|
|
||||||
movl dsWMask(%edx), %eax
|
|
||||||
movl dsMaxChainLen(%edx), %ebx
|
|
||||||
jl LastMatchGood
|
|
||||||
shrl $2, %ebx
|
|
||||||
LastMatchGood:
|
|
||||||
|
|
||||||
/* chainlen is decremented once beforehand so that the function can */
|
|
||||||
/* use the sign flag instead of the zero flag for the exit test. */
|
|
||||||
/* It is then shifted into the high word, to make room for the wmask */
|
|
||||||
/* value, which it will always accompany. */
|
|
||||||
|
|
||||||
decl %ebx
|
|
||||||
shll $16, %ebx
|
|
||||||
orl %eax, %ebx
|
|
||||||
movl %ebx, chainlenwmask(%esp)
|
|
||||||
|
|
||||||
/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
|
|
||||||
|
|
||||||
movl dsNiceMatch(%edx), %eax
|
|
||||||
movl dsLookahead(%edx), %ebx
|
|
||||||
cmpl %eax, %ebx
|
|
||||||
jl LookaheadLess
|
|
||||||
movl %eax, %ebx
|
|
||||||
LookaheadLess: movl %ebx, nicematch(%esp)
|
|
||||||
|
|
||||||
/* register Bytef *scan = s->window + s->strstart; */
|
|
||||||
|
|
||||||
movl dsWindow(%edx), %esi
|
|
||||||
movl %esi, window(%esp)
|
|
||||||
movl dsStrStart(%edx), %ebp
|
|
||||||
lea (%esi,%ebp), %edi
|
|
||||||
movl %edi, scan(%esp)
|
|
||||||
|
|
||||||
/* Determine how many bytes the scan ptr is off from being */
|
|
||||||
/* dword-aligned. */
|
|
||||||
|
|
||||||
movl %edi, %eax
|
|
||||||
negl %eax
|
|
||||||
andl $3, %eax
|
|
||||||
movl %eax, scanalign(%esp)
|
|
||||||
|
|
||||||
/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
|
|
||||||
/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
|
|
||||||
|
|
||||||
movl dsWSize(%edx), %eax
|
|
||||||
subl $MIN_LOOKAHEAD, %eax
|
|
||||||
subl %eax, %ebp
|
|
||||||
jg LimitPositive
|
|
||||||
xorl %ebp, %ebp
|
|
||||||
LimitPositive:
|
|
||||||
|
|
||||||
/* int best_len = s->prev_length; */
|
|
||||||
|
|
||||||
movl dsPrevLen(%edx), %eax
|
|
||||||
movl %eax, bestlen(%esp)
|
|
||||||
|
|
||||||
/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
|
|
||||||
|
|
||||||
addl %eax, %esi
|
|
||||||
movl %esi, windowbestlen(%esp)
|
|
||||||
|
|
||||||
/* register ush scan_start = *(ushf*)scan; */
|
|
||||||
/* register ush scan_end = *(ushf*)(scan+best_len-1); */
|
|
||||||
/* Posf *prev = s->prev; */
|
|
||||||
|
|
||||||
movzwl (%edi), %ebx
|
|
||||||
movl %ebx, scanstart(%esp)
|
|
||||||
movzwl -1(%edi,%eax), %ebx
|
|
||||||
movl %ebx, scanend(%esp)
|
|
||||||
movl dsPrev(%edx), %edi
|
|
||||||
|
|
||||||
/* Jump into the main loop. */
|
|
||||||
|
|
||||||
movl chainlenwmask(%esp), %edx
|
|
||||||
jmp LoopEntry
|
|
||||||
|
|
||||||
.balign 16
|
|
||||||
|
|
||||||
/* do {
|
|
||||||
* match = s->window + cur_match;
|
|
||||||
* if (*(ushf*)(match+best_len-1) != scan_end ||
|
|
||||||
* *(ushf*)match != scan_start) continue;
|
|
||||||
* [...]
|
|
||||||
* } while ((cur_match = prev[cur_match & wmask]) > limit
|
|
||||||
* && --chain_length != 0);
|
|
||||||
*
|
|
||||||
* Here is the inner loop of the function. The function will spend the
|
|
||||||
* majority of its time in this loop, and majority of that time will
|
|
||||||
* be spent in the first ten instructions.
|
|
||||||
*
|
|
||||||
* Within this loop:
|
|
||||||
* %ebx = scanend
|
|
||||||
* %ecx = curmatch
|
|
||||||
* %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
|
|
||||||
* %esi = windowbestlen - i.e., (window + bestlen)
|
|
||||||
* %edi = prev
|
|
||||||
* %ebp = limit
|
|
||||||
*/
|
|
||||||
LookupLoop:
|
|
||||||
andl %edx, %ecx
|
|
||||||
movzwl (%edi,%ecx,2), %ecx
|
|
||||||
cmpl %ebp, %ecx
|
|
||||||
jbe LeaveNow
|
|
||||||
subl $0x00010000, %edx
|
|
||||||
js LeaveNow
|
|
||||||
LoopEntry: movzwl -1(%esi,%ecx), %eax
|
|
||||||
cmpl %ebx, %eax
|
|
||||||
jnz LookupLoop
|
|
||||||
movl window(%esp), %eax
|
|
||||||
movzwl (%eax,%ecx), %eax
|
|
||||||
cmpl scanstart(%esp), %eax
|
|
||||||
jnz LookupLoop
|
|
||||||
|
|
||||||
/* Store the current value of chainlen. */
|
|
||||||
|
|
||||||
movl %edx, chainlenwmask(%esp)
|
|
||||||
|
|
||||||
/* Point %edi to the string under scrutiny, and %esi to the string we */
|
|
||||||
/* are hoping to match it up with. In actuality, %esi and %edi are */
|
|
||||||
/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
|
|
||||||
/* initialized to -(MAX_MATCH_8 - scanalign). */
|
|
||||||
|
|
||||||
movl window(%esp), %esi
|
|
||||||
movl scan(%esp), %edi
|
|
||||||
addl %ecx, %esi
|
|
||||||
movl scanalign(%esp), %eax
|
|
||||||
movl $(-MAX_MATCH_8), %edx
|
|
||||||
lea MAX_MATCH_8(%edi,%eax), %edi
|
|
||||||
lea MAX_MATCH_8(%esi,%eax), %esi
|
|
||||||
|
|
||||||
/* Test the strings for equality, 8 bytes at a time. At the end,
|
|
||||||
* adjust %edx so that it is offset to the exact byte that mismatched.
|
|
||||||
*
|
|
||||||
* We already know at this point that the first three bytes of the
|
|
||||||
* strings match each other, and they can be safely passed over before
|
|
||||||
* starting the compare loop. So what this code does is skip over 0-3
|
|
||||||
* bytes, as much as necessary in order to dword-align the %edi
|
|
||||||
* pointer. (%esi will still be misaligned three times out of four.)
|
|
||||||
*
|
|
||||||
* It should be confessed that this loop usually does not represent
|
|
||||||
* much of the total running time. Replacing it with a more
|
|
||||||
* straightforward "rep cmpsb" would not drastically degrade
|
|
||||||
* performance.
|
|
||||||
*/
|
|
||||||
LoopCmps:
|
|
||||||
movl (%esi,%edx), %eax
|
|
||||||
xorl (%edi,%edx), %eax
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
movl 4(%esi,%edx), %eax
|
|
||||||
xorl 4(%edi,%edx), %eax
|
|
||||||
jnz LeaveLoopCmps4
|
|
||||||
addl $8, %edx
|
|
||||||
jnz LoopCmps
|
|
||||||
jmp LenMaximum
|
|
||||||
LeaveLoopCmps4: addl $4, %edx
|
|
||||||
LeaveLoopCmps: testl $0x0000FFFF, %eax
|
|
||||||
jnz LenLower
|
|
||||||
addl $2, %edx
|
|
||||||
shrl $16, %eax
|
|
||||||
LenLower: subb $1, %al
|
|
||||||
adcl $0, %edx
|
|
||||||
|
|
||||||
/* Calculate the length of the match. If it is longer than MAX_MATCH, */
|
|
||||||
/* then automatically accept it as the best possible match and leave. */
|
|
||||||
|
|
||||||
lea (%edi,%edx), %eax
|
|
||||||
movl scan(%esp), %edi
|
|
||||||
subl %edi, %eax
|
|
||||||
cmpl $MAX_MATCH, %eax
|
|
||||||
jge LenMaximum
|
|
||||||
|
|
||||||
/* If the length of the match is not longer than the best match we */
|
|
||||||
/* have so far, then forget it and return to the lookup loop. */
|
|
||||||
|
|
||||||
movl deflatestate(%esp), %edx
|
|
||||||
movl bestlen(%esp), %ebx
|
|
||||||
cmpl %ebx, %eax
|
|
||||||
jg LongerMatch
|
|
||||||
movl windowbestlen(%esp), %esi
|
|
||||||
movl dsPrev(%edx), %edi
|
|
||||||
movl scanend(%esp), %ebx
|
|
||||||
movl chainlenwmask(%esp), %edx
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
/* s->match_start = cur_match; */
|
|
||||||
/* best_len = len; */
|
|
||||||
/* if (len >= nice_match) break; */
|
|
||||||
/* scan_end = *(ushf*)(scan+best_len-1); */
|
|
||||||
|
|
||||||
LongerMatch: movl nicematch(%esp), %ebx
|
|
||||||
movl %eax, bestlen(%esp)
|
|
||||||
movl %ecx, dsMatchStart(%edx)
|
|
||||||
cmpl %ebx, %eax
|
|
||||||
jge LeaveNow
|
|
||||||
movl window(%esp), %esi
|
|
||||||
addl %eax, %esi
|
|
||||||
movl %esi, windowbestlen(%esp)
|
|
||||||
movzwl -1(%edi,%eax), %ebx
|
|
||||||
movl dsPrev(%edx), %edi
|
|
||||||
movl %ebx, scanend(%esp)
|
|
||||||
movl chainlenwmask(%esp), %edx
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
/* Accept the current string, with the maximum possible length. */
|
|
||||||
|
|
||||||
LenMaximum: movl deflatestate(%esp), %edx
|
|
||||||
movl $MAX_MATCH, bestlen(%esp)
|
|
||||||
movl %ecx, dsMatchStart(%edx)
|
|
||||||
|
|
||||||
/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
|
|
||||||
/* return s->lookahead; */
|
|
||||||
|
|
||||||
LeaveNow:
|
|
||||||
movl deflatestate(%esp), %edx
|
|
||||||
movl bestlen(%esp), %ebx
|
|
||||||
movl dsLookahead(%edx), %eax
|
|
||||||
cmpl %eax, %ebx
|
|
||||||
jg LookaheadRet
|
|
||||||
movl %ebx, %eax
|
|
||||||
LookaheadRet:
|
|
||||||
|
|
||||||
/* Restore the stack and return from whence we came. */
|
|
||||||
|
|
||||||
addl $LocalVarsSize, %esp
|
|
||||||
.cfi_def_cfa_offset 20
|
|
||||||
popl %ebx
|
|
||||||
.cfi_def_cfa_offset 16
|
|
||||||
popl %esi
|
|
||||||
.cfi_def_cfa_offset 12
|
|
||||||
popl %edi
|
|
||||||
.cfi_def_cfa_offset 8
|
|
||||||
popl %ebp
|
|
||||||
.cfi_def_cfa_offset 4
|
|
||||||
.cfi_endproc
|
|
||||||
match_init: ret
|
|
1157
test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c
vendored
1157
test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c
vendored
File diff suppressed because it is too large
Load Diff
1368
test/extern/zlib-1.2.11/contrib/inflate86/inffast.S
vendored
1368
test/extern/zlib-1.2.11/contrib/inflate86/inffast.S
vendored
File diff suppressed because it is too large
Load Diff
@ -1,2 +0,0 @@
|
|||||||
ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
|
|
||||||
ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
|
|
553
test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm
vendored
553
test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm
vendored
@ -1,553 +0,0 @@
|
|||||||
;uInt longest_match_x64(
|
|
||||||
; deflate_state *s,
|
|
||||||
; IPos cur_match); /* current match */
|
|
||||||
|
|
||||||
; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64
|
|
||||||
; (AMD64 on Athlon 64, Opteron, Phenom
|
|
||||||
; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7)
|
|
||||||
; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
|
|
||||||
;
|
|
||||||
; File written by Gilles Vollant, by converting to assembly the longest_match
|
|
||||||
; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
|
|
||||||
;
|
|
||||||
; and by taking inspiration on asm686 with masm, optimised assembly code
|
|
||||||
; from Brian Raiter, written 1998
|
|
||||||
;
|
|
||||||
; This software is provided 'as-is', without any express or implied
|
|
||||||
; warranty. In no event will the authors be held liable for any damages
|
|
||||||
; arising from the use of this software.
|
|
||||||
;
|
|
||||||
; Permission is granted to anyone to use this software for any purpose,
|
|
||||||
; including commercial applications, and to alter it and redistribute it
|
|
||||||
; freely, subject to the following restrictions:
|
|
||||||
;
|
|
||||||
; 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
; claim that you wrote the original software. If you use this software
|
|
||||||
; in a product, an acknowledgment in the product documentation would be
|
|
||||||
; appreciated but is not required.
|
|
||||||
; 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
; misrepresented as being the original software
|
|
||||||
; 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
;
|
|
||||||
;
|
|
||||||
;
|
|
||||||
; http://www.zlib.net
|
|
||||||
; http://www.winimage.com/zLibDll
|
|
||||||
; http://www.muppetlabs.com/~breadbox/software/assembly.html
|
|
||||||
;
|
|
||||||
; to compile this file for infozip Zip, I use option:
|
|
||||||
; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
|
|
||||||
;
|
|
||||||
; to compile this file for zLib, I use option:
|
|
||||||
; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
|
|
||||||
; Be carrefull to adapt zlib1222add below to your version of zLib
|
|
||||||
; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
|
|
||||||
; value of zlib1222add later)
|
|
||||||
;
|
|
||||||
; This file compile with Microsoft Macro Assembler (x64) for AMD64
|
|
||||||
;
|
|
||||||
; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
|
|
||||||
;
|
|
||||||
; (you can get Windows WDK with ml64 for AMD64 from
|
|
||||||
; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
;uInt longest_match(s, cur_match)
|
|
||||||
; deflate_state *s;
|
|
||||||
; IPos cur_match; /* current match */
|
|
||||||
.code
|
|
||||||
longest_match PROC
|
|
||||||
|
|
||||||
|
|
||||||
;LocalVarsSize equ 88
|
|
||||||
LocalVarsSize equ 72
|
|
||||||
|
|
||||||
; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
|
|
||||||
; free register : r14,r15
|
|
||||||
; register can be saved : rsp
|
|
||||||
|
|
||||||
chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len
|
|
||||||
; low word: s->wmask
|
|
||||||
;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10
|
|
||||||
;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11
|
|
||||||
;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w
|
|
||||||
;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx
|
|
||||||
;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13
|
|
||||||
;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d
|
|
||||||
;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9
|
|
||||||
IFDEF INFOZIP
|
|
||||||
ELSE
|
|
||||||
nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
save_rdi equ rsp + 24 - LocalVarsSize
|
|
||||||
save_rsi equ rsp + 32 - LocalVarsSize
|
|
||||||
save_rbx equ rsp + 40 - LocalVarsSize
|
|
||||||
save_rbp equ rsp + 48 - LocalVarsSize
|
|
||||||
save_r12 equ rsp + 56 - LocalVarsSize
|
|
||||||
save_r13 equ rsp + 64 - LocalVarsSize
|
|
||||||
;save_r14 equ rsp + 72 - LocalVarsSize
|
|
||||||
;save_r15 equ rsp + 80 - LocalVarsSize
|
|
||||||
|
|
||||||
|
|
||||||
; summary of register usage
|
|
||||||
; scanend ebx
|
|
||||||
; scanendw bx
|
|
||||||
; chainlenwmask edx
|
|
||||||
; curmatch rsi
|
|
||||||
; curmatchd esi
|
|
||||||
; windowbestlen r8
|
|
||||||
; scanalign r9
|
|
||||||
; scanalignd r9d
|
|
||||||
; window r10
|
|
||||||
; bestlen r11
|
|
||||||
; bestlend r11d
|
|
||||||
; scanstart r12d
|
|
||||||
; scanstartw r12w
|
|
||||||
; scan r13
|
|
||||||
; nicematch r14d
|
|
||||||
; limit r15
|
|
||||||
; limitd r15d
|
|
||||||
; prev rcx
|
|
||||||
|
|
||||||
; all the +4 offsets are due to the addition of pending_buf_size (in zlib
|
|
||||||
; in the deflate_state structure since the asm code was first written
|
|
||||||
; (if you compile with zlib 1.0.4 or older, remove the +4).
|
|
||||||
; Note : these value are good with a 8 bytes boundary pack structure
|
|
||||||
|
|
||||||
|
|
||||||
MAX_MATCH equ 258
|
|
||||||
MIN_MATCH equ 3
|
|
||||||
MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
|
|
||||||
|
|
||||||
|
|
||||||
;;; Offsets for fields in the deflate_state structure. These numbers
|
|
||||||
;;; are calculated from the definition of deflate_state, with the
|
|
||||||
;;; assumption that the compiler will dword-align the fields. (Thus,
|
|
||||||
;;; changing the definition of deflate_state could easily cause this
|
|
||||||
;;; program to crash horribly, without so much as a warning at
|
|
||||||
;;; compile time. Sigh.)
|
|
||||||
|
|
||||||
; all the +zlib1222add offsets are due to the addition of fields
|
|
||||||
; in zlib in the deflate_state structure since the asm code was first written
|
|
||||||
; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
|
|
||||||
; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
|
|
||||||
; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
|
|
||||||
|
|
||||||
|
|
||||||
IFDEF INFOZIP
|
|
||||||
|
|
||||||
_DATA SEGMENT
|
|
||||||
COMM window_size:DWORD
|
|
||||||
; WMask ; 7fff
|
|
||||||
COMM window:BYTE:010040H
|
|
||||||
COMM prev:WORD:08000H
|
|
||||||
; MatchLen : unused
|
|
||||||
; PrevMatch : unused
|
|
||||||
COMM strstart:DWORD
|
|
||||||
COMM match_start:DWORD
|
|
||||||
; Lookahead : ignore
|
|
||||||
COMM prev_length:DWORD ; PrevLen
|
|
||||||
COMM max_chain_length:DWORD
|
|
||||||
COMM good_match:DWORD
|
|
||||||
COMM nice_match:DWORD
|
|
||||||
prev_ad equ OFFSET prev
|
|
||||||
window_ad equ OFFSET window
|
|
||||||
nicematch equ nice_match
|
|
||||||
_DATA ENDS
|
|
||||||
WMask equ 07fffh
|
|
||||||
|
|
||||||
ELSE
|
|
||||||
|
|
||||||
IFNDEF zlib1222add
|
|
||||||
zlib1222add equ 8
|
|
||||||
ENDIF
|
|
||||||
dsWSize equ 56+zlib1222add+(zlib1222add/2)
|
|
||||||
dsWMask equ 64+zlib1222add+(zlib1222add/2)
|
|
||||||
dsWindow equ 72+zlib1222add
|
|
||||||
dsPrev equ 88+zlib1222add
|
|
||||||
dsMatchLen equ 128+zlib1222add
|
|
||||||
dsPrevMatch equ 132+zlib1222add
|
|
||||||
dsStrStart equ 140+zlib1222add
|
|
||||||
dsMatchStart equ 144+zlib1222add
|
|
||||||
dsLookahead equ 148+zlib1222add
|
|
||||||
dsPrevLen equ 152+zlib1222add
|
|
||||||
dsMaxChainLen equ 156+zlib1222add
|
|
||||||
dsGoodMatch equ 172+zlib1222add
|
|
||||||
dsNiceMatch equ 176+zlib1222add
|
|
||||||
|
|
||||||
window_size equ [ rcx + dsWSize]
|
|
||||||
WMask equ [ rcx + dsWMask]
|
|
||||||
window_ad equ [ rcx + dsWindow]
|
|
||||||
prev_ad equ [ rcx + dsPrev]
|
|
||||||
strstart equ [ rcx + dsStrStart]
|
|
||||||
match_start equ [ rcx + dsMatchStart]
|
|
||||||
Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
|
|
||||||
prev_length equ [ rcx + dsPrevLen]
|
|
||||||
max_chain_length equ [ rcx + dsMaxChainLen]
|
|
||||||
good_match equ [ rcx + dsGoodMatch]
|
|
||||||
nice_match equ [ rcx + dsNiceMatch]
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
|
|
||||||
|
|
||||||
; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
|
|
||||||
; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
|
|
||||||
;
|
|
||||||
; All registers must be preserved across the call, except for
|
|
||||||
; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;;; Save registers that the compiler may be using, and adjust esp to
|
|
||||||
;;; make room for our stack frame.
|
|
||||||
|
|
||||||
|
|
||||||
;;; Retrieve the function arguments. r8d will hold cur_match
|
|
||||||
;;; throughout the entire function. edx will hold the pointer to the
|
|
||||||
;;; deflate_state structure during the function's setup (before
|
|
||||||
;;; entering the main loop.
|
|
||||||
|
|
||||||
; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
|
|
||||||
|
|
||||||
; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
|
|
||||||
|
|
||||||
mov [save_rdi],rdi
|
|
||||||
mov [save_rsi],rsi
|
|
||||||
mov [save_rbx],rbx
|
|
||||||
mov [save_rbp],rbp
|
|
||||||
IFDEF INFOZIP
|
|
||||||
mov r8d,ecx
|
|
||||||
ELSE
|
|
||||||
mov r8d,edx
|
|
||||||
ENDIF
|
|
||||||
mov [save_r12],r12
|
|
||||||
mov [save_r13],r13
|
|
||||||
; mov [save_r14],r14
|
|
||||||
; mov [save_r15],r15
|
|
||||||
|
|
||||||
|
|
||||||
;;; uInt wmask = s->w_mask;
|
|
||||||
;;; unsigned chain_length = s->max_chain_length;
|
|
||||||
;;; if (s->prev_length >= s->good_match) {
|
|
||||||
;;; chain_length >>= 2;
|
|
||||||
;;; }
|
|
||||||
|
|
||||||
mov edi, prev_length
|
|
||||||
mov esi, good_match
|
|
||||||
mov eax, WMask
|
|
||||||
mov ebx, max_chain_length
|
|
||||||
cmp edi, esi
|
|
||||||
jl LastMatchGood
|
|
||||||
shr ebx, 2
|
|
||||||
LastMatchGood:
|
|
||||||
|
|
||||||
;;; chainlen is decremented once beforehand so that the function can
|
|
||||||
;;; use the sign flag instead of the zero flag for the exit test.
|
|
||||||
;;; It is then shifted into the high word, to make room for the wmask
|
|
||||||
;;; value, which it will always accompany.
|
|
||||||
|
|
||||||
dec ebx
|
|
||||||
shl ebx, 16
|
|
||||||
or ebx, eax
|
|
||||||
|
|
||||||
;;; on zlib only
|
|
||||||
;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
|
|
||||||
|
|
||||||
IFDEF INFOZIP
|
|
||||||
mov [chainlenwmask], ebx
|
|
||||||
; on infozip nice_match = [nice_match]
|
|
||||||
ELSE
|
|
||||||
mov eax, nice_match
|
|
||||||
mov [chainlenwmask], ebx
|
|
||||||
mov r10d, Lookahead
|
|
||||||
cmp r10d, eax
|
|
||||||
cmovnl r10d, eax
|
|
||||||
mov [nicematch],r10d
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
;;; register Bytef *scan = s->window + s->strstart;
|
|
||||||
mov r10, window_ad
|
|
||||||
mov ebp, strstart
|
|
||||||
lea r13, [r10 + rbp]
|
|
||||||
|
|
||||||
;;; Determine how many bytes the scan ptr is off from being
|
|
||||||
;;; dword-aligned.
|
|
||||||
|
|
||||||
mov r9,r13
|
|
||||||
neg r13
|
|
||||||
and r13,3
|
|
||||||
|
|
||||||
;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
|
|
||||||
;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
|
|
||||||
IFDEF INFOZIP
|
|
||||||
mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
|
|
||||||
ELSE
|
|
||||||
mov eax, window_size
|
|
||||||
sub eax, MIN_LOOKAHEAD
|
|
||||||
ENDIF
|
|
||||||
xor edi,edi
|
|
||||||
sub ebp, eax
|
|
||||||
|
|
||||||
mov r11d, prev_length
|
|
||||||
|
|
||||||
cmovng ebp,edi
|
|
||||||
|
|
||||||
;;; int best_len = s->prev_length;
|
|
||||||
|
|
||||||
|
|
||||||
;;; Store the sum of s->window + best_len in esi locally, and in esi.
|
|
||||||
|
|
||||||
lea rsi,[r10+r11]
|
|
||||||
|
|
||||||
;;; register ush scan_start = *(ushf*)scan;
|
|
||||||
;;; register ush scan_end = *(ushf*)(scan+best_len-1);
|
|
||||||
;;; Posf *prev = s->prev;
|
|
||||||
|
|
||||||
movzx r12d,word ptr [r9]
|
|
||||||
movzx ebx, word ptr [r9 + r11 - 1]
|
|
||||||
|
|
||||||
mov rdi, prev_ad
|
|
||||||
|
|
||||||
;;; Jump into the main loop.
|
|
||||||
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
|
|
||||||
cmp bx,word ptr [rsi + r8 - 1]
|
|
||||||
jz LookupLoopIsZero
|
|
||||||
|
|
||||||
LookupLoop1:
|
|
||||||
and r8d, edx
|
|
||||||
|
|
||||||
movzx r8d, word ptr [rdi + r8*2]
|
|
||||||
cmp r8d, ebp
|
|
||||||
jbe LeaveNow
|
|
||||||
sub edx, 00010000h
|
|
||||||
js LeaveNow
|
|
||||||
|
|
||||||
LoopEntry1:
|
|
||||||
cmp bx,word ptr [rsi + r8 - 1]
|
|
||||||
jz LookupLoopIsZero
|
|
||||||
|
|
||||||
LookupLoop2:
|
|
||||||
and r8d, edx
|
|
||||||
|
|
||||||
movzx r8d, word ptr [rdi + r8*2]
|
|
||||||
cmp r8d, ebp
|
|
||||||
jbe LeaveNow
|
|
||||||
sub edx, 00010000h
|
|
||||||
js LeaveNow
|
|
||||||
|
|
||||||
LoopEntry2:
|
|
||||||
cmp bx,word ptr [rsi + r8 - 1]
|
|
||||||
jz LookupLoopIsZero
|
|
||||||
|
|
||||||
LookupLoop4:
|
|
||||||
and r8d, edx
|
|
||||||
|
|
||||||
movzx r8d, word ptr [rdi + r8*2]
|
|
||||||
cmp r8d, ebp
|
|
||||||
jbe LeaveNow
|
|
||||||
sub edx, 00010000h
|
|
||||||
js LeaveNow
|
|
||||||
|
|
||||||
LoopEntry4:
|
|
||||||
|
|
||||||
cmp bx,word ptr [rsi + r8 - 1]
|
|
||||||
jnz LookupLoop1
|
|
||||||
jmp LookupLoopIsZero
|
|
||||||
|
|
||||||
|
|
||||||
;;; do {
|
|
||||||
;;; match = s->window + cur_match;
|
|
||||||
;;; if (*(ushf*)(match+best_len-1) != scan_end ||
|
|
||||||
;;; *(ushf*)match != scan_start) continue;
|
|
||||||
;;; [...]
|
|
||||||
;;; } while ((cur_match = prev[cur_match & wmask]) > limit
|
|
||||||
;;; && --chain_length != 0);
|
|
||||||
;;;
|
|
||||||
;;; Here is the inner loop of the function. The function will spend the
|
|
||||||
;;; majority of its time in this loop, and majority of that time will
|
|
||||||
;;; be spent in the first ten instructions.
|
|
||||||
;;;
|
|
||||||
;;; Within this loop:
|
|
||||||
;;; ebx = scanend
|
|
||||||
;;; r8d = curmatch
|
|
||||||
;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
|
|
||||||
;;; esi = windowbestlen - i.e., (window + bestlen)
|
|
||||||
;;; edi = prev
|
|
||||||
;;; ebp = limit
|
|
||||||
|
|
||||||
LookupLoop:
|
|
||||||
and r8d, edx
|
|
||||||
|
|
||||||
movzx r8d, word ptr [rdi + r8*2]
|
|
||||||
cmp r8d, ebp
|
|
||||||
jbe LeaveNow
|
|
||||||
sub edx, 00010000h
|
|
||||||
js LeaveNow
|
|
||||||
|
|
||||||
LoopEntry:
|
|
||||||
|
|
||||||
cmp bx,word ptr [rsi + r8 - 1]
|
|
||||||
jnz LookupLoop1
|
|
||||||
LookupLoopIsZero:
|
|
||||||
cmp r12w, word ptr [r10 + r8]
|
|
||||||
jnz LookupLoop1
|
|
||||||
|
|
||||||
|
|
||||||
;;; Store the current value of chainlen.
|
|
||||||
mov [chainlenwmask], edx
|
|
||||||
|
|
||||||
;;; Point edi to the string under scrutiny, and esi to the string we
|
|
||||||
;;; are hoping to match it up with. In actuality, esi and edi are
|
|
||||||
;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
|
|
||||||
;;; initialized to -(MAX_MATCH_8 - scanalign).
|
|
||||||
|
|
||||||
lea rsi,[r8+r10]
|
|
||||||
mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8)
|
|
||||||
lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8]
|
|
||||||
lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8]
|
|
||||||
|
|
||||||
prefetcht1 [rsi+rdx]
|
|
||||||
prefetcht1 [rdi+rdx]
|
|
||||||
|
|
||||||
|
|
||||||
;;; Test the strings for equality, 8 bytes at a time. At the end,
|
|
||||||
;;; adjust rdx so that it is offset to the exact byte that mismatched.
|
|
||||||
;;;
|
|
||||||
;;; We already know at this point that the first three bytes of the
|
|
||||||
;;; strings match each other, and they can be safely passed over before
|
|
||||||
;;; starting the compare loop. So what this code does is skip over 0-3
|
|
||||||
;;; bytes, as much as necessary in order to dword-align the edi
|
|
||||||
;;; pointer. (rsi will still be misaligned three times out of four.)
|
|
||||||
;;;
|
|
||||||
;;; It should be confessed that this loop usually does not represent
|
|
||||||
;;; much of the total running time. Replacing it with a more
|
|
||||||
;;; straightforward "rep cmpsb" would not drastically degrade
|
|
||||||
;;; performance.
|
|
||||||
|
|
||||||
|
|
||||||
LoopCmps:
|
|
||||||
mov rax, [rsi + rdx]
|
|
||||||
xor rax, [rdi + rdx]
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
|
|
||||||
mov rax, [rsi + rdx + 8]
|
|
||||||
xor rax, [rdi + rdx + 8]
|
|
||||||
jnz LeaveLoopCmps8
|
|
||||||
|
|
||||||
|
|
||||||
mov rax, [rsi + rdx + 8+8]
|
|
||||||
xor rax, [rdi + rdx + 8+8]
|
|
||||||
jnz LeaveLoopCmps16
|
|
||||||
|
|
||||||
add rdx,8+8+8
|
|
||||||
|
|
||||||
jnz short LoopCmps
|
|
||||||
jmp short LenMaximum
|
|
||||||
LeaveLoopCmps16: add rdx,8
|
|
||||||
LeaveLoopCmps8: add rdx,8
|
|
||||||
LeaveLoopCmps:
|
|
||||||
|
|
||||||
test eax, 0000FFFFh
|
|
||||||
jnz LenLower
|
|
||||||
|
|
||||||
test eax,0ffffffffh
|
|
||||||
|
|
||||||
jnz LenLower32
|
|
||||||
|
|
||||||
add rdx,4
|
|
||||||
shr rax,32
|
|
||||||
or ax,ax
|
|
||||||
jnz LenLower
|
|
||||||
|
|
||||||
LenLower32:
|
|
||||||
shr eax,16
|
|
||||||
add rdx,2
|
|
||||||
LenLower: sub al, 1
|
|
||||||
adc rdx, 0
|
|
||||||
;;; Calculate the length of the match. If it is longer than MAX_MATCH,
|
|
||||||
;;; then automatically accept it as the best possible match and leave.
|
|
||||||
|
|
||||||
lea rax, [rdi + rdx]
|
|
||||||
sub rax, r9
|
|
||||||
cmp eax, MAX_MATCH
|
|
||||||
jge LenMaximum
|
|
||||||
|
|
||||||
;;; If the length of the match is not longer than the best match we
|
|
||||||
;;; have so far, then forget it and return to the lookup loop.
|
|
||||||
;///////////////////////////////////
|
|
||||||
|
|
||||||
cmp eax, r11d
|
|
||||||
jg LongerMatch
|
|
||||||
|
|
||||||
lea rsi,[r10+r11]
|
|
||||||
|
|
||||||
mov rdi, prev_ad
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
;;; s->match_start = cur_match;
|
|
||||||
;;; best_len = len;
|
|
||||||
;;; if (len >= nice_match) break;
|
|
||||||
;;; scan_end = *(ushf*)(scan+best_len-1);
|
|
||||||
|
|
||||||
LongerMatch:
|
|
||||||
mov r11d, eax
|
|
||||||
mov match_start, r8d
|
|
||||||
cmp eax, [nicematch]
|
|
||||||
jge LeaveNow
|
|
||||||
|
|
||||||
lea rsi,[r10+rax]
|
|
||||||
|
|
||||||
movzx ebx, word ptr [r9 + rax - 1]
|
|
||||||
mov rdi, prev_ad
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
;;; Accept the current string, with the maximum possible length.
|
|
||||||
|
|
||||||
LenMaximum:
|
|
||||||
mov r11d,MAX_MATCH
|
|
||||||
mov match_start, r8d
|
|
||||||
|
|
||||||
;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
|
|
||||||
;;; return s->lookahead;
|
|
||||||
|
|
||||||
LeaveNow:
|
|
||||||
IFDEF INFOZIP
|
|
||||||
mov eax,r11d
|
|
||||||
ELSE
|
|
||||||
mov eax, Lookahead
|
|
||||||
cmp r11d, eax
|
|
||||||
cmovng eax, r11d
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
;;; Restore the stack and return from whence we came.
|
|
||||||
|
|
||||||
|
|
||||||
mov rsi,[save_rsi]
|
|
||||||
mov rdi,[save_rdi]
|
|
||||||
mov rbx,[save_rbx]
|
|
||||||
mov rbp,[save_rbp]
|
|
||||||
mov r12,[save_r12]
|
|
||||||
mov r13,[save_r13]
|
|
||||||
; mov r14,[save_r14]
|
|
||||||
; mov r15,[save_r15]
|
|
||||||
|
|
||||||
|
|
||||||
ret 0
|
|
||||||
; please don't remove this string !
|
|
||||||
; Your can freely use gvmat64 in any free or commercial app
|
|
||||||
; but it is far better don't remove the string in the binary!
|
|
||||||
db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
|
|
||||||
longest_match ENDP
|
|
||||||
|
|
||||||
match_init PROC
|
|
||||||
ret 0
|
|
||||||
match_init ENDP
|
|
||||||
|
|
||||||
|
|
||||||
END
|
|
186
test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c
vendored
186
test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c
vendored
@ -1,186 +0,0 @@
|
|||||||
/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding
|
|
||||||
* version for AMD64 on Windows using Microsoft C compiler
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995-2003 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 2003 Chris Anderson <christop@charm.net>
|
|
||||||
* Please use the copyright conditions above.
|
|
||||||
*
|
|
||||||
* 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant
|
|
||||||
*
|
|
||||||
* inffas8664.c call function inffas8664fnc in inffasx64.asm
|
|
||||||
* inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
|
|
||||||
*
|
|
||||||
* Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
|
|
||||||
* slightly quicker on x86 systems because, instead of using rep movsb to copy
|
|
||||||
* data, it uses rep movsw, which moves data in 2-byte chunks instead of single
|
|
||||||
* bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
|
|
||||||
* from http://fedora.linux.duke.edu/fc1_x86_64
|
|
||||||
* which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
|
|
||||||
* 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
|
|
||||||
* when decompressing mozilla-source-1.3.tar.gz.
|
|
||||||
*
|
|
||||||
* Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
|
|
||||||
* the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
|
|
||||||
* the moment. I have successfully compiled and tested this code with gcc2.96,
|
|
||||||
* gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
|
|
||||||
* compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
|
|
||||||
* enabled. I will attempt to merge the MMX code into this version. Newer
|
|
||||||
* versions of this and inffast.S can be found at
|
|
||||||
* http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "zutil.h"
|
|
||||||
#include "inftrees.h"
|
|
||||||
#include "inflate.h"
|
|
||||||
#include "inffast.h"
|
|
||||||
|
|
||||||
/* Mark Adler's comments from inffast.c: */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Decode literal, length, and distance codes and write out the resulting
|
|
||||||
literal and match bytes until either not enough input or output is
|
|
||||||
available, an end-of-block is encountered, or a data error is encountered.
|
|
||||||
When large enough input and output buffers are supplied to inflate(), for
|
|
||||||
example, a 16K input buffer and a 64K output buffer, more than 95% of the
|
|
||||||
inflate execution time is spent in this routine.
|
|
||||||
|
|
||||||
Entry assumptions:
|
|
||||||
|
|
||||||
state->mode == LEN
|
|
||||||
strm->avail_in >= 6
|
|
||||||
strm->avail_out >= 258
|
|
||||||
start >= strm->avail_out
|
|
||||||
state->bits < 8
|
|
||||||
|
|
||||||
On return, state->mode is one of:
|
|
||||||
|
|
||||||
LEN -- ran out of enough output space or enough available input
|
|
||||||
TYPE -- reached end of block code, inflate() to interpret next block
|
|
||||||
BAD -- error in block data
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
|
|
||||||
- The maximum input bits used by a length/distance pair is 15 bits for the
|
|
||||||
length code, 5 bits for the length extra, 15 bits for the distance code,
|
|
||||||
and 13 bits for the distance extra. This totals 48 bits, or six bytes.
|
|
||||||
Therefore if strm->avail_in >= 6, then there is enough input to avoid
|
|
||||||
checking for available input while decoding.
|
|
||||||
|
|
||||||
- The maximum bytes that a single length/distance pair can output is 258
|
|
||||||
bytes, which is the maximum length that can be coded. inflate_fast()
|
|
||||||
requires strm->avail_out >= 258 for each loop to avoid checking for
|
|
||||||
output space.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct inffast_ar {
|
|
||||||
/* 64 32 x86 x86_64 */
|
|
||||||
/* ar offset register */
|
|
||||||
/* 0 0 */ void *esp; /* esp save */
|
|
||||||
/* 8 4 */ void *ebp; /* ebp save */
|
|
||||||
/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
|
|
||||||
/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
|
|
||||||
/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
|
|
||||||
/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
|
|
||||||
/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
|
|
||||||
/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
|
|
||||||
/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
|
|
||||||
/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
|
|
||||||
/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */
|
|
||||||
/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
|
|
||||||
/* 92 48 */ unsigned wsize; /* window size */
|
|
||||||
/* 96 52 */ unsigned write; /* window write index */
|
|
||||||
/*100 56 */ unsigned lmask; /* r12 mask for lcode */
|
|
||||||
/*104 60 */ unsigned dmask; /* r13 mask for dcode */
|
|
||||||
/*108 64 */ unsigned len; /* r14 match length */
|
|
||||||
/*112 68 */ unsigned dist; /* r15 match distance */
|
|
||||||
/*116 72 */ unsigned status; /* set when state chng*/
|
|
||||||
} type_ar;
|
|
||||||
#ifdef ASMINF
|
|
||||||
|
|
||||||
void inflate_fast(strm, start)
|
|
||||||
z_streamp strm;
|
|
||||||
unsigned start; /* inflate()'s starting value for strm->avail_out */
|
|
||||||
{
|
|
||||||
struct inflate_state FAR *state;
|
|
||||||
type_ar ar;
|
|
||||||
void inffas8664fnc(struct inffast_ar * par);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64))
|
|
||||||
#define PAD_AVAIL_IN 6
|
|
||||||
#define PAD_AVAIL_OUT 258
|
|
||||||
#else
|
|
||||||
#define PAD_AVAIL_IN 5
|
|
||||||
#define PAD_AVAIL_OUT 257
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* copy state to local variables */
|
|
||||||
state = (struct inflate_state FAR *)strm->state;
|
|
||||||
|
|
||||||
ar.in = strm->next_in;
|
|
||||||
ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
|
|
||||||
ar.out = strm->next_out;
|
|
||||||
ar.beg = ar.out - (start - strm->avail_out);
|
|
||||||
ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
|
|
||||||
ar.wsize = state->wsize;
|
|
||||||
ar.write = state->wnext;
|
|
||||||
ar.window = state->window;
|
|
||||||
ar.hold = state->hold;
|
|
||||||
ar.bits = state->bits;
|
|
||||||
ar.lcode = state->lencode;
|
|
||||||
ar.dcode = state->distcode;
|
|
||||||
ar.lmask = (1U << state->lenbits) - 1;
|
|
||||||
ar.dmask = (1U << state->distbits) - 1;
|
|
||||||
|
|
||||||
/* decode literals and length/distances until end-of-block or not enough
|
|
||||||
input data or output space */
|
|
||||||
|
|
||||||
/* align in on 1/2 hold size boundary */
|
|
||||||
while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
|
|
||||||
ar.hold += (unsigned long)*ar.in++ << ar.bits;
|
|
||||||
ar.bits += 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
inffas8664fnc(&ar);
|
|
||||||
|
|
||||||
if (ar.status > 1) {
|
|
||||||
if (ar.status == 2)
|
|
||||||
strm->msg = "invalid literal/length code";
|
|
||||||
else if (ar.status == 3)
|
|
||||||
strm->msg = "invalid distance code";
|
|
||||||
else
|
|
||||||
strm->msg = "invalid distance too far back";
|
|
||||||
state->mode = BAD;
|
|
||||||
}
|
|
||||||
else if ( ar.status == 1 ) {
|
|
||||||
state->mode = TYPE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* return unused bytes (on entry, bits < 8, so in won't go too far back) */
|
|
||||||
ar.len = ar.bits >> 3;
|
|
||||||
ar.in -= ar.len;
|
|
||||||
ar.bits -= ar.len << 3;
|
|
||||||
ar.hold &= (1U << ar.bits) - 1;
|
|
||||||
|
|
||||||
/* update state and return */
|
|
||||||
strm->next_in = ar.in;
|
|
||||||
strm->next_out = ar.out;
|
|
||||||
strm->avail_in = (unsigned)(ar.in < ar.last ?
|
|
||||||
PAD_AVAIL_IN + (ar.last - ar.in) :
|
|
||||||
PAD_AVAIL_IN - (ar.in - ar.last));
|
|
||||||
strm->avail_out = (unsigned)(ar.out < ar.end ?
|
|
||||||
PAD_AVAIL_OUT + (ar.end - ar.out) :
|
|
||||||
PAD_AVAIL_OUT - (ar.out - ar.end));
|
|
||||||
state->hold = (unsigned long)ar.hold;
|
|
||||||
state->bits = ar.bits;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,396 +0,0 @@
|
|||||||
; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding
|
|
||||||
; version for AMD64 on Windows using Microsoft C compiler
|
|
||||||
;
|
|
||||||
; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
|
|
||||||
; inffasx64.asm is called by inffas8664.c, which contain more info.
|
|
||||||
|
|
||||||
|
|
||||||
; to compile this file, I use option
|
|
||||||
; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
|
|
||||||
; with Microsoft Macro Assembler (x64) for AMD64
|
|
||||||
;
|
|
||||||
|
|
||||||
; This file compile with Microsoft Macro Assembler (x64) for AMD64
|
|
||||||
;
|
|
||||||
; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
|
|
||||||
;
|
|
||||||
; (you can get Windows WDK with ml64 for AMD64 from
|
|
||||||
; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
|
|
||||||
;
|
|
||||||
|
|
||||||
|
|
||||||
.code
|
|
||||||
inffas8664fnc PROC
|
|
||||||
|
|
||||||
; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
|
|
||||||
; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
|
|
||||||
;
|
|
||||||
; All registers must be preserved across the call, except for
|
|
||||||
; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch.
|
|
||||||
|
|
||||||
|
|
||||||
mov [rsp-8],rsi
|
|
||||||
mov [rsp-16],rdi
|
|
||||||
mov [rsp-24],r12
|
|
||||||
mov [rsp-32],r13
|
|
||||||
mov [rsp-40],r14
|
|
||||||
mov [rsp-48],r15
|
|
||||||
mov [rsp-56],rbx
|
|
||||||
|
|
||||||
mov rax,rcx
|
|
||||||
|
|
||||||
mov [rax+8], rbp ; /* save regs rbp and rsp */
|
|
||||||
mov [rax], rsp
|
|
||||||
|
|
||||||
mov rsp, rax ; /* make rsp point to &ar */
|
|
||||||
|
|
||||||
mov rsi, [rsp+16] ; /* rsi = in */
|
|
||||||
mov rdi, [rsp+32] ; /* rdi = out */
|
|
||||||
mov r9, [rsp+24] ; /* r9 = last */
|
|
||||||
mov r10, [rsp+48] ; /* r10 = end */
|
|
||||||
mov rbp, [rsp+64] ; /* rbp = lcode */
|
|
||||||
mov r11, [rsp+72] ; /* r11 = dcode */
|
|
||||||
mov rdx, [rsp+80] ; /* rdx = hold */
|
|
||||||
mov ebx, [rsp+88] ; /* ebx = bits */
|
|
||||||
mov r12d, [rsp+100] ; /* r12d = lmask */
|
|
||||||
mov r13d, [rsp+104] ; /* r13d = dmask */
|
|
||||||
; /* r14d = len */
|
|
||||||
; /* r15d = dist */
|
|
||||||
|
|
||||||
|
|
||||||
cld
|
|
||||||
cmp r10, rdi
|
|
||||||
je L_one_time ; /* if only one decode left */
|
|
||||||
cmp r9, rsi
|
|
||||||
|
|
||||||
jne L_do_loop
|
|
||||||
|
|
||||||
|
|
||||||
L_one_time:
|
|
||||||
mov r8, r12 ; /* r8 = lmask */
|
|
||||||
cmp bl, 32
|
|
||||||
ja L_get_length_code_one_time
|
|
||||||
|
|
||||||
lodsd ; /* eax = *(uint *)in++ */
|
|
||||||
mov cl, bl ; /* cl = bits, needs it for shifting */
|
|
||||||
add bl, 32 ; /* bits += 32 */
|
|
||||||
shl rax, cl
|
|
||||||
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
|
|
||||||
jmp L_get_length_code_one_time
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_while_test:
|
|
||||||
cmp r10, rdi
|
|
||||||
jbe L_break_loop
|
|
||||||
cmp r9, rsi
|
|
||||||
jbe L_break_loop
|
|
||||||
|
|
||||||
L_do_loop:
|
|
||||||
mov r8, r12 ; /* r8 = lmask */
|
|
||||||
cmp bl, 32
|
|
||||||
ja L_get_length_code ; /* if (32 < bits) */
|
|
||||||
|
|
||||||
lodsd ; /* eax = *(uint *)in++ */
|
|
||||||
mov cl, bl ; /* cl = bits, needs it for shifting */
|
|
||||||
add bl, 32 ; /* bits += 32 */
|
|
||||||
shl rax, cl
|
|
||||||
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
|
|
||||||
|
|
||||||
L_get_length_code:
|
|
||||||
and r8, rdx ; /* r8 &= hold */
|
|
||||||
mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
|
|
||||||
|
|
||||||
mov cl, ah ; /* cl = this.bits */
|
|
||||||
sub bl, ah ; /* bits -= this.bits */
|
|
||||||
shr rdx, cl ; /* hold >>= this.bits */
|
|
||||||
|
|
||||||
test al, al
|
|
||||||
jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
|
|
||||||
|
|
||||||
mov r8, r12 ; /* r8 = lmask */
|
|
||||||
shr eax, 16 ; /* output this.val char */
|
|
||||||
stosb
|
|
||||||
|
|
||||||
L_get_length_code_one_time:
|
|
||||||
and r8, rdx ; /* r8 &= hold */
|
|
||||||
mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
|
|
||||||
|
|
||||||
L_dolen:
|
|
||||||
mov cl, ah ; /* cl = this.bits */
|
|
||||||
sub bl, ah ; /* bits -= this.bits */
|
|
||||||
shr rdx, cl ; /* hold >>= this.bits */
|
|
||||||
|
|
||||||
test al, al
|
|
||||||
jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
|
|
||||||
|
|
||||||
shr eax, 16 ; /* output this.val char */
|
|
||||||
stosb
|
|
||||||
jmp L_while_test
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_test_for_length_base:
|
|
||||||
mov r14d, eax ; /* len = this */
|
|
||||||
shr r14d, 16 ; /* len = this.val */
|
|
||||||
mov cl, al
|
|
||||||
|
|
||||||
test al, 16
|
|
||||||
jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */
|
|
||||||
and cl, 15 ; /* op &= 15 */
|
|
||||||
jz L_decode_distance ; /* if (!op) */
|
|
||||||
|
|
||||||
L_add_bits_to_len:
|
|
||||||
sub bl, cl
|
|
||||||
xor eax, eax
|
|
||||||
inc eax
|
|
||||||
shl eax, cl
|
|
||||||
dec eax
|
|
||||||
and eax, edx ; /* eax &= hold */
|
|
||||||
shr rdx, cl
|
|
||||||
add r14d, eax ; /* len += hold & mask[op] */
|
|
||||||
|
|
||||||
L_decode_distance:
|
|
||||||
mov r8, r13 ; /* r8 = dmask */
|
|
||||||
cmp bl, 32
|
|
||||||
ja L_get_distance_code ; /* if (32 < bits) */
|
|
||||||
|
|
||||||
lodsd ; /* eax = *(uint *)in++ */
|
|
||||||
mov cl, bl ; /* cl = bits, needs it for shifting */
|
|
||||||
add bl, 32 ; /* bits += 32 */
|
|
||||||
shl rax, cl
|
|
||||||
or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
|
|
||||||
|
|
||||||
L_get_distance_code:
|
|
||||||
and r8, rdx ; /* r8 &= hold */
|
|
||||||
mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */
|
|
||||||
|
|
||||||
L_dodist:
|
|
||||||
mov r15d, eax ; /* dist = this */
|
|
||||||
shr r15d, 16 ; /* dist = this.val */
|
|
||||||
mov cl, ah
|
|
||||||
sub bl, ah ; /* bits -= this.bits */
|
|
||||||
shr rdx, cl ; /* hold >>= this.bits */
|
|
||||||
mov cl, al ; /* cl = this.op */
|
|
||||||
|
|
||||||
test al, 16 ; /* if ((op & 16) == 0) */
|
|
||||||
jz L_test_for_second_level_dist
|
|
||||||
and cl, 15 ; /* op &= 15 */
|
|
||||||
jz L_check_dist_one
|
|
||||||
|
|
||||||
L_add_bits_to_dist:
|
|
||||||
sub bl, cl
|
|
||||||
xor eax, eax
|
|
||||||
inc eax
|
|
||||||
shl eax, cl
|
|
||||||
dec eax ; /* (1 << op) - 1 */
|
|
||||||
and eax, edx ; /* eax &= hold */
|
|
||||||
shr rdx, cl
|
|
||||||
add r15d, eax ; /* dist += hold & ((1 << op) - 1) */
|
|
||||||
|
|
||||||
L_check_window:
|
|
||||||
mov r8, rsi ; /* save in so from can use it's reg */
|
|
||||||
mov rax, rdi
|
|
||||||
sub rax, [rsp+40] ; /* nbytes = out - beg */
|
|
||||||
|
|
||||||
cmp eax, r15d
|
|
||||||
jb L_clip_window ; /* if (dist > nbytes) 4.2% */
|
|
||||||
|
|
||||||
mov ecx, r14d ; /* ecx = len */
|
|
||||||
mov rsi, rdi
|
|
||||||
sub rsi, r15 ; /* from = out - dist */
|
|
||||||
|
|
||||||
sar ecx, 1
|
|
||||||
jnc L_copy_two ; /* if len % 2 == 0 */
|
|
||||||
|
|
||||||
rep movsw
|
|
||||||
mov al, [rsi]
|
|
||||||
mov [rdi], al
|
|
||||||
inc rdi
|
|
||||||
|
|
||||||
mov rsi, r8 ; /* move in back to %rsi, toss from */
|
|
||||||
jmp L_while_test
|
|
||||||
|
|
||||||
L_copy_two:
|
|
||||||
rep movsw
|
|
||||||
mov rsi, r8 ; /* move in back to %rsi, toss from */
|
|
||||||
jmp L_while_test
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_check_dist_one:
|
|
||||||
cmp r15d, 1 ; /* if dist 1, is a memset */
|
|
||||||
jne L_check_window
|
|
||||||
cmp [rsp+40], rdi ; /* if out == beg, outside window */
|
|
||||||
je L_check_window
|
|
||||||
|
|
||||||
mov ecx, r14d ; /* ecx = len */
|
|
||||||
mov al, [rdi-1]
|
|
||||||
mov ah, al
|
|
||||||
|
|
||||||
sar ecx, 1
|
|
||||||
jnc L_set_two
|
|
||||||
mov [rdi], al
|
|
||||||
inc rdi
|
|
||||||
|
|
||||||
L_set_two:
|
|
||||||
rep stosw
|
|
||||||
jmp L_while_test
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_test_for_second_level_length:
|
|
||||||
test al, 64
|
|
||||||
jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
inc eax
|
|
||||||
shl eax, cl
|
|
||||||
dec eax
|
|
||||||
and eax, edx ; /* eax &= hold */
|
|
||||||
add eax, r14d ; /* eax += len */
|
|
||||||
mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/
|
|
||||||
jmp L_dolen
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_test_for_second_level_dist:
|
|
||||||
test al, 64
|
|
||||||
jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */
|
|
||||||
|
|
||||||
xor eax, eax
|
|
||||||
inc eax
|
|
||||||
shl eax, cl
|
|
||||||
dec eax
|
|
||||||
and eax, edx ; /* eax &= hold */
|
|
||||||
add eax, r15d ; /* eax += dist */
|
|
||||||
mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/
|
|
||||||
jmp L_dodist
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_clip_window:
|
|
||||||
mov ecx, eax ; /* ecx = nbytes */
|
|
||||||
mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */
|
|
||||||
neg ecx ; /* nbytes = -nbytes */
|
|
||||||
|
|
||||||
cmp eax, r15d
|
|
||||||
jb L_invalid_distance_too_far ; /* if (dist > wsize) */
|
|
||||||
|
|
||||||
add ecx, r15d ; /* nbytes = dist - nbytes */
|
|
||||||
cmp dword ptr [rsp+96], 0
|
|
||||||
jne L_wrap_around_window ; /* if (write != 0) */
|
|
||||||
|
|
||||||
mov rsi, [rsp+56] ; /* from = window */
|
|
||||||
sub eax, ecx ; /* eax -= nbytes */
|
|
||||||
add rsi, rax ; /* from += wsize - nbytes */
|
|
||||||
|
|
||||||
mov eax, r14d ; /* eax = len */
|
|
||||||
cmp r14d, ecx
|
|
||||||
jbe L_do_copy ; /* if (nbytes >= len) */
|
|
||||||
|
|
||||||
sub eax, ecx ; /* eax -= nbytes */
|
|
||||||
rep movsb
|
|
||||||
mov rsi, rdi
|
|
||||||
sub rsi, r15 ; /* from = &out[ -dist ] */
|
|
||||||
jmp L_do_copy
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_wrap_around_window:
|
|
||||||
mov eax, [rsp+96] ; /* eax = write */
|
|
||||||
cmp ecx, eax
|
|
||||||
jbe L_contiguous_in_window ; /* if (write >= nbytes) */
|
|
||||||
|
|
||||||
mov esi, [rsp+92] ; /* from = wsize */
|
|
||||||
add rsi, [rsp+56] ; /* from += window */
|
|
||||||
add rsi, rax ; /* from += write */
|
|
||||||
sub rsi, rcx ; /* from -= nbytes */
|
|
||||||
sub ecx, eax ; /* nbytes -= write */
|
|
||||||
|
|
||||||
mov eax, r14d ; /* eax = len */
|
|
||||||
cmp eax, ecx
|
|
||||||
jbe L_do_copy ; /* if (nbytes >= len) */
|
|
||||||
|
|
||||||
sub eax, ecx ; /* len -= nbytes */
|
|
||||||
rep movsb
|
|
||||||
mov rsi, [rsp+56] ; /* from = window */
|
|
||||||
mov ecx, [rsp+96] ; /* nbytes = write */
|
|
||||||
cmp eax, ecx
|
|
||||||
jbe L_do_copy ; /* if (nbytes >= len) */
|
|
||||||
|
|
||||||
sub eax, ecx ; /* len -= nbytes */
|
|
||||||
rep movsb
|
|
||||||
mov rsi, rdi
|
|
||||||
sub rsi, r15 ; /* from = out - dist */
|
|
||||||
jmp L_do_copy
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_contiguous_in_window:
|
|
||||||
mov rsi, [rsp+56] ; /* rsi = window */
|
|
||||||
add rsi, rax
|
|
||||||
sub rsi, rcx ; /* from += write - nbytes */
|
|
||||||
|
|
||||||
mov eax, r14d ; /* eax = len */
|
|
||||||
cmp eax, ecx
|
|
||||||
jbe L_do_copy ; /* if (nbytes >= len) */
|
|
||||||
|
|
||||||
sub eax, ecx ; /* len -= nbytes */
|
|
||||||
rep movsb
|
|
||||||
mov rsi, rdi
|
|
||||||
sub rsi, r15 ; /* from = out - dist */
|
|
||||||
jmp L_do_copy ; /* if (nbytes >= len) */
|
|
||||||
|
|
||||||
ALIGN 4
|
|
||||||
L_do_copy:
|
|
||||||
mov ecx, eax ; /* ecx = len */
|
|
||||||
rep movsb
|
|
||||||
|
|
||||||
mov rsi, r8 ; /* move in back to %esi, toss from */
|
|
||||||
jmp L_while_test
|
|
||||||
|
|
||||||
L_test_for_end_of_block:
|
|
||||||
test al, 32
|
|
||||||
jz L_invalid_literal_length_code
|
|
||||||
mov dword ptr [rsp+116], 1
|
|
||||||
jmp L_break_loop_with_status
|
|
||||||
|
|
||||||
L_invalid_literal_length_code:
|
|
||||||
mov dword ptr [rsp+116], 2
|
|
||||||
jmp L_break_loop_with_status
|
|
||||||
|
|
||||||
L_invalid_distance_code:
|
|
||||||
mov dword ptr [rsp+116], 3
|
|
||||||
jmp L_break_loop_with_status
|
|
||||||
|
|
||||||
L_invalid_distance_too_far:
|
|
||||||
mov dword ptr [rsp+116], 4
|
|
||||||
jmp L_break_loop_with_status
|
|
||||||
|
|
||||||
L_break_loop:
|
|
||||||
mov dword ptr [rsp+116], 0
|
|
||||||
|
|
||||||
L_break_loop_with_status:
|
|
||||||
; /* put in, out, bits, and hold back into ar and pop esp */
|
|
||||||
mov [rsp+16], rsi ; /* in */
|
|
||||||
mov [rsp+32], rdi ; /* out */
|
|
||||||
mov [rsp+88], ebx ; /* bits */
|
|
||||||
mov [rsp+80], rdx ; /* hold */
|
|
||||||
|
|
||||||
mov rax, [rsp] ; /* restore rbp and rsp */
|
|
||||||
mov rbp, [rsp+8]
|
|
||||||
mov rsp, rax
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
mov rsi,[rsp-8]
|
|
||||||
mov rdi,[rsp-16]
|
|
||||||
mov r12,[rsp-24]
|
|
||||||
mov r13,[rsp-32]
|
|
||||||
mov r14,[rsp-40]
|
|
||||||
mov r15,[rsp-48]
|
|
||||||
mov rbx,[rsp-56]
|
|
||||||
|
|
||||||
ret 0
|
|
||||||
; :
|
|
||||||
; : "m" (ar)
|
|
||||||
; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
|
|
||||||
; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
|
|
||||||
; );
|
|
||||||
|
|
||||||
inffas8664fnc ENDP
|
|
||||||
;_TEXT ENDS
|
|
||||||
END
|
|
@ -1,31 +0,0 @@
|
|||||||
Summary
|
|
||||||
-------
|
|
||||||
This directory contains ASM implementations of the functions
|
|
||||||
longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t),
|
|
||||||
for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits.
|
|
||||||
|
|
||||||
gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits
|
|
||||||
assembly optimized version from Jean-loup Gailly original longest_match function
|
|
||||||
|
|
||||||
inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing
|
|
||||||
original function from Mark Adler
|
|
||||||
|
|
||||||
Use instructions
|
|
||||||
----------------
|
|
||||||
Assemble the .asm files using MASM and put the object files into the zlib source
|
|
||||||
directory. You can also get object files here:
|
|
||||||
|
|
||||||
http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
|
|
||||||
|
|
||||||
define ASMV and ASMINF in your project. Include inffas8664.c in your source tree,
|
|
||||||
and inffasx64.obj and gvmat64.obj as object to link.
|
|
||||||
|
|
||||||
|
|
||||||
Build instructions
|
|
||||||
------------------
|
|
||||||
run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe)
|
|
||||||
|
|
||||||
ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK
|
|
||||||
|
|
||||||
You can get Windows 2003 server DDK with ml64 and cl for AMD64 from
|
|
||||||
http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price)
|
|
@ -1,2 +0,0 @@
|
|||||||
ml /coff /Zi /c /Flmatch686.lst match686.asm
|
|
||||||
ml /coff /Zi /c /Flinffas32.lst inffas32.asm
|
|
1080
test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm
vendored
1080
test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm
vendored
File diff suppressed because it is too large
Load Diff
479
test/extern/zlib-1.2.11/contrib/masmx86/match686.asm
vendored
479
test/extern/zlib-1.2.11/contrib/masmx86/match686.asm
vendored
@ -1,479 +0,0 @@
|
|||||||
; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86
|
|
||||||
; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
|
|
||||||
; File written by Gilles Vollant, by converting match686.S from Brian Raiter
|
|
||||||
; for MASM. This is as assembly version of longest_match
|
|
||||||
; from Jean-loup Gailly in deflate.c
|
|
||||||
;
|
|
||||||
; http://www.zlib.net
|
|
||||||
; http://www.winimage.com/zLibDll
|
|
||||||
; http://www.muppetlabs.com/~breadbox/software/assembly.html
|
|
||||||
;
|
|
||||||
; For Visual C++ 4.x and higher and ML 6.x and higher
|
|
||||||
; ml.exe is distributed in
|
|
||||||
; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
|
|
||||||
;
|
|
||||||
; this file contain two implementation of longest_match
|
|
||||||
;
|
|
||||||
; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro
|
|
||||||
; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom)
|
|
||||||
;
|
|
||||||
; for using an assembly version of longest_match, you need define ASMV in project
|
|
||||||
;
|
|
||||||
; compile the asm file running
|
|
||||||
; ml /coff /Zi /c /Flmatch686.lst match686.asm
|
|
||||||
; and do not include match686.obj in your project
|
|
||||||
;
|
|
||||||
; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for
|
|
||||||
; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor
|
|
||||||
; with autoselect (with cpu detection code)
|
|
||||||
; if you want support the old pentium optimization, you can still use these version
|
|
||||||
;
|
|
||||||
; this file is not optimized for old pentium, but it compatible with all x86 32 bits
|
|
||||||
; processor (starting 80386)
|
|
||||||
;
|
|
||||||
;
|
|
||||||
; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2
|
|
||||||
|
|
||||||
;uInt longest_match(s, cur_match)
|
|
||||||
; deflate_state *s;
|
|
||||||
; IPos cur_match; /* current match */
|
|
||||||
|
|
||||||
NbStack equ 76
|
|
||||||
cur_match equ dword ptr[esp+NbStack-0]
|
|
||||||
str_s equ dword ptr[esp+NbStack-4]
|
|
||||||
; 5 dword on top (ret,ebp,esi,edi,ebx)
|
|
||||||
adrret equ dword ptr[esp+NbStack-8]
|
|
||||||
pushebp equ dword ptr[esp+NbStack-12]
|
|
||||||
pushedi equ dword ptr[esp+NbStack-16]
|
|
||||||
pushesi equ dword ptr[esp+NbStack-20]
|
|
||||||
pushebx equ dword ptr[esp+NbStack-24]
|
|
||||||
|
|
||||||
chain_length equ dword ptr [esp+NbStack-28]
|
|
||||||
limit equ dword ptr [esp+NbStack-32]
|
|
||||||
best_len equ dword ptr [esp+NbStack-36]
|
|
||||||
window equ dword ptr [esp+NbStack-40]
|
|
||||||
prev equ dword ptr [esp+NbStack-44]
|
|
||||||
scan_start equ word ptr [esp+NbStack-48]
|
|
||||||
wmask equ dword ptr [esp+NbStack-52]
|
|
||||||
match_start_ptr equ dword ptr [esp+NbStack-56]
|
|
||||||
nice_match equ dword ptr [esp+NbStack-60]
|
|
||||||
scan equ dword ptr [esp+NbStack-64]
|
|
||||||
|
|
||||||
windowlen equ dword ptr [esp+NbStack-68]
|
|
||||||
match_start equ dword ptr [esp+NbStack-72]
|
|
||||||
strend equ dword ptr [esp+NbStack-76]
|
|
||||||
NbStackAdd equ (NbStack-24)
|
|
||||||
|
|
||||||
.386p
|
|
||||||
|
|
||||||
name gvmatch
|
|
||||||
.MODEL FLAT
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
; all the +zlib1222add offsets are due to the addition of fields
|
|
||||||
; in zlib in the deflate_state structure since the asm code was first written
|
|
||||||
; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
|
|
||||||
; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
|
|
||||||
; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
|
|
||||||
|
|
||||||
zlib1222add equ 8
|
|
||||||
|
|
||||||
; Note : these value are good with a 8 bytes boundary pack structure
|
|
||||||
dep_chain_length equ 74h+zlib1222add
|
|
||||||
dep_window equ 30h+zlib1222add
|
|
||||||
dep_strstart equ 64h+zlib1222add
|
|
||||||
dep_prev_length equ 70h+zlib1222add
|
|
||||||
dep_nice_match equ 88h+zlib1222add
|
|
||||||
dep_w_size equ 24h+zlib1222add
|
|
||||||
dep_prev equ 38h+zlib1222add
|
|
||||||
dep_w_mask equ 2ch+zlib1222add
|
|
||||||
dep_good_match equ 84h+zlib1222add
|
|
||||||
dep_match_start equ 68h+zlib1222add
|
|
||||||
dep_lookahead equ 6ch+zlib1222add
|
|
||||||
|
|
||||||
|
|
||||||
_TEXT segment
|
|
||||||
|
|
||||||
IFDEF NOUNDERLINE
|
|
||||||
public longest_match
|
|
||||||
public match_init
|
|
||||||
ELSE
|
|
||||||
public _longest_match
|
|
||||||
public _match_init
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
MAX_MATCH equ 258
|
|
||||||
MIN_MATCH equ 3
|
|
||||||
MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MAX_MATCH equ 258
|
|
||||||
MIN_MATCH equ 3
|
|
||||||
MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1)
|
|
||||||
MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h)
|
|
||||||
|
|
||||||
|
|
||||||
;;; stack frame offsets
|
|
||||||
|
|
||||||
chainlenwmask equ esp + 0 ; high word: current chain len
|
|
||||||
; low word: s->wmask
|
|
||||||
window equ esp + 4 ; local copy of s->window
|
|
||||||
windowbestlen equ esp + 8 ; s->window + bestlen
|
|
||||||
scanstart equ esp + 16 ; first two bytes of string
|
|
||||||
scanend equ esp + 12 ; last two bytes of string
|
|
||||||
scanalign equ esp + 20 ; dword-misalignment of string
|
|
||||||
nicematch equ esp + 24 ; a good enough match size
|
|
||||||
bestlen equ esp + 28 ; size of best match so far
|
|
||||||
scan equ esp + 32 ; ptr to string wanting match
|
|
||||||
|
|
||||||
LocalVarsSize equ 36
|
|
||||||
; saved ebx byte esp + 36
|
|
||||||
; saved edi byte esp + 40
|
|
||||||
; saved esi byte esp + 44
|
|
||||||
; saved ebp byte esp + 48
|
|
||||||
; return address byte esp + 52
|
|
||||||
deflatestate equ esp + 56 ; the function arguments
|
|
||||||
curmatch equ esp + 60
|
|
||||||
|
|
||||||
;;; Offsets for fields in the deflate_state structure. These numbers
|
|
||||||
;;; are calculated from the definition of deflate_state, with the
|
|
||||||
;;; assumption that the compiler will dword-align the fields. (Thus,
|
|
||||||
;;; changing the definition of deflate_state could easily cause this
|
|
||||||
;;; program to crash horribly, without so much as a warning at
|
|
||||||
;;; compile time. Sigh.)
|
|
||||||
|
|
||||||
dsWSize equ 36+zlib1222add
|
|
||||||
dsWMask equ 44+zlib1222add
|
|
||||||
dsWindow equ 48+zlib1222add
|
|
||||||
dsPrev equ 56+zlib1222add
|
|
||||||
dsMatchLen equ 88+zlib1222add
|
|
||||||
dsPrevMatch equ 92+zlib1222add
|
|
||||||
dsStrStart equ 100+zlib1222add
|
|
||||||
dsMatchStart equ 104+zlib1222add
|
|
||||||
dsLookahead equ 108+zlib1222add
|
|
||||||
dsPrevLen equ 112+zlib1222add
|
|
||||||
dsMaxChainLen equ 116+zlib1222add
|
|
||||||
dsGoodMatch equ 132+zlib1222add
|
|
||||||
dsNiceMatch equ 136+zlib1222add
|
|
||||||
|
|
||||||
|
|
||||||
;;; match686.asm -- Pentium-Pro-optimized version of longest_match()
|
|
||||||
;;; Written for zlib 1.1.2
|
|
||||||
;;; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
|
|
||||||
;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html
|
|
||||||
;;;
|
|
||||||
;;
|
|
||||||
;; This software is provided 'as-is', without any express or implied
|
|
||||||
;; warranty. In no event will the authors be held liable for any damages
|
|
||||||
;; arising from the use of this software.
|
|
||||||
;;
|
|
||||||
;; Permission is granted to anyone to use this software for any purpose,
|
|
||||||
;; including commercial applications, and to alter it and redistribute it
|
|
||||||
;; freely, subject to the following restrictions:
|
|
||||||
;;
|
|
||||||
;; 1. The origin of this software must not be misrepresented; you must not
|
|
||||||
;; claim that you wrote the original software. If you use this software
|
|
||||||
;; in a product, an acknowledgment in the product documentation would be
|
|
||||||
;; appreciated but is not required.
|
|
||||||
;; 2. Altered source versions must be plainly marked as such, and must not be
|
|
||||||
;; misrepresented as being the original software
|
|
||||||
;; 3. This notice may not be removed or altered from any source distribution.
|
|
||||||
;;
|
|
||||||
|
|
||||||
;GLOBAL _longest_match, _match_init
|
|
||||||
|
|
||||||
|
|
||||||
;SECTION .text
|
|
||||||
|
|
||||||
;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
|
|
||||||
|
|
||||||
;_longest_match:
|
|
||||||
IFDEF NOUNDERLINE
|
|
||||||
longest_match proc near
|
|
||||||
ELSE
|
|
||||||
_longest_match proc near
|
|
||||||
ENDIF
|
|
||||||
.FPO (9, 4, 0, 0, 1, 0)
|
|
||||||
|
|
||||||
;;; Save registers that the compiler may be using, and adjust esp to
|
|
||||||
;;; make room for our stack frame.
|
|
||||||
|
|
||||||
push ebp
|
|
||||||
push edi
|
|
||||||
push esi
|
|
||||||
push ebx
|
|
||||||
sub esp, LocalVarsSize
|
|
||||||
|
|
||||||
;;; Retrieve the function arguments. ecx will hold cur_match
|
|
||||||
;;; throughout the entire function. edx will hold the pointer to the
|
|
||||||
;;; deflate_state structure during the function's setup (before
|
|
||||||
;;; entering the main loop.
|
|
||||||
|
|
||||||
mov edx, [deflatestate]
|
|
||||||
mov ecx, [curmatch]
|
|
||||||
|
|
||||||
;;; uInt wmask = s->w_mask;
|
|
||||||
;;; unsigned chain_length = s->max_chain_length;
|
|
||||||
;;; if (s->prev_length >= s->good_match) {
|
|
||||||
;;; chain_length >>= 2;
|
|
||||||
;;; }
|
|
||||||
|
|
||||||
mov eax, [edx + dsPrevLen]
|
|
||||||
mov ebx, [edx + dsGoodMatch]
|
|
||||||
cmp eax, ebx
|
|
||||||
mov eax, [edx + dsWMask]
|
|
||||||
mov ebx, [edx + dsMaxChainLen]
|
|
||||||
jl LastMatchGood
|
|
||||||
shr ebx, 2
|
|
||||||
LastMatchGood:
|
|
||||||
|
|
||||||
;;; chainlen is decremented once beforehand so that the function can
|
|
||||||
;;; use the sign flag instead of the zero flag for the exit test.
|
|
||||||
;;; It is then shifted into the high word, to make room for the wmask
|
|
||||||
;;; value, which it will always accompany.
|
|
||||||
|
|
||||||
dec ebx
|
|
||||||
shl ebx, 16
|
|
||||||
or ebx, eax
|
|
||||||
mov [chainlenwmask], ebx
|
|
||||||
|
|
||||||
;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
|
|
||||||
|
|
||||||
mov eax, [edx + dsNiceMatch]
|
|
||||||
mov ebx, [edx + dsLookahead]
|
|
||||||
cmp ebx, eax
|
|
||||||
jl LookaheadLess
|
|
||||||
mov ebx, eax
|
|
||||||
LookaheadLess: mov [nicematch], ebx
|
|
||||||
|
|
||||||
;;; register Bytef *scan = s->window + s->strstart;
|
|
||||||
|
|
||||||
mov esi, [edx + dsWindow]
|
|
||||||
mov [window], esi
|
|
||||||
mov ebp, [edx + dsStrStart]
|
|
||||||
lea edi, [esi + ebp]
|
|
||||||
mov [scan], edi
|
|
||||||
|
|
||||||
;;; Determine how many bytes the scan ptr is off from being
|
|
||||||
;;; dword-aligned.
|
|
||||||
|
|
||||||
mov eax, edi
|
|
||||||
neg eax
|
|
||||||
and eax, 3
|
|
||||||
mov [scanalign], eax
|
|
||||||
|
|
||||||
;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
|
|
||||||
;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
|
|
||||||
|
|
||||||
mov eax, [edx + dsWSize]
|
|
||||||
sub eax, MIN_LOOKAHEAD
|
|
||||||
sub ebp, eax
|
|
||||||
jg LimitPositive
|
|
||||||
xor ebp, ebp
|
|
||||||
LimitPositive:
|
|
||||||
|
|
||||||
;;; int best_len = s->prev_length;
|
|
||||||
|
|
||||||
mov eax, [edx + dsPrevLen]
|
|
||||||
mov [bestlen], eax
|
|
||||||
|
|
||||||
;;; Store the sum of s->window + best_len in esi locally, and in esi.
|
|
||||||
|
|
||||||
add esi, eax
|
|
||||||
mov [windowbestlen], esi
|
|
||||||
|
|
||||||
;;; register ush scan_start = *(ushf*)scan;
|
|
||||||
;;; register ush scan_end = *(ushf*)(scan+best_len-1);
|
|
||||||
;;; Posf *prev = s->prev;
|
|
||||||
|
|
||||||
movzx ebx, word ptr [edi]
|
|
||||||
mov [scanstart], ebx
|
|
||||||
movzx ebx, word ptr [edi + eax - 1]
|
|
||||||
mov [scanend], ebx
|
|
||||||
mov edi, [edx + dsPrev]
|
|
||||||
|
|
||||||
;;; Jump into the main loop.
|
|
||||||
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
jmp short LoopEntry
|
|
||||||
|
|
||||||
align 4
|
|
||||||
|
|
||||||
;;; do {
|
|
||||||
;;; match = s->window + cur_match;
|
|
||||||
;;; if (*(ushf*)(match+best_len-1) != scan_end ||
|
|
||||||
;;; *(ushf*)match != scan_start) continue;
|
|
||||||
;;; [...]
|
|
||||||
;;; } while ((cur_match = prev[cur_match & wmask]) > limit
|
|
||||||
;;; && --chain_length != 0);
|
|
||||||
;;;
|
|
||||||
;;; Here is the inner loop of the function. The function will spend the
|
|
||||||
;;; majority of its time in this loop, and majority of that time will
|
|
||||||
;;; be spent in the first ten instructions.
|
|
||||||
;;;
|
|
||||||
;;; Within this loop:
|
|
||||||
;;; ebx = scanend
|
|
||||||
;;; ecx = curmatch
|
|
||||||
;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
|
|
||||||
;;; esi = windowbestlen - i.e., (window + bestlen)
|
|
||||||
;;; edi = prev
|
|
||||||
;;; ebp = limit
|
|
||||||
|
|
||||||
LookupLoop:
|
|
||||||
and ecx, edx
|
|
||||||
movzx ecx, word ptr [edi + ecx*2]
|
|
||||||
cmp ecx, ebp
|
|
||||||
jbe LeaveNow
|
|
||||||
sub edx, 00010000h
|
|
||||||
js LeaveNow
|
|
||||||
LoopEntry: movzx eax, word ptr [esi + ecx - 1]
|
|
||||||
cmp eax, ebx
|
|
||||||
jnz LookupLoop
|
|
||||||
mov eax, [window]
|
|
||||||
movzx eax, word ptr [eax + ecx]
|
|
||||||
cmp eax, [scanstart]
|
|
||||||
jnz LookupLoop
|
|
||||||
|
|
||||||
;;; Store the current value of chainlen.
|
|
||||||
|
|
||||||
mov [chainlenwmask], edx
|
|
||||||
|
|
||||||
;;; Point edi to the string under scrutiny, and esi to the string we
|
|
||||||
;;; are hoping to match it up with. In actuality, esi and edi are
|
|
||||||
;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
|
|
||||||
;;; initialized to -(MAX_MATCH_8 - scanalign).
|
|
||||||
|
|
||||||
mov esi, [window]
|
|
||||||
mov edi, [scan]
|
|
||||||
add esi, ecx
|
|
||||||
mov eax, [scanalign]
|
|
||||||
mov edx, 0fffffef8h; -(MAX_MATCH_8)
|
|
||||||
lea edi, [edi + eax + 0108h] ;MAX_MATCH_8]
|
|
||||||
lea esi, [esi + eax + 0108h] ;MAX_MATCH_8]
|
|
||||||
|
|
||||||
;;; Test the strings for equality, 8 bytes at a time. At the end,
|
|
||||||
;;; adjust edx so that it is offset to the exact byte that mismatched.
|
|
||||||
;;;
|
|
||||||
;;; We already know at this point that the first three bytes of the
|
|
||||||
;;; strings match each other, and they can be safely passed over before
|
|
||||||
;;; starting the compare loop. So what this code does is skip over 0-3
|
|
||||||
;;; bytes, as much as necessary in order to dword-align the edi
|
|
||||||
;;; pointer. (esi will still be misaligned three times out of four.)
|
|
||||||
;;;
|
|
||||||
;;; It should be confessed that this loop usually does not represent
|
|
||||||
;;; much of the total running time. Replacing it with a more
|
|
||||||
;;; straightforward "rep cmpsb" would not drastically degrade
|
|
||||||
;;; performance.
|
|
||||||
|
|
||||||
LoopCmps:
|
|
||||||
mov eax, [esi + edx]
|
|
||||||
xor eax, [edi + edx]
|
|
||||||
jnz LeaveLoopCmps
|
|
||||||
mov eax, [esi + edx + 4]
|
|
||||||
xor eax, [edi + edx + 4]
|
|
||||||
jnz LeaveLoopCmps4
|
|
||||||
add edx, 8
|
|
||||||
jnz LoopCmps
|
|
||||||
jmp short LenMaximum
|
|
||||||
LeaveLoopCmps4: add edx, 4
|
|
||||||
LeaveLoopCmps: test eax, 0000FFFFh
|
|
||||||
jnz LenLower
|
|
||||||
add edx, 2
|
|
||||||
shr eax, 16
|
|
||||||
LenLower: sub al, 1
|
|
||||||
adc edx, 0
|
|
||||||
|
|
||||||
;;; Calculate the length of the match. If it is longer than MAX_MATCH,
|
|
||||||
;;; then automatically accept it as the best possible match and leave.
|
|
||||||
|
|
||||||
lea eax, [edi + edx]
|
|
||||||
mov edi, [scan]
|
|
||||||
sub eax, edi
|
|
||||||
cmp eax, MAX_MATCH
|
|
||||||
jge LenMaximum
|
|
||||||
|
|
||||||
;;; If the length of the match is not longer than the best match we
|
|
||||||
;;; have so far, then forget it and return to the lookup loop.
|
|
||||||
|
|
||||||
mov edx, [deflatestate]
|
|
||||||
mov ebx, [bestlen]
|
|
||||||
cmp eax, ebx
|
|
||||||
jg LongerMatch
|
|
||||||
mov esi, [windowbestlen]
|
|
||||||
mov edi, [edx + dsPrev]
|
|
||||||
mov ebx, [scanend]
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
;;; s->match_start = cur_match;
|
|
||||||
;;; best_len = len;
|
|
||||||
;;; if (len >= nice_match) break;
|
|
||||||
;;; scan_end = *(ushf*)(scan+best_len-1);
|
|
||||||
|
|
||||||
LongerMatch: mov ebx, [nicematch]
|
|
||||||
mov [bestlen], eax
|
|
||||||
mov [edx + dsMatchStart], ecx
|
|
||||||
cmp eax, ebx
|
|
||||||
jge LeaveNow
|
|
||||||
mov esi, [window]
|
|
||||||
add esi, eax
|
|
||||||
mov [windowbestlen], esi
|
|
||||||
movzx ebx, word ptr [edi + eax - 1]
|
|
||||||
mov edi, [edx + dsPrev]
|
|
||||||
mov [scanend], ebx
|
|
||||||
mov edx, [chainlenwmask]
|
|
||||||
jmp LookupLoop
|
|
||||||
|
|
||||||
;;; Accept the current string, with the maximum possible length.
|
|
||||||
|
|
||||||
LenMaximum: mov edx, [deflatestate]
|
|
||||||
mov dword ptr [bestlen], MAX_MATCH
|
|
||||||
mov [edx + dsMatchStart], ecx
|
|
||||||
|
|
||||||
;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
|
|
||||||
;;; return s->lookahead;
|
|
||||||
|
|
||||||
LeaveNow:
|
|
||||||
mov edx, [deflatestate]
|
|
||||||
mov ebx, [bestlen]
|
|
||||||
mov eax, [edx + dsLookahead]
|
|
||||||
cmp ebx, eax
|
|
||||||
jg LookaheadRet
|
|
||||||
mov eax, ebx
|
|
||||||
LookaheadRet:
|
|
||||||
|
|
||||||
;;; Restore the stack and return from whence we came.
|
|
||||||
|
|
||||||
add esp, LocalVarsSize
|
|
||||||
pop ebx
|
|
||||||
pop esi
|
|
||||||
pop edi
|
|
||||||
pop ebp
|
|
||||||
|
|
||||||
ret
|
|
||||||
; please don't remove this string !
|
|
||||||
; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary!
|
|
||||||
db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah
|
|
||||||
|
|
||||||
|
|
||||||
IFDEF NOUNDERLINE
|
|
||||||
longest_match endp
|
|
||||||
ELSE
|
|
||||||
_longest_match endp
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
IFDEF NOUNDERLINE
|
|
||||||
match_init proc near
|
|
||||||
ret
|
|
||||||
match_init endp
|
|
||||||
ELSE
|
|
||||||
_match_init proc near
|
|
||||||
ret
|
|
||||||
_match_init endp
|
|
||||||
ENDIF
|
|
||||||
|
|
||||||
|
|
||||||
_TEXT ends
|
|
||||||
end
|
|
@ -1,27 +0,0 @@
|
|||||||
|
|
||||||
Summary
|
|
||||||
-------
|
|
||||||
This directory contains ASM implementations of the functions
|
|
||||||
longest_match() and inflate_fast().
|
|
||||||
|
|
||||||
|
|
||||||
Use instructions
|
|
||||||
----------------
|
|
||||||
Assemble using MASM, and copy the object files into the zlib source
|
|
||||||
directory, then run the appropriate makefile, as suggested below. You can
|
|
||||||
donwload MASM from here:
|
|
||||||
|
|
||||||
http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
|
|
||||||
|
|
||||||
You can also get objects files here:
|
|
||||||
|
|
||||||
http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
|
|
||||||
|
|
||||||
Build instructions
|
|
||||||
------------------
|
|
||||||
* With Microsoft C and MASM:
|
|
||||||
nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj"
|
|
||||||
|
|
||||||
* With Borland C and TASM:
|
|
||||||
make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj"
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
|||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#define IDR_VERSION1 1
|
|
||||||
IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
|
|
||||||
FILEVERSION 1, 2, 11, 0
|
|
||||||
PRODUCTVERSION 1, 2, 11, 0
|
|
||||||
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
|
||||||
FILEFLAGS 0
|
|
||||||
FILEOS VOS_DOS_WINDOWS32
|
|
||||||
FILETYPE VFT_DLL
|
|
||||||
FILESUBTYPE 0 // not used
|
|
||||||
BEGIN
|
|
||||||
BLOCK "StringFileInfo"
|
|
||||||
BEGIN
|
|
||||||
BLOCK "040904E4"
|
|
||||||
//language ID = U.S. English, char set = Windows, Multilingual
|
|
||||||
|
|
||||||
BEGIN
|
|
||||||
VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
|
|
||||||
VALUE "FileVersion", "1.2.11\0"
|
|
||||||
VALUE "InternalName", "zlib\0"
|
|
||||||
VALUE "OriginalFilename", "zlibwapi.dll\0"
|
|
||||||
VALUE "ProductName", "ZLib.DLL\0"
|
|
||||||
VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
|
|
||||||
VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
|
|
||||||
END
|
|
||||||
END
|
|
||||||
BLOCK "VarFileInfo"
|
|
||||||
BEGIN
|
|
||||||
VALUE "Translation", 0x0409, 1252
|
|
||||||
END
|
|
||||||
END
|
|
@ -1,153 +0,0 @@
|
|||||||
LIBRARY
|
|
||||||
; zlib data compression and ZIP file I/O library
|
|
||||||
|
|
||||||
VERSION 1.2
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
adler32 @1
|
|
||||||
compress @2
|
|
||||||
crc32 @3
|
|
||||||
deflate @4
|
|
||||||
deflateCopy @5
|
|
||||||
deflateEnd @6
|
|
||||||
deflateInit2_ @7
|
|
||||||
deflateInit_ @8
|
|
||||||
deflateParams @9
|
|
||||||
deflateReset @10
|
|
||||||
deflateSetDictionary @11
|
|
||||||
gzclose @12
|
|
||||||
gzdopen @13
|
|
||||||
gzerror @14
|
|
||||||
gzflush @15
|
|
||||||
gzopen @16
|
|
||||||
gzread @17
|
|
||||||
gzwrite @18
|
|
||||||
inflate @19
|
|
||||||
inflateEnd @20
|
|
||||||
inflateInit2_ @21
|
|
||||||
inflateInit_ @22
|
|
||||||
inflateReset @23
|
|
||||||
inflateSetDictionary @24
|
|
||||||
inflateSync @25
|
|
||||||
uncompress @26
|
|
||||||
zlibVersion @27
|
|
||||||
gzprintf @28
|
|
||||||
gzputc @29
|
|
||||||
gzgetc @30
|
|
||||||
gzseek @31
|
|
||||||
gzrewind @32
|
|
||||||
gztell @33
|
|
||||||
gzeof @34
|
|
||||||
gzsetparams @35
|
|
||||||
zError @36
|
|
||||||
inflateSyncPoint @37
|
|
||||||
get_crc_table @38
|
|
||||||
compress2 @39
|
|
||||||
gzputs @40
|
|
||||||
gzgets @41
|
|
||||||
inflateCopy @42
|
|
||||||
inflateBackInit_ @43
|
|
||||||
inflateBack @44
|
|
||||||
inflateBackEnd @45
|
|
||||||
compressBound @46
|
|
||||||
deflateBound @47
|
|
||||||
gzclearerr @48
|
|
||||||
gzungetc @49
|
|
||||||
zlibCompileFlags @50
|
|
||||||
deflatePrime @51
|
|
||||||
deflatePending @52
|
|
||||||
|
|
||||||
unzOpen @61
|
|
||||||
unzClose @62
|
|
||||||
unzGetGlobalInfo @63
|
|
||||||
unzGetCurrentFileInfo @64
|
|
||||||
unzGoToFirstFile @65
|
|
||||||
unzGoToNextFile @66
|
|
||||||
unzOpenCurrentFile @67
|
|
||||||
unzReadCurrentFile @68
|
|
||||||
unzOpenCurrentFile3 @69
|
|
||||||
unztell @70
|
|
||||||
unzeof @71
|
|
||||||
unzCloseCurrentFile @72
|
|
||||||
unzGetGlobalComment @73
|
|
||||||
unzStringFileNameCompare @74
|
|
||||||
unzLocateFile @75
|
|
||||||
unzGetLocalExtrafield @76
|
|
||||||
unzOpen2 @77
|
|
||||||
unzOpenCurrentFile2 @78
|
|
||||||
unzOpenCurrentFilePassword @79
|
|
||||||
|
|
||||||
zipOpen @80
|
|
||||||
zipOpenNewFileInZip @81
|
|
||||||
zipWriteInFileInZip @82
|
|
||||||
zipCloseFileInZip @83
|
|
||||||
zipClose @84
|
|
||||||
zipOpenNewFileInZip2 @86
|
|
||||||
zipCloseFileInZipRaw @87
|
|
||||||
zipOpen2 @88
|
|
||||||
zipOpenNewFileInZip3 @89
|
|
||||||
|
|
||||||
unzGetFilePos @100
|
|
||||||
unzGoToFilePos @101
|
|
||||||
|
|
||||||
fill_win32_filefunc @110
|
|
||||||
|
|
||||||
; zlibwapi v1.2.4 added:
|
|
||||||
fill_win32_filefunc64 @111
|
|
||||||
fill_win32_filefunc64A @112
|
|
||||||
fill_win32_filefunc64W @113
|
|
||||||
|
|
||||||
unzOpen64 @120
|
|
||||||
unzOpen2_64 @121
|
|
||||||
unzGetGlobalInfo64 @122
|
|
||||||
unzGetCurrentFileInfo64 @124
|
|
||||||
unzGetCurrentFileZStreamPos64 @125
|
|
||||||
unztell64 @126
|
|
||||||
unzGetFilePos64 @127
|
|
||||||
unzGoToFilePos64 @128
|
|
||||||
|
|
||||||
zipOpen64 @130
|
|
||||||
zipOpen2_64 @131
|
|
||||||
zipOpenNewFileInZip64 @132
|
|
||||||
zipOpenNewFileInZip2_64 @133
|
|
||||||
zipOpenNewFileInZip3_64 @134
|
|
||||||
zipOpenNewFileInZip4_64 @135
|
|
||||||
zipCloseFileInZipRaw64 @136
|
|
||||||
|
|
||||||
; zlib1 v1.2.4 added:
|
|
||||||
adler32_combine @140
|
|
||||||
crc32_combine @142
|
|
||||||
deflateSetHeader @144
|
|
||||||
deflateTune @145
|
|
||||||
gzbuffer @146
|
|
||||||
gzclose_r @147
|
|
||||||
gzclose_w @148
|
|
||||||
gzdirect @149
|
|
||||||
gzoffset @150
|
|
||||||
inflateGetHeader @156
|
|
||||||
inflateMark @157
|
|
||||||
inflatePrime @158
|
|
||||||
inflateReset2 @159
|
|
||||||
inflateUndermine @160
|
|
||||||
|
|
||||||
; zlib1 v1.2.6 added:
|
|
||||||
gzgetc_ @161
|
|
||||||
inflateResetKeep @163
|
|
||||||
deflateResetKeep @164
|
|
||||||
|
|
||||||
; zlib1 v1.2.7 added:
|
|
||||||
gzopen_w @165
|
|
||||||
|
|
||||||
; zlib1 v1.2.8 added:
|
|
||||||
inflateGetDictionary @166
|
|
||||||
gzvprintf @167
|
|
||||||
|
|
||||||
; zlib1 v1.2.9 added:
|
|
||||||
inflateCodesUsed @168
|
|
||||||
inflateValidate @169
|
|
||||||
uncompress2 @170
|
|
||||||
gzfread @171
|
|
||||||
gzfwrite @172
|
|
||||||
deflateGetDictionary @173
|
|
||||||
adler32_z @174
|
|
||||||
crc32_z @175
|
|
442
test/extern/zlib-1.2.11/crc32.c
vendored
442
test/extern/zlib-1.2.11/crc32.c
vendored
@ -1,442 +0,0 @@
|
|||||||
/* crc32.c -- compute the CRC-32 of a data stream
|
|
||||||
* Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
|
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
|
||||||
*
|
|
||||||
* Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
|
|
||||||
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
|
|
||||||
* tables for updating the shift register in one step with three exclusive-ors
|
|
||||||
* instead of four steps with four exclusive-ors. This results in about a
|
|
||||||
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* @(#) $Id$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
|
|
||||||
protection on the static variables used to control the first-use generation
|
|
||||||
of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
|
|
||||||
first call get_crc_table() to initialize the tables before allowing more than
|
|
||||||
one thread to use crc32().
|
|
||||||
|
|
||||||
DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef MAKECRCH
|
|
||||||
# include <stdio.h>
|
|
||||||
# ifndef DYNAMIC_CRC_TABLE
|
|
||||||
# define DYNAMIC_CRC_TABLE
|
|
||||||
# endif /* !DYNAMIC_CRC_TABLE */
|
|
||||||
#endif /* MAKECRCH */
|
|
||||||
|
|
||||||
#include "zutil.h" /* for STDC and FAR definitions */
|
|
||||||
|
|
||||||
/* Definitions for doing the crc four data bytes at a time. */
|
|
||||||
#if !defined(NOBYFOUR) && defined(Z_U4)
|
|
||||||
# define BYFOUR
|
|
||||||
#endif
|
|
||||||
#ifdef BYFOUR
|
|
||||||
local unsigned long crc32_little OF((unsigned long,
|
|
||||||
const unsigned char FAR *, z_size_t));
|
|
||||||
local unsigned long crc32_big OF((unsigned long,
|
|
||||||
const unsigned char FAR *, z_size_t));
|
|
||||||
# define TBLS 8
|
|
||||||
#else
|
|
||||||
# define TBLS 1
|
|
||||||
#endif /* BYFOUR */
|
|
||||||
|
|
||||||
/* Local functions for crc concatenation */
|
|
||||||
local unsigned long gf2_matrix_times OF((unsigned long *mat,
|
|
||||||
unsigned long vec));
|
|
||||||
local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
|
|
||||||
local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
|
|
||||||
local volatile int crc_table_empty = 1;
|
|
||||||
local z_crc_t FAR crc_table[TBLS][256];
|
|
||||||
local void make_crc_table OF((void));
|
|
||||||
#ifdef MAKECRCH
|
|
||||||
local void write_table OF((FILE *, const z_crc_t FAR *));
|
|
||||||
#endif /* MAKECRCH */
|
|
||||||
/*
|
|
||||||
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
|
|
||||||
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
|
|
||||||
|
|
||||||
Polynomials over GF(2) are represented in binary, one bit per coefficient,
|
|
||||||
with the lowest powers in the most significant bit. Then adding polynomials
|
|
||||||
is just exclusive-or, and multiplying a polynomial by x is a right shift by
|
|
||||||
one. If we call the above polynomial p, and represent a byte as the
|
|
||||||
polynomial q, also with the lowest power in the most significant bit (so the
|
|
||||||
byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
|
|
||||||
where a mod b means the remainder after dividing a by b.
|
|
||||||
|
|
||||||
This calculation is done using the shift-register method of multiplying and
|
|
||||||
taking the remainder. The register is initialized to zero, and for each
|
|
||||||
incoming bit, x^32 is added mod p to the register if the bit is a one (where
|
|
||||||
x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
|
|
||||||
x (which is shifting right by one and adding x^32 mod p if the bit shifted
|
|
||||||
out is a one). We start with the highest power (least significant bit) of
|
|
||||||
q and repeat for all eight bits of q.
|
|
||||||
|
|
||||||
The first table is simply the CRC of all possible eight bit values. This is
|
|
||||||
all the information needed to generate CRCs on data a byte at a time for all
|
|
||||||
combinations of CRC register values and incoming bytes. The remaining tables
|
|
||||||
allow for word-at-a-time CRC calculation for both big-endian and little-
|
|
||||||
endian machines, where a word is four bytes.
|
|
||||||
*/
|
|
||||||
local void make_crc_table()
|
|
||||||
{
|
|
||||||
z_crc_t c;
|
|
||||||
int n, k;
|
|
||||||
z_crc_t poly; /* polynomial exclusive-or pattern */
|
|
||||||
/* terms of polynomial defining this crc (except x^32): */
|
|
||||||
static volatile int first = 1; /* flag to limit concurrent making */
|
|
||||||
static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
|
|
||||||
|
|
||||||
/* See if another task is already doing this (not thread-safe, but better
|
|
||||||
than nothing -- significantly reduces duration of vulnerability in
|
|
||||||
case the advice about DYNAMIC_CRC_TABLE is ignored) */
|
|
||||||
if (first) {
|
|
||||||
first = 0;
|
|
||||||
|
|
||||||
/* make exclusive-or pattern from polynomial (0xedb88320UL) */
|
|
||||||
poly = 0;
|
|
||||||
for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
|
|
||||||
poly |= (z_crc_t)1 << (31 - p[n]);
|
|
||||||
|
|
||||||
/* generate a crc for every 8-bit value */
|
|
||||||
for (n = 0; n < 256; n++) {
|
|
||||||
c = (z_crc_t)n;
|
|
||||||
for (k = 0; k < 8; k++)
|
|
||||||
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
|
|
||||||
crc_table[0][n] = c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BYFOUR
|
|
||||||
/* generate crc for each value followed by one, two, and three zeros,
|
|
||||||
and then the byte reversal of those as well as the first table */
|
|
||||||
for (n = 0; n < 256; n++) {
|
|
||||||
c = crc_table[0][n];
|
|
||||||
crc_table[4][n] = ZSWAP32(c);
|
|
||||||
for (k = 1; k < 4; k++) {
|
|
||||||
c = crc_table[0][c & 0xff] ^ (c >> 8);
|
|
||||||
crc_table[k][n] = c;
|
|
||||||
crc_table[k + 4][n] = ZSWAP32(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* BYFOUR */
|
|
||||||
|
|
||||||
crc_table_empty = 0;
|
|
||||||
}
|
|
||||||
else { /* not first */
|
|
||||||
/* wait for the other guy to finish (not efficient, but rare) */
|
|
||||||
while (crc_table_empty)
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAKECRCH
|
|
||||||
/* write out CRC tables to crc32.h */
|
|
||||||
{
|
|
||||||
FILE *out;
|
|
||||||
|
|
||||||
out = fopen("crc32.h", "w");
|
|
||||||
if (out == NULL) return;
|
|
||||||
fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
|
|
||||||
fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
|
|
||||||
fprintf(out, "local const z_crc_t FAR ");
|
|
||||||
fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
|
|
||||||
write_table(out, crc_table[0]);
|
|
||||||
# ifdef BYFOUR
|
|
||||||
fprintf(out, "#ifdef BYFOUR\n");
|
|
||||||
for (k = 1; k < 8; k++) {
|
|
||||||
fprintf(out, " },\n {\n");
|
|
||||||
write_table(out, crc_table[k]);
|
|
||||||
}
|
|
||||||
fprintf(out, "#endif\n");
|
|
||||||
# endif /* BYFOUR */
|
|
||||||
fprintf(out, " }\n};\n");
|
|
||||||
fclose(out);
|
|
||||||
}
|
|
||||||
#endif /* MAKECRCH */
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAKECRCH
|
|
||||||
local void write_table(out, table)
|
|
||||||
FILE *out;
|
|
||||||
const z_crc_t FAR *table;
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for (n = 0; n < 256; n++)
|
|
||||||
fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
|
|
||||||
(unsigned long)(table[n]),
|
|
||||||
n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
|
|
||||||
}
|
|
||||||
#endif /* MAKECRCH */
|
|
||||||
|
|
||||||
#else /* !DYNAMIC_CRC_TABLE */
|
|
||||||
/* ========================================================================
|
|
||||||
* Tables of CRC-32s of all single-byte values, made by make_crc_table().
|
|
||||||
*/
|
|
||||||
#include "crc32.h"
|
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
|
||||||
|
|
||||||
/* =========================================================================
|
|
||||||
* This function can be used by asm versions of crc32()
|
|
||||||
*/
|
|
||||||
const z_crc_t FAR * ZEXPORT get_crc_table()
|
|
||||||
{
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
|
||||||
return (const z_crc_t FAR *)crc_table;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
|
|
||||||
#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
unsigned long ZEXPORT crc32_z(crc, buf, len)
|
|
||||||
unsigned long crc;
|
|
||||||
const unsigned char FAR *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
if (buf == Z_NULL) return 0UL;
|
|
||||||
|
|
||||||
#ifdef DYNAMIC_CRC_TABLE
|
|
||||||
if (crc_table_empty)
|
|
||||||
make_crc_table();
|
|
||||||
#endif /* DYNAMIC_CRC_TABLE */
|
|
||||||
|
|
||||||
#ifdef BYFOUR
|
|
||||||
if (sizeof(void *) == sizeof(ptrdiff_t)) {
|
|
||||||
z_crc_t endian;
|
|
||||||
|
|
||||||
endian = 1;
|
|
||||||
if (*((unsigned char *)(&endian)))
|
|
||||||
return crc32_little(crc, buf, len);
|
|
||||||
else
|
|
||||||
return crc32_big(crc, buf, len);
|
|
||||||
}
|
|
||||||
#endif /* BYFOUR */
|
|
||||||
crc = crc ^ 0xffffffffUL;
|
|
||||||
while (len >= 8) {
|
|
||||||
DO8;
|
|
||||||
len -= 8;
|
|
||||||
}
|
|
||||||
if (len) do {
|
|
||||||
DO1;
|
|
||||||
} while (--len);
|
|
||||||
return crc ^ 0xffffffffUL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
unsigned long ZEXPORT crc32(crc, buf, len)
|
|
||||||
unsigned long crc;
|
|
||||||
const unsigned char FAR *buf;
|
|
||||||
uInt len;
|
|
||||||
{
|
|
||||||
return crc32_z(crc, buf, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef BYFOUR
|
|
||||||
|
|
||||||
/*
|
|
||||||
This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit
|
|
||||||
integer pointer type. This violates the strict aliasing rule, where a
|
|
||||||
compiler can assume, for optimization purposes, that two pointers to
|
|
||||||
fundamentally different types won't ever point to the same memory. This can
|
|
||||||
manifest as a problem only if one of the pointers is written to. This code
|
|
||||||
only reads from those pointers. So long as this code remains isolated in
|
|
||||||
this compilation unit, there won't be a problem. For this reason, this code
|
|
||||||
should not be copied and pasted into a compilation unit in which other code
|
|
||||||
writes to the buffer that is passed to these routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DOLIT4 c ^= *buf4++; \
|
|
||||||
c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
|
|
||||||
crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
|
|
||||||
#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local unsigned long crc32_little(crc, buf, len)
|
|
||||||
unsigned long crc;
|
|
||||||
const unsigned char FAR *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
register z_crc_t c;
|
|
||||||
register const z_crc_t FAR *buf4;
|
|
||||||
|
|
||||||
c = (z_crc_t)crc;
|
|
||||||
c = ~c;
|
|
||||||
while (len && ((ptrdiff_t)buf & 3)) {
|
|
||||||
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
|
|
||||||
while (len >= 32) {
|
|
||||||
DOLIT32;
|
|
||||||
len -= 32;
|
|
||||||
}
|
|
||||||
while (len >= 4) {
|
|
||||||
DOLIT4;
|
|
||||||
len -= 4;
|
|
||||||
}
|
|
||||||
buf = (const unsigned char FAR *)buf4;
|
|
||||||
|
|
||||||
if (len) do {
|
|
||||||
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
|
|
||||||
} while (--len);
|
|
||||||
c = ~c;
|
|
||||||
return (unsigned long)c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
#define DOBIG4 c ^= *buf4++; \
|
|
||||||
c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
|
|
||||||
crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
|
|
||||||
#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local unsigned long crc32_big(crc, buf, len)
|
|
||||||
unsigned long crc;
|
|
||||||
const unsigned char FAR *buf;
|
|
||||||
z_size_t len;
|
|
||||||
{
|
|
||||||
register z_crc_t c;
|
|
||||||
register const z_crc_t FAR *buf4;
|
|
||||||
|
|
||||||
c = ZSWAP32((z_crc_t)crc);
|
|
||||||
c = ~c;
|
|
||||||
while (len && ((ptrdiff_t)buf & 3)) {
|
|
||||||
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
|
|
||||||
while (len >= 32) {
|
|
||||||
DOBIG32;
|
|
||||||
len -= 32;
|
|
||||||
}
|
|
||||||
while (len >= 4) {
|
|
||||||
DOBIG4;
|
|
||||||
len -= 4;
|
|
||||||
}
|
|
||||||
buf = (const unsigned char FAR *)buf4;
|
|
||||||
|
|
||||||
if (len) do {
|
|
||||||
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
|
|
||||||
} while (--len);
|
|
||||||
c = ~c;
|
|
||||||
return (unsigned long)(ZSWAP32(c));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* BYFOUR */
|
|
||||||
|
|
||||||
#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local unsigned long gf2_matrix_times(mat, vec)
|
|
||||||
unsigned long *mat;
|
|
||||||
unsigned long vec;
|
|
||||||
{
|
|
||||||
unsigned long sum;
|
|
||||||
|
|
||||||
sum = 0;
|
|
||||||
while (vec) {
|
|
||||||
if (vec & 1)
|
|
||||||
sum ^= *mat;
|
|
||||||
vec >>= 1;
|
|
||||||
mat++;
|
|
||||||
}
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local void gf2_matrix_square(square, mat)
|
|
||||||
unsigned long *square;
|
|
||||||
unsigned long *mat;
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
for (n = 0; n < GF2_DIM; n++)
|
|
||||||
square[n] = gf2_matrix_times(mat, mat[n]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
local uLong crc32_combine_(crc1, crc2, len2)
|
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
unsigned long row;
|
|
||||||
unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
|
|
||||||
unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
|
|
||||||
|
|
||||||
/* degenerate case (also disallow negative lengths) */
|
|
||||||
if (len2 <= 0)
|
|
||||||
return crc1;
|
|
||||||
|
|
||||||
/* put operator for one zero bit in odd */
|
|
||||||
odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
|
|
||||||
row = 1;
|
|
||||||
for (n = 1; n < GF2_DIM; n++) {
|
|
||||||
odd[n] = row;
|
|
||||||
row <<= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* put operator for two zero bits in even */
|
|
||||||
gf2_matrix_square(even, odd);
|
|
||||||
|
|
||||||
/* put operator for four zero bits in odd */
|
|
||||||
gf2_matrix_square(odd, even);
|
|
||||||
|
|
||||||
/* apply len2 zeros to crc1 (first square will put the operator for one
|
|
||||||
zero byte, eight zero bits, in even) */
|
|
||||||
do {
|
|
||||||
/* apply zeros operator for this bit of len2 */
|
|
||||||
gf2_matrix_square(even, odd);
|
|
||||||
if (len2 & 1)
|
|
||||||
crc1 = gf2_matrix_times(even, crc1);
|
|
||||||
len2 >>= 1;
|
|
||||||
|
|
||||||
/* if no more bits set, then done */
|
|
||||||
if (len2 == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* another iteration of the loop with odd and even swapped */
|
|
||||||
gf2_matrix_square(odd, even);
|
|
||||||
if (len2 & 1)
|
|
||||||
crc1 = gf2_matrix_times(odd, crc1);
|
|
||||||
len2 >>= 1;
|
|
||||||
|
|
||||||
/* if no more bits set, then done */
|
|
||||||
} while (len2 != 0);
|
|
||||||
|
|
||||||
/* return combined crc */
|
|
||||||
crc1 ^= crc2;
|
|
||||||
return crc1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ========================================================================= */
|
|
||||||
uLong ZEXPORT crc32_combine(crc1, crc2, len2)
|
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
z_off_t len2;
|
|
||||||
{
|
|
||||||
return crc32_combine_(crc1, crc2, len2);
|
|
||||||
}
|
|
||||||
|
|
||||||
uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
|
|
||||||
uLong crc1;
|
|
||||||
uLong crc2;
|
|
||||||
z_off64_t len2;
|
|
||||||
{
|
|
||||||
return crc32_combine_(crc1, crc2, len2);
|
|
||||||
}
|
|
441
test/extern/zlib-1.2.11/crc32.h
vendored
441
test/extern/zlib-1.2.11/crc32.h
vendored
@ -1,441 +0,0 @@
|
|||||||
/* crc32.h -- tables for rapid CRC calculation
|
|
||||||
* Generated automatically by crc32.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
local const z_crc_t FAR crc_table[TBLS][256] =
|
|
||||||
{
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
|
|
||||||
0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
|
|
||||||
0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
|
|
||||||
0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
|
|
||||||
0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
|
|
||||||
0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
|
|
||||||
0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
|
|
||||||
0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
|
|
||||||
0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
|
|
||||||
0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
|
|
||||||
0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
|
|
||||||
0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
|
|
||||||
0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
|
|
||||||
0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
|
|
||||||
0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
|
|
||||||
0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
|
|
||||||
0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
|
|
||||||
0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
|
|
||||||
0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
|
|
||||||
0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
|
|
||||||
0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
|
|
||||||
0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
|
|
||||||
0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
|
|
||||||
0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
|
|
||||||
0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
|
|
||||||
0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
|
|
||||||
0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
|
|
||||||
0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
|
|
||||||
0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
|
|
||||||
0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
|
|
||||||
0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
|
|
||||||
0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
|
|
||||||
0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
|
|
||||||
0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
|
|
||||||
0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
|
|
||||||
0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
|
|
||||||
0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
|
|
||||||
0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
|
|
||||||
0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
|
|
||||||
0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
|
|
||||||
0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
|
|
||||||
0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
|
|
||||||
0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
|
|
||||||
0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
|
|
||||||
0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
|
|
||||||
0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
|
|
||||||
0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
|
|
||||||
0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
|
|
||||||
0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
|
|
||||||
0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
|
|
||||||
0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
|
|
||||||
0x2d02ef8dUL
|
|
||||||
#ifdef BYFOUR
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
|
|
||||||
0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
|
|
||||||
0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
|
|
||||||
0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
|
|
||||||
0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
|
|
||||||
0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
|
|
||||||
0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
|
|
||||||
0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
|
|
||||||
0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
|
|
||||||
0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
|
|
||||||
0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
|
|
||||||
0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
|
|
||||||
0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
|
|
||||||
0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
|
|
||||||
0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
|
|
||||||
0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
|
|
||||||
0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
|
|
||||||
0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
|
|
||||||
0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
|
|
||||||
0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
|
|
||||||
0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
|
|
||||||
0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
|
|
||||||
0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
|
|
||||||
0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
|
|
||||||
0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
|
|
||||||
0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
|
|
||||||
0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
|
|
||||||
0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
|
|
||||||
0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
|
|
||||||
0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
|
|
||||||
0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
|
|
||||||
0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
|
|
||||||
0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
|
|
||||||
0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
|
|
||||||
0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
|
|
||||||
0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
|
|
||||||
0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
|
|
||||||
0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
|
|
||||||
0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
|
|
||||||
0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
|
|
||||||
0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
|
|
||||||
0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
|
|
||||||
0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
|
|
||||||
0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
|
|
||||||
0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
|
|
||||||
0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
|
|
||||||
0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
|
|
||||||
0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
|
|
||||||
0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
|
|
||||||
0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
|
|
||||||
0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
|
|
||||||
0x9324fd72UL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
|
|
||||||
0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
|
|
||||||
0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
|
|
||||||
0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
|
|
||||||
0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
|
|
||||||
0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
|
|
||||||
0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
|
|
||||||
0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
|
|
||||||
0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
|
|
||||||
0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
|
|
||||||
0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
|
|
||||||
0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
|
|
||||||
0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
|
|
||||||
0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
|
|
||||||
0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
|
|
||||||
0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
|
|
||||||
0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
|
|
||||||
0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
|
|
||||||
0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
|
|
||||||
0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
|
|
||||||
0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
|
|
||||||
0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
|
|
||||||
0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
|
|
||||||
0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
|
|
||||||
0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
|
|
||||||
0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
|
|
||||||
0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
|
|
||||||
0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
|
|
||||||
0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
|
|
||||||
0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
|
|
||||||
0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
|
|
||||||
0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
|
|
||||||
0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
|
|
||||||
0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
|
|
||||||
0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
|
|
||||||
0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
|
|
||||||
0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
|
|
||||||
0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
|
|
||||||
0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
|
|
||||||
0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
|
|
||||||
0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
|
|
||||||
0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
|
|
||||||
0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
|
|
||||||
0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
|
|
||||||
0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
|
|
||||||
0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
|
|
||||||
0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
|
|
||||||
0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
|
|
||||||
0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
|
|
||||||
0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
|
|
||||||
0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
|
|
||||||
0xbe9834edUL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
|
|
||||||
0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
|
|
||||||
0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
|
|
||||||
0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
|
|
||||||
0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
|
|
||||||
0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
|
|
||||||
0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
|
|
||||||
0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
|
|
||||||
0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
|
|
||||||
0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
|
|
||||||
0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
|
|
||||||
0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
|
|
||||||
0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
|
|
||||||
0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
|
|
||||||
0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
|
|
||||||
0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
|
|
||||||
0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
|
|
||||||
0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
|
|
||||||
0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
|
|
||||||
0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
|
|
||||||
0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
|
|
||||||
0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
|
|
||||||
0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
|
|
||||||
0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
|
|
||||||
0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
|
|
||||||
0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
|
|
||||||
0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
|
|
||||||
0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
|
|
||||||
0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
|
|
||||||
0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
|
|
||||||
0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
|
|
||||||
0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
|
|
||||||
0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
|
|
||||||
0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
|
|
||||||
0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
|
|
||||||
0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
|
|
||||||
0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
|
|
||||||
0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
|
|
||||||
0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
|
|
||||||
0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
|
|
||||||
0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
|
|
||||||
0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
|
|
||||||
0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
|
|
||||||
0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
|
|
||||||
0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
|
|
||||||
0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
|
|
||||||
0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
|
|
||||||
0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
|
|
||||||
0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
|
|
||||||
0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
|
|
||||||
0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
|
|
||||||
0xde0506f1UL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
|
|
||||||
0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
|
|
||||||
0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
|
|
||||||
0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
|
|
||||||
0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
|
|
||||||
0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
|
|
||||||
0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
|
|
||||||
0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
|
|
||||||
0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
|
|
||||||
0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
|
|
||||||
0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
|
|
||||||
0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
|
|
||||||
0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
|
|
||||||
0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
|
|
||||||
0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
|
|
||||||
0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
|
|
||||||
0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
|
|
||||||
0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
|
|
||||||
0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
|
|
||||||
0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
|
|
||||||
0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
|
|
||||||
0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
|
|
||||||
0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
|
|
||||||
0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
|
|
||||||
0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
|
|
||||||
0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
|
|
||||||
0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
|
|
||||||
0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
|
|
||||||
0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
|
|
||||||
0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
|
|
||||||
0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
|
|
||||||
0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
|
|
||||||
0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
|
|
||||||
0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
|
|
||||||
0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
|
|
||||||
0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
|
|
||||||
0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
|
|
||||||
0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
|
|
||||||
0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
|
|
||||||
0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
|
|
||||||
0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
|
|
||||||
0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
|
|
||||||
0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
|
|
||||||
0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
|
|
||||||
0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
|
|
||||||
0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
|
|
||||||
0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
|
|
||||||
0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
|
|
||||||
0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
|
|
||||||
0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
|
|
||||||
0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
|
|
||||||
0x8def022dUL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
|
|
||||||
0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
|
|
||||||
0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
|
|
||||||
0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
|
|
||||||
0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
|
|
||||||
0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
|
|
||||||
0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
|
|
||||||
0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
|
|
||||||
0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
|
|
||||||
0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
|
|
||||||
0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
|
|
||||||
0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
|
|
||||||
0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
|
|
||||||
0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
|
|
||||||
0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
|
|
||||||
0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
|
|
||||||
0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
|
|
||||||
0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
|
|
||||||
0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
|
|
||||||
0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
|
|
||||||
0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
|
|
||||||
0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
|
|
||||||
0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
|
|
||||||
0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
|
|
||||||
0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
|
|
||||||
0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
|
|
||||||
0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
|
|
||||||
0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
|
|
||||||
0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
|
|
||||||
0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
|
|
||||||
0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
|
|
||||||
0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
|
|
||||||
0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
|
|
||||||
0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
|
|
||||||
0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
|
|
||||||
0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
|
|
||||||
0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
|
|
||||||
0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
|
|
||||||
0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
|
|
||||||
0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
|
|
||||||
0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
|
|
||||||
0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
|
|
||||||
0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
|
|
||||||
0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
|
|
||||||
0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
|
|
||||||
0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
|
|
||||||
0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
|
|
||||||
0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
|
|
||||||
0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
|
|
||||||
0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
|
|
||||||
0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
|
|
||||||
0x72fd2493UL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
|
|
||||||
0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
|
|
||||||
0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
|
|
||||||
0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
|
|
||||||
0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
|
|
||||||
0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
|
|
||||||
0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
|
|
||||||
0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
|
|
||||||
0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
|
|
||||||
0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
|
|
||||||
0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
|
|
||||||
0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
|
|
||||||
0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
|
|
||||||
0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
|
|
||||||
0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
|
|
||||||
0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
|
|
||||||
0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
|
|
||||||
0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
|
|
||||||
0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
|
|
||||||
0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
|
|
||||||
0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
|
|
||||||
0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
|
|
||||||
0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
|
|
||||||
0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
|
|
||||||
0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
|
|
||||||
0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
|
|
||||||
0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
|
|
||||||
0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
|
|
||||||
0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
|
|
||||||
0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
|
|
||||||
0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
|
|
||||||
0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
|
|
||||||
0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
|
|
||||||
0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
|
|
||||||
0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
|
|
||||||
0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
|
|
||||||
0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
|
|
||||||
0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
|
|
||||||
0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
|
|
||||||
0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
|
|
||||||
0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
|
|
||||||
0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
|
|
||||||
0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
|
|
||||||
0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
|
|
||||||
0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
|
|
||||||
0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
|
|
||||||
0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
|
|
||||||
0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
|
|
||||||
0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
|
|
||||||
0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
|
|
||||||
0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
|
|
||||||
0xed3498beUL
|
|
||||||
},
|
|
||||||
{
|
|
||||||
0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
|
|
||||||
0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
|
|
||||||
0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
|
|
||||||
0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
|
|
||||||
0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
|
|
||||||
0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
|
|
||||||
0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
|
|
||||||
0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
|
|
||||||
0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
|
|
||||||
0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
|
|
||||||
0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
|
|
||||||
0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
|
|
||||||
0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
|
|
||||||
0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
|
|
||||||
0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
|
|
||||||
0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
|
|
||||||
0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
|
|
||||||
0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
|
|
||||||
0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
|
|
||||||
0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
|
|
||||||
0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
|
|
||||||
0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
|
|
||||||
0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
|
|
||||||
0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
|
|
||||||
0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
|
|
||||||
0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
|
|
||||||
0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
|
|
||||||
0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
|
|
||||||
0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
|
|
||||||
0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
|
|
||||||
0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
|
|
||||||
0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
|
|
||||||
0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
|
|
||||||
0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
|
|
||||||
0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
|
|
||||||
0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
|
|
||||||
0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
|
|
||||||
0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
|
|
||||||
0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
|
|
||||||
0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
|
|
||||||
0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
|
|
||||||
0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
|
|
||||||
0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
|
|
||||||
0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
|
|
||||||
0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
|
|
||||||
0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
|
|
||||||
0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
|
|
||||||
0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
|
|
||||||
0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
|
|
||||||
0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
|
|
||||||
0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
|
|
||||||
0xf10605deUL
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
};
|
|
572
test/extern/zlib-1.2.11/examples/enough.c
vendored
572
test/extern/zlib-1.2.11/examples/enough.c
vendored
@ -1,572 +0,0 @@
|
|||||||
/* enough.c -- determine the maximum size of inflate's Huffman code tables over
|
|
||||||
* all possible valid and complete Huffman codes, subject to a length limit.
|
|
||||||
* Copyright (C) 2007, 2008, 2012 Mark Adler
|
|
||||||
* Version 1.4 18 August 2012 Mark Adler
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Version history:
|
|
||||||
1.0 3 Jan 2007 First version (derived from codecount.c version 1.4)
|
|
||||||
1.1 4 Jan 2007 Use faster incremental table usage computation
|
|
||||||
Prune examine() search on previously visited states
|
|
||||||
1.2 5 Jan 2007 Comments clean up
|
|
||||||
As inflate does, decrease root for short codes
|
|
||||||
Refuse cases where inflate would increase root
|
|
||||||
1.3 17 Feb 2008 Add argument for initial root table size
|
|
||||||
Fix bug for initial root table size == max - 1
|
|
||||||
Use a macro to compute the history index
|
|
||||||
1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!)
|
|
||||||
Clean up comparisons of different types
|
|
||||||
Clean up code indentation
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
Examine all possible Huffman codes for a given number of symbols and a
|
|
||||||
maximum code length in bits to determine the maximum table size for zilb's
|
|
||||||
inflate. Only complete Huffman codes are counted.
|
|
||||||
|
|
||||||
Two codes are considered distinct if the vectors of the number of codes per
|
|
||||||
length are not identical. So permutations of the symbol assignments result
|
|
||||||
in the same code for the counting, as do permutations of the assignments of
|
|
||||||
the bit values to the codes (i.e. only canonical codes are counted).
|
|
||||||
|
|
||||||
We build a code from shorter to longer lengths, determining how many symbols
|
|
||||||
are coded at each length. At each step, we have how many symbols remain to
|
|
||||||
be coded, what the last code length used was, and how many bit patterns of
|
|
||||||
that length remain unused. Then we add one to the code length and double the
|
|
||||||
number of unused patterns to graduate to the next code length. We then
|
|
||||||
assign all portions of the remaining symbols to that code length that
|
|
||||||
preserve the properties of a correct and eventually complete code. Those
|
|
||||||
properties are: we cannot use more bit patterns than are available; and when
|
|
||||||
all the symbols are used, there are exactly zero possible bit patterns
|
|
||||||
remaining.
|
|
||||||
|
|
||||||
The inflate Huffman decoding algorithm uses two-level lookup tables for
|
|
||||||
speed. There is a single first-level table to decode codes up to root bits
|
|
||||||
in length (root == 9 in the current inflate implementation). The table
|
|
||||||
has 1 << root entries and is indexed by the next root bits of input. Codes
|
|
||||||
shorter than root bits have replicated table entries, so that the correct
|
|
||||||
entry is pointed to regardless of the bits that follow the short code. If
|
|
||||||
the code is longer than root bits, then the table entry points to a second-
|
|
||||||
level table. The size of that table is determined by the longest code with
|
|
||||||
that root-bit prefix. If that longest code has length len, then the table
|
|
||||||
has size 1 << (len - root), to index the remaining bits in that set of
|
|
||||||
codes. Each subsequent root-bit prefix then has its own sub-table. The
|
|
||||||
total number of table entries required by the code is calculated
|
|
||||||
incrementally as the number of codes at each bit length is populated. When
|
|
||||||
all of the codes are shorter than root bits, then root is reduced to the
|
|
||||||
longest code length, resulting in a single, smaller, one-level table.
|
|
||||||
|
|
||||||
The inflate algorithm also provides for small values of root (relative to
|
|
||||||
the log2 of the number of symbols), where the shortest code has more bits
|
|
||||||
than root. In that case, root is increased to the length of the shortest
|
|
||||||
code. This program, by design, does not handle that case, so it is verified
|
|
||||||
that the number of symbols is less than 2^(root + 1).
|
|
||||||
|
|
||||||
In order to speed up the examination (by about ten orders of magnitude for
|
|
||||||
the default arguments), the intermediate states in the build-up of a code
|
|
||||||
are remembered and previously visited branches are pruned. The memory
|
|
||||||
required for this will increase rapidly with the total number of symbols and
|
|
||||||
the maximum code length in bits. However this is a very small price to pay
|
|
||||||
for the vast speedup.
|
|
||||||
|
|
||||||
First, all of the possible Huffman codes are counted, and reachable
|
|
||||||
intermediate states are noted by a non-zero count in a saved-results array.
|
|
||||||
Second, the intermediate states that lead to (root + 1) bit or longer codes
|
|
||||||
are used to look at all sub-codes from those junctures for their inflate
|
|
||||||
memory usage. (The amount of memory used is not affected by the number of
|
|
||||||
codes of root bits or less in length.) Third, the visited states in the
|
|
||||||
construction of those sub-codes and the associated calculation of the table
|
|
||||||
size is recalled in order to avoid recalculating from the same juncture.
|
|
||||||
Beginning the code examination at (root + 1) bit codes, which is enabled by
|
|
||||||
identifying the reachable nodes, accounts for about six of the orders of
|
|
||||||
magnitude of improvement for the default arguments. About another four
|
|
||||||
orders of magnitude come from not revisiting previous states. Out of
|
|
||||||
approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes
|
|
||||||
need to be examined to cover all of the possible table memory usage cases
|
|
||||||
for the default arguments of 286 symbols limited to 15-bit codes.
|
|
||||||
|
|
||||||
Note that an unsigned long long type is used for counting. It is quite easy
|
|
||||||
to exceed the capacity of an eight-byte integer with a large number of
|
|
||||||
symbols and a large maximum code length, so multiple-precision arithmetic
|
|
||||||
would need to replace the unsigned long long arithmetic in that case. This
|
|
||||||
program will abort if an overflow occurs. The big_t type identifies where
|
|
||||||
the counting takes place.
|
|
||||||
|
|
||||||
An unsigned long long type is also used for calculating the number of
|
|
||||||
possible codes remaining at the maximum length. This limits the maximum
|
|
||||||
code length to the number of bits in a long long minus the number of bits
|
|
||||||
needed to represent the symbols in a flat code. The code_t type identifies
|
|
||||||
where the bit pattern counting takes place.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#define local static
|
|
||||||
|
|
||||||
/* special data types */
|
|
||||||
typedef unsigned long long big_t; /* type for code counting */
|
|
||||||
typedef unsigned long long code_t; /* type for bit pattern counting */
|
|
||||||
struct tab { /* type for been here check */
|
|
||||||
size_t len; /* length of bit vector in char's */
|
|
||||||
char *vec; /* allocated bit vector */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* The array for saving results, num[], is indexed with this triplet:
|
|
||||||
|
|
||||||
syms: number of symbols remaining to code
|
|
||||||
left: number of available bit patterns at length len
|
|
||||||
len: number of bits in the codes currently being assigned
|
|
||||||
|
|
||||||
Those indices are constrained thusly when saving results:
|
|
||||||
|
|
||||||
syms: 3..totsym (totsym == total symbols to code)
|
|
||||||
left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6)
|
|
||||||
len: 1..max - 1 (max == maximum code length in bits)
|
|
||||||
|
|
||||||
syms == 2 is not saved since that immediately leads to a single code. left
|
|
||||||
must be even, since it represents the number of available bit patterns at
|
|
||||||
the current length, which is double the number at the previous length.
|
|
||||||
left ends at syms-1 since left == syms immediately results in a single code.
|
|
||||||
(left > sym is not allowed since that would result in an incomplete code.)
|
|
||||||
len is less than max, since the code completes immediately when len == max.
|
|
||||||
|
|
||||||
The offset into the array is calculated for the three indices with the
|
|
||||||
first one (syms) being outermost, and the last one (len) being innermost.
|
|
||||||
We build the array with length max-1 lists for the len index, with syms-3
|
|
||||||
of those for each symbol. There are totsym-2 of those, with each one
|
|
||||||
varying in length as a function of sym. See the calculation of index in
|
|
||||||
count() for the index, and the calculation of size in main() for the size
|
|
||||||
of the array.
|
|
||||||
|
|
||||||
For the deflate example of 286 symbols limited to 15-bit codes, the array
|
|
||||||
has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than
|
|
||||||
half of the space allocated for saved results is actually used -- not all
|
|
||||||
possible triplets are reached in the generation of valid Huffman codes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The array for tracking visited states, done[], is itself indexed identically
|
|
||||||
to the num[] array as described above for the (syms, left, len) triplet.
|
|
||||||
Each element in the array is further indexed by the (mem, rem) doublet,
|
|
||||||
where mem is the amount of inflate table space used so far, and rem is the
|
|
||||||
remaining unused entries in the current inflate sub-table. Each indexed
|
|
||||||
element is simply one bit indicating whether the state has been visited or
|
|
||||||
not. Since the ranges for mem and rem are not known a priori, each bit
|
|
||||||
vector is of a variable size, and grows as needed to accommodate the visited
|
|
||||||
states. mem and rem are used to calculate a single index in a triangular
|
|
||||||
array. Since the range of mem is expected in the default case to be about
|
|
||||||
ten times larger than the range of rem, the array is skewed to reduce the
|
|
||||||
memory usage, with eight times the range for mem than for rem. See the
|
|
||||||
calculations for offset and bit in beenhere() for the details.
|
|
||||||
|
|
||||||
For the deflate example of 286 symbols limited to 15-bit codes, the bit
|
|
||||||
vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[]
|
|
||||||
array itself.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Globals to avoid propagating constants or constant pointers recursively */
|
|
||||||
local int max; /* maximum allowed bit length for the codes */
|
|
||||||
local int root; /* size of base code table in bits */
|
|
||||||
local int large; /* largest code table so far */
|
|
||||||
local size_t size; /* number of elements in num and done */
|
|
||||||
local int *code; /* number of symbols assigned to each bit length */
|
|
||||||
local big_t *num; /* saved results array for code counting */
|
|
||||||
local struct tab *done; /* states already evaluated array */
|
|
||||||
|
|
||||||
/* Index function for num[] and done[] */
|
|
||||||
#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1)
|
|
||||||
|
|
||||||
/* Free allocated space. Uses globals code, num, and done. */
|
|
||||||
local void cleanup(void)
|
|
||||||
{
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
if (done != NULL) {
|
|
||||||
for (n = 0; n < size; n++)
|
|
||||||
if (done[n].len)
|
|
||||||
free(done[n].vec);
|
|
||||||
free(done);
|
|
||||||
}
|
|
||||||
if (num != NULL)
|
|
||||||
free(num);
|
|
||||||
if (code != NULL)
|
|
||||||
free(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the number of possible Huffman codes using bit patterns of lengths
|
|
||||||
len through max inclusive, coding syms symbols, with left bit patterns of
|
|
||||||
length len unused -- return -1 if there is an overflow in the counting.
|
|
||||||
Keep a record of previous results in num to prevent repeating the same
|
|
||||||
calculation. Uses the globals max and num. */
|
|
||||||
local big_t count(int syms, int len, int left)
|
|
||||||
{
|
|
||||||
big_t sum; /* number of possible codes from this juncture */
|
|
||||||
big_t got; /* value returned from count() */
|
|
||||||
int least; /* least number of syms to use at this juncture */
|
|
||||||
int most; /* most number of syms to use at this juncture */
|
|
||||||
int use; /* number of bit patterns to use in next call */
|
|
||||||
size_t index; /* index of this case in *num */
|
|
||||||
|
|
||||||
/* see if only one possible code */
|
|
||||||
if (syms == left)
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
/* note and verify the expected state */
|
|
||||||
assert(syms > left && left > 0 && len < max);
|
|
||||||
|
|
||||||
/* see if we've done this one already */
|
|
||||||
index = INDEX(syms, left, len);
|
|
||||||
got = num[index];
|
|
||||||
if (got)
|
|
||||||
return got; /* we have -- return the saved result */
|
|
||||||
|
|
||||||
/* we need to use at least this many bit patterns so that the code won't be
|
|
||||||
incomplete at the next length (more bit patterns than symbols) */
|
|
||||||
least = (left << 1) - syms;
|
|
||||||
if (least < 0)
|
|
||||||
least = 0;
|
|
||||||
|
|
||||||
/* we can use at most this many bit patterns, lest there not be enough
|
|
||||||
available for the remaining symbols at the maximum length (if there were
|
|
||||||
no limit to the code length, this would become: most = left - 1) */
|
|
||||||
most = (((code_t)left << (max - len)) - syms) /
|
|
||||||
(((code_t)1 << (max - len)) - 1);
|
|
||||||
|
|
||||||
/* count all possible codes from this juncture and add them up */
|
|
||||||
sum = 0;
|
|
||||||
for (use = least; use <= most; use++) {
|
|
||||||
got = count(syms - use, len + 1, (left - use) << 1);
|
|
||||||
sum += got;
|
|
||||||
if (got == (big_t)0 - 1 || sum < got) /* overflow */
|
|
||||||
return (big_t)0 - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* verify that all recursive calls are productive */
|
|
||||||
assert(sum != 0);
|
|
||||||
|
|
||||||
/* save the result and return it */
|
|
||||||
num[index] = sum;
|
|
||||||
return sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return true if we've been here before, set to true if not. Set a bit in a
|
|
||||||
bit vector to indicate visiting this state. Each (syms,len,left) state
|
|
||||||
has a variable size bit vector indexed by (mem,rem). The bit vector is
|
|
||||||
lengthened if needed to allow setting the (mem,rem) bit. */
|
|
||||||
local int beenhere(int syms, int len, int left, int mem, int rem)
|
|
||||||
{
|
|
||||||
size_t index; /* index for this state's bit vector */
|
|
||||||
size_t offset; /* offset in this state's bit vector */
|
|
||||||
int bit; /* mask for this state's bit */
|
|
||||||
size_t length; /* length of the bit vector in bytes */
|
|
||||||
char *vector; /* new or enlarged bit vector */
|
|
||||||
|
|
||||||
/* point to vector for (syms,left,len), bit in vector for (mem,rem) */
|
|
||||||
index = INDEX(syms, left, len);
|
|
||||||
mem -= 1 << root;
|
|
||||||
offset = (mem >> 3) + rem;
|
|
||||||
offset = ((offset * (offset + 1)) >> 1) + rem;
|
|
||||||
bit = 1 << (mem & 7);
|
|
||||||
|
|
||||||
/* see if we've been here */
|
|
||||||
length = done[index].len;
|
|
||||||
if (offset < length && (done[index].vec[offset] & bit) != 0)
|
|
||||||
return 1; /* done this! */
|
|
||||||
|
|
||||||
/* we haven't been here before -- set the bit to show we have now */
|
|
||||||
|
|
||||||
/* see if we need to lengthen the vector in order to set the bit */
|
|
||||||
if (length <= offset) {
|
|
||||||
/* if we have one already, enlarge it, zero out the appended space */
|
|
||||||
if (length) {
|
|
||||||
do {
|
|
||||||
length <<= 1;
|
|
||||||
} while (length <= offset);
|
|
||||||
vector = realloc(done[index].vec, length);
|
|
||||||
if (vector != NULL)
|
|
||||||
memset(vector + done[index].len, 0, length - done[index].len);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* otherwise we need to make a new vector and zero it out */
|
|
||||||
else {
|
|
||||||
length = 1 << (len - root);
|
|
||||||
while (length <= offset)
|
|
||||||
length <<= 1;
|
|
||||||
vector = calloc(length, sizeof(char));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* in either case, bail if we can't get the memory */
|
|
||||||
if (vector == NULL) {
|
|
||||||
fputs("abort: unable to allocate enough memory\n", stderr);
|
|
||||||
cleanup();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* install the new vector */
|
|
||||||
done[index].len = length;
|
|
||||||
done[index].vec = vector;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set the bit */
|
|
||||||
done[index].vec[offset] |= bit;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Examine all possible codes from the given node (syms, len, left). Compute
|
|
||||||
the amount of memory required to build inflate's decoding tables, where the
|
|
||||||
number of code structures used so far is mem, and the number remaining in
|
|
||||||
the current sub-table is rem. Uses the globals max, code, root, large, and
|
|
||||||
done. */
|
|
||||||
local void examine(int syms, int len, int left, int mem, int rem)
|
|
||||||
{
|
|
||||||
int least; /* least number of syms to use at this juncture */
|
|
||||||
int most; /* most number of syms to use at this juncture */
|
|
||||||
int use; /* number of bit patterns to use in next call */
|
|
||||||
|
|
||||||
/* see if we have a complete code */
|
|
||||||
if (syms == left) {
|
|
||||||
/* set the last code entry */
|
|
||||||
code[len] = left;
|
|
||||||
|
|
||||||
/* complete computation of memory used by this code */
|
|
||||||
while (rem < left) {
|
|
||||||
left -= rem;
|
|
||||||
rem = 1 << (len - root);
|
|
||||||
mem += rem;
|
|
||||||
}
|
|
||||||
assert(rem == left);
|
|
||||||
|
|
||||||
/* if this is a new maximum, show the entries used and the sub-code */
|
|
||||||
if (mem > large) {
|
|
||||||
large = mem;
|
|
||||||
printf("max %d: ", mem);
|
|
||||||
for (use = root + 1; use <= max; use++)
|
|
||||||
if (code[use])
|
|
||||||
printf("%d[%d] ", code[use], use);
|
|
||||||
putchar('\n');
|
|
||||||
fflush(stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove entries as we drop back down in the recursion */
|
|
||||||
code[len] = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* prune the tree if we can */
|
|
||||||
if (beenhere(syms, len, left, mem, rem))
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* we need to use at least this many bit patterns so that the code won't be
|
|
||||||
incomplete at the next length (more bit patterns than symbols) */
|
|
||||||
least = (left << 1) - syms;
|
|
||||||
if (least < 0)
|
|
||||||
least = 0;
|
|
||||||
|
|
||||||
/* we can use at most this many bit patterns, lest there not be enough
|
|
||||||
available for the remaining symbols at the maximum length (if there were
|
|
||||||
no limit to the code length, this would become: most = left - 1) */
|
|
||||||
most = (((code_t)left << (max - len)) - syms) /
|
|
||||||
(((code_t)1 << (max - len)) - 1);
|
|
||||||
|
|
||||||
/* occupy least table spaces, creating new sub-tables as needed */
|
|
||||||
use = least;
|
|
||||||
while (rem < use) {
|
|
||||||
use -= rem;
|
|
||||||
rem = 1 << (len - root);
|
|
||||||
mem += rem;
|
|
||||||
}
|
|
||||||
rem -= use;
|
|
||||||
|
|
||||||
/* examine codes from here, updating table space as we go */
|
|
||||||
for (use = least; use <= most; use++) {
|
|
||||||
code[len] = use;
|
|
||||||
examine(syms - use, len + 1, (left - use) << 1,
|
|
||||||
mem + (rem ? 1 << (len - root) : 0), rem << 1);
|
|
||||||
if (rem == 0) {
|
|
||||||
rem = 1 << (len - root);
|
|
||||||
mem += rem;
|
|
||||||
}
|
|
||||||
rem--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* remove entries as we drop back down in the recursion */
|
|
||||||
code[len] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look at all sub-codes starting with root + 1 bits. Look at only the valid
|
|
||||||
intermediate code states (syms, left, len). For each completed code,
|
|
||||||
calculate the amount of memory required by inflate to build the decoding
|
|
||||||
tables. Find the maximum amount of memory required and show the code that
|
|
||||||
requires that maximum. Uses the globals max, root, and num. */
|
|
||||||
local void enough(int syms)
|
|
||||||
{
|
|
||||||
int n; /* number of remaing symbols for this node */
|
|
||||||
int left; /* number of unused bit patterns at this length */
|
|
||||||
size_t index; /* index of this case in *num */
|
|
||||||
|
|
||||||
/* clear code */
|
|
||||||
for (n = 0; n <= max; n++)
|
|
||||||
code[n] = 0;
|
|
||||||
|
|
||||||
/* look at all (root + 1) bit and longer codes */
|
|
||||||
large = 1 << root; /* base table */
|
|
||||||
if (root < max) /* otherwise, there's only a base table */
|
|
||||||
for (n = 3; n <= syms; n++)
|
|
||||||
for (left = 2; left < n; left += 2)
|
|
||||||
{
|
|
||||||
/* look at all reachable (root + 1) bit nodes, and the
|
|
||||||
resulting codes (complete at root + 2 or more) */
|
|
||||||
index = INDEX(n, left, root + 1);
|
|
||||||
if (root + 1 < max && num[index]) /* reachable node */
|
|
||||||
examine(n, root + 1, left, 1 << root, 0);
|
|
||||||
|
|
||||||
/* also look at root bit codes with completions at root + 1
|
|
||||||
bits (not saved in num, since complete), just in case */
|
|
||||||
if (num[index - 1] && n <= left << 1)
|
|
||||||
examine((n - left) << 1, root + 1, (n - left) << 1,
|
|
||||||
1 << root, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* done */
|
|
||||||
printf("done: maximum of %d table entries\n", large);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
Examine and show the total number of possible Huffman codes for a given
|
|
||||||
maximum number of symbols, initial root table size, and maximum code length
|
|
||||||
in bits -- those are the command arguments in that order. The default
|
|
||||||
values are 286, 9, and 15 respectively, for the deflate literal/length code.
|
|
||||||
The possible codes are counted for each number of coded symbols from two to
|
|
||||||
the maximum. The counts for each of those and the total number of codes are
|
|
||||||
shown. The maximum number of inflate table entires is then calculated
|
|
||||||
across all possible codes. Each new maximum number of table entries and the
|
|
||||||
associated sub-code (starting at root + 1 == 10 bits) is shown.
|
|
||||||
|
|
||||||
To count and examine Huffman codes that are not length-limited, provide a
|
|
||||||
maximum length equal to the number of symbols minus one.
|
|
||||||
|
|
||||||
For the deflate literal/length code, use "enough". For the deflate distance
|
|
||||||
code, use "enough 30 6".
|
|
||||||
|
|
||||||
This uses the %llu printf format to print big_t numbers, which assumes that
|
|
||||||
big_t is an unsigned long long. If the big_t type is changed (for example
|
|
||||||
to a multiple precision type), the method of printing will also need to be
|
|
||||||
updated.
|
|
||||||
*/
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int syms; /* total number of symbols to code */
|
|
||||||
int n; /* number of symbols to code for this run */
|
|
||||||
big_t got; /* return value of count() */
|
|
||||||
big_t sum; /* accumulated number of codes over n */
|
|
||||||
code_t word; /* for counting bits in code_t */
|
|
||||||
|
|
||||||
/* set up globals for cleanup() */
|
|
||||||
code = NULL;
|
|
||||||
num = NULL;
|
|
||||||
done = NULL;
|
|
||||||
|
|
||||||
/* get arguments -- default to the deflate literal/length code */
|
|
||||||
syms = 286;
|
|
||||||
root = 9;
|
|
||||||
max = 15;
|
|
||||||
if (argc > 1) {
|
|
||||||
syms = atoi(argv[1]);
|
|
||||||
if (argc > 2) {
|
|
||||||
root = atoi(argv[2]);
|
|
||||||
if (argc > 3)
|
|
||||||
max = atoi(argv[3]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (argc > 4 || syms < 2 || root < 1 || max < 1) {
|
|
||||||
fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n",
|
|
||||||
stderr);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if not restricting the code length, the longest is syms - 1 */
|
|
||||||
if (max > syms - 1)
|
|
||||||
max = syms - 1;
|
|
||||||
|
|
||||||
/* determine the number of bits in a code_t */
|
|
||||||
for (n = 0, word = 1; word; n++, word <<= 1)
|
|
||||||
;
|
|
||||||
|
|
||||||
/* make sure that the calculation of most will not overflow */
|
|
||||||
if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) {
|
|
||||||
fputs("abort: code length too long for internal types\n", stderr);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* reject impossible code requests */
|
|
||||||
if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) {
|
|
||||||
fprintf(stderr, "%d symbols cannot be coded in %d bits\n",
|
|
||||||
syms, max);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* allocate code vector */
|
|
||||||
code = calloc(max + 1, sizeof(int));
|
|
||||||
if (code == NULL) {
|
|
||||||
fputs("abort: unable to allocate enough memory\n", stderr);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* determine size of saved results array, checking for overflows,
|
|
||||||
allocate and clear the array (set all to zero with calloc()) */
|
|
||||||
if (syms == 2) /* iff max == 1 */
|
|
||||||
num = NULL; /* won't be saving any results */
|
|
||||||
else {
|
|
||||||
size = syms >> 1;
|
|
||||||
if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) ||
|
|
||||||
(size *= n, size > ((size_t)0 - 1) / (n = max - 1)) ||
|
|
||||||
(size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) ||
|
|
||||||
(num = calloc(size, sizeof(big_t))) == NULL) {
|
|
||||||
fputs("abort: unable to allocate enough memory\n", stderr);
|
|
||||||
cleanup();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* count possible codes for all numbers of symbols, add up counts */
|
|
||||||
sum = 0;
|
|
||||||
for (n = 2; n <= syms; n++) {
|
|
||||||
got = count(n, 1, 2);
|
|
||||||
sum += got;
|
|
||||||
if (got == (big_t)0 - 1 || sum < got) { /* overflow */
|
|
||||||
fputs("abort: can't count that high!\n", stderr);
|
|
||||||
cleanup();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("%llu %d-codes\n", got, n);
|
|
||||||
}
|
|
||||||
printf("%llu total codes for 2 to %d symbols", sum, syms);
|
|
||||||
if (max < syms - 1)
|
|
||||||
printf(" (%d-bit length limit)\n", max);
|
|
||||||
else
|
|
||||||
puts(" (no length limit)");
|
|
||||||
|
|
||||||
/* allocate and clear done array for beenhere() */
|
|
||||||
if (syms == 2)
|
|
||||||
done = NULL;
|
|
||||||
else if (size > ((size_t)0 - 1) / sizeof(struct tab) ||
|
|
||||||
(done = calloc(size, sizeof(struct tab))) == NULL) {
|
|
||||||
fputs("abort: unable to allocate enough memory\n", stderr);
|
|
||||||
cleanup();
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find and show maximum inflate table usage */
|
|
||||||
if (root > max) /* reduce root to max length */
|
|
||||||
root = max;
|
|
||||||
if ((code_t)syms < ((code_t)1 << (root + 1)))
|
|
||||||
enough(syms);
|
|
||||||
else
|
|
||||||
puts("cannot handle minimum code lengths > root");
|
|
||||||
|
|
||||||
/* done */
|
|
||||||
cleanup();
|
|
||||||
return 0;
|
|
||||||
}
|
|
BIN
test/extern/zlib-1.2.11/zlib.3.pdf
vendored
BIN
test/extern/zlib-1.2.11/zlib.3.pdf
vendored
Binary file not shown.
@ -3,7 +3,7 @@ set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
|
|||||||
|
|
||||||
project(zlib C)
|
project(zlib C)
|
||||||
|
|
||||||
set(VERSION "1.2.11")
|
set(VERSION "1.2.12")
|
||||||
|
|
||||||
option(ASM686 "Enable building i686 assembly implementation")
|
option(ASM686 "Enable building i686 assembly implementation")
|
||||||
option(AMD64 "Enable building amd64 assembly implementation")
|
option(AMD64 "Enable building amd64 assembly implementation")
|
@ -1,6 +1,69 @@
|
|||||||
|
|
||||||
ChangeLog file for zlib
|
ChangeLog file for zlib
|
||||||
|
|
||||||
|
Changes in 1.2.12 (27 Mar 2022)
|
||||||
|
- Cygwin does not have _wopen(), so do not create gzopen_w() there
|
||||||
|
- Permit a deflateParams() parameter change as soon as possible
|
||||||
|
- Limit hash table inserts after switch from stored deflate
|
||||||
|
- Fix bug when window full in deflate_stored()
|
||||||
|
- Fix CLEAR_HASH macro to be usable as a single statement
|
||||||
|
- Avoid a conversion error in gzseek when off_t type too small
|
||||||
|
- Have Makefile return non-zero error code on test failure
|
||||||
|
- Avoid some conversion warnings in gzread.c and gzwrite.c
|
||||||
|
- Update use of errno for newer Windows CE versions
|
||||||
|
- Small speedup to inflate [psumbera]
|
||||||
|
- Return an error if the gzputs string length can't fit in an int
|
||||||
|
- Add address checking in clang to -w option of configure
|
||||||
|
- Don't compute check value for raw inflate if asked to validate
|
||||||
|
- Handle case where inflateSync used when header never processed
|
||||||
|
- Avoid the use of ptrdiff_t
|
||||||
|
- Avoid an undefined behavior of memcpy() in gzappend()
|
||||||
|
- Avoid undefined behaviors of memcpy() in gz*printf()
|
||||||
|
- Avoid an undefined behavior of memcpy() in _tr_stored_block()
|
||||||
|
- Make the names in functions declarations identical to definitions
|
||||||
|
- Remove old assembler code in which bugs have manifested
|
||||||
|
- Fix deflateEnd() to not report an error at start of raw deflate
|
||||||
|
- Add legal disclaimer to README
|
||||||
|
- Emphasize the need to continue decompressing gzip members
|
||||||
|
- Correct the initialization requirements for deflateInit2()
|
||||||
|
- Fix a bug that can crash deflate on some input when using Z_FIXED
|
||||||
|
- Assure that the number of bits for deflatePrime() is valid
|
||||||
|
- Use a structure to make globals in enough.c evident
|
||||||
|
- Use a macro for the printf format of big_t in enough.c
|
||||||
|
- Clean up code style in enough.c, update version
|
||||||
|
- Use inline function instead of macro for index in enough.c
|
||||||
|
- Clarify that prefix codes are counted in enough.c
|
||||||
|
- Show all the codes for the maximum tables size in enough.c
|
||||||
|
- Add gznorm.c example, which normalizes gzip files
|
||||||
|
- Fix the zran.c example to work on a multiple-member gzip file
|
||||||
|
- Add tables for crc32_combine(), to speed it up by a factor of 200
|
||||||
|
- Add crc32_combine_gen() and crc32_combine_op() for fast combines
|
||||||
|
- Speed up software CRC-32 computation by a factor of 1.5 to 3
|
||||||
|
- Use atomic test and set, if available, for dynamic CRC tables
|
||||||
|
- Don't bother computing check value after successful inflateSync()
|
||||||
|
- Correct comment in crc32.c
|
||||||
|
- Add use of the ARMv8 crc32 instructions when requested
|
||||||
|
- Use ARM crc32 instructions if the ARM architecture has them
|
||||||
|
- Explicitly note that the 32-bit check values are 32 bits
|
||||||
|
- Avoid adding empty gzip member after gzflush with Z_FINISH
|
||||||
|
- Fix memory leak on error in gzlog.c
|
||||||
|
- Fix error in comment on the polynomial representation of a byte
|
||||||
|
- Clarify gz* function interfaces, referring to parameter names
|
||||||
|
- Change macro name in inflate.c to avoid collision in VxWorks
|
||||||
|
- Correct typo in blast.c
|
||||||
|
- Improve portability of contrib/minizip
|
||||||
|
- Fix indentation in minizip's zip.c
|
||||||
|
- Replace black/white with allow/block. (theresa-m)
|
||||||
|
- minizip warning fix if MAXU32 already defined. (gvollant)
|
||||||
|
- Fix unztell64() in minizip to work past 4GB. (Daniël Hörchner)
|
||||||
|
- Clean up minizip to reduce warnings for testing
|
||||||
|
- Add fallthrough comments for gcc
|
||||||
|
- Eliminate use of ULL constants
|
||||||
|
- Separate out address sanitizing from warnings in configure
|
||||||
|
- Remove destructive aspects of make distclean
|
||||||
|
- Check for cc masquerading as gcc or clang in configure
|
||||||
|
- Fix crc32.c to compile local functions only if used
|
||||||
|
|
||||||
Changes in 1.2.11 (15 Jan 2017)
|
Changes in 1.2.11 (15 Jan 2017)
|
||||||
- Fix deflate stored bug when pulling last block from window
|
- Fix deflate stored bug when pulling last block from window
|
||||||
- Permit immediate deflateParams changes before any deflate input
|
- Permit immediate deflateParams changes before any deflate input
|
||||||
@ -511,7 +574,7 @@ Changes in 1.2.3.5 (8 Jan 2010)
|
|||||||
- Don't use _vsnprintf on later versions of MSVC [Lowman]
|
- Don't use _vsnprintf on later versions of MSVC [Lowman]
|
||||||
- Add CMake build script and input file [Lowman]
|
- Add CMake build script and input file [Lowman]
|
||||||
- Update contrib/minizip to 1.1 [Svensson, Vollant]
|
- Update contrib/minizip to 1.1 [Svensson, Vollant]
|
||||||
- Moved nintendods directory from contrib to .
|
- Moved nintendods directory from contrib to root
|
||||||
- Replace gzio.c with a new set of routines with the same functionality
|
- Replace gzio.c with a new set of routines with the same functionality
|
||||||
- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
|
- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
|
||||||
- Update contrib/minizip to 1.1b
|
- Update contrib/minizip to 1.1b
|
||||||
@ -685,7 +748,7 @@ Changes in 1.2.2.4 (11 July 2005)
|
|||||||
- Be more strict on incomplete code sets in inflate_table() and increase
|
- Be more strict on incomplete code sets in inflate_table() and increase
|
||||||
ENOUGH and MAXD -- this repairs a possible security vulnerability for
|
ENOUGH and MAXD -- this repairs a possible security vulnerability for
|
||||||
invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
|
invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
|
||||||
discovering the vulnerability and providing test cases.
|
discovering the vulnerability and providing test cases
|
||||||
- Add ia64 support to configure for HP-UX [Smith]
|
- Add ia64 support to configure for HP-UX [Smith]
|
||||||
- Add error return to gzread() for format or i/o error [Levin]
|
- Add error return to gzread() for format or i/o error [Levin]
|
||||||
- Use malloc.h for OS/2 [Necasek]
|
- Use malloc.h for OS/2 [Necasek]
|
||||||
@ -721,7 +784,7 @@ Changes in 1.2.2.2 (30 December 2004)
|
|||||||
- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
|
- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
|
||||||
- Add updated make_vms.com [Coghlan], update README
|
- Add updated make_vms.com [Coghlan], update README
|
||||||
- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
|
- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
|
||||||
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
|
fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html
|
||||||
- Add FAQ entry and comments in deflate.c on uninitialized memory access
|
- Add FAQ entry and comments in deflate.c on uninitialized memory access
|
||||||
- Add Solaris 9 make options in configure [Gilbert]
|
- Add Solaris 9 make options in configure [Gilbert]
|
||||||
- Allow strerror() usage in gzio.c for STDC
|
- Allow strerror() usage in gzio.c for STDC
|
||||||
@ -792,7 +855,7 @@ Changes in 1.2.1.1 (9 January 2004)
|
|||||||
- Fix a big fat bug in inftrees.c that prevented decoding valid
|
- Fix a big fat bug in inftrees.c that prevented decoding valid
|
||||||
dynamic blocks with only literals and no distance codes --
|
dynamic blocks with only literals and no distance codes --
|
||||||
Thanks to "Hot Emu" for the bug report and sample file
|
Thanks to "Hot Emu" for the bug report and sample file
|
||||||
- Add a note to puff.c on no distance codes case.
|
- Add a note to puff.c on no distance codes case
|
||||||
|
|
||||||
Changes in 1.2.1 (17 November 2003)
|
Changes in 1.2.1 (17 November 2003)
|
||||||
- Remove a tab in contrib/gzappend/gzappend.c
|
- Remove a tab in contrib/gzappend/gzappend.c
|
||||||
@ -1036,14 +1099,14 @@ Changes in 1.2.0 (9 March 2003)
|
|||||||
- Add contrib/puff/ simple inflate for deflate format description
|
- Add contrib/puff/ simple inflate for deflate format description
|
||||||
|
|
||||||
Changes in 1.1.4 (11 March 2002)
|
Changes in 1.1.4 (11 March 2002)
|
||||||
- ZFREE was repeated on same allocation on some error conditions.
|
- ZFREE was repeated on same allocation on some error conditions
|
||||||
This creates a security problem described in
|
This creates a security problem described in
|
||||||
http://www.zlib.org/advisory-2002-03-11.txt
|
http://www.zlib.org/advisory-2002-03-11.txt
|
||||||
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
|
- Returned incorrect error (Z_MEM_ERROR) on some invalid data
|
||||||
- Avoid accesses before window for invalid distances with inflate window
|
- Avoid accesses before window for invalid distances with inflate window
|
||||||
less than 32K.
|
less than 32K
|
||||||
- force windowBits > 8 to avoid a bug in the encoder for a window size
|
- force windowBits > 8 to avoid a bug in the encoder for a window size
|
||||||
of 256 bytes. (A complete fix will be available in 1.1.5).
|
of 256 bytes. (A complete fix will be available in 1.1.5)
|
||||||
|
|
||||||
Changes in 1.1.3 (9 July 1998)
|
Changes in 1.1.3 (9 July 1998)
|
||||||
- fix "an inflate input buffer bug that shows up on rare but persistent
|
- fix "an inflate input buffer bug that shows up on rare but persistent
|
||||||
@ -1117,7 +1180,7 @@ Changes in 1.1.1 (27 Feb 98)
|
|||||||
- remove block truncation heuristic which had very marginal effect for zlib
|
- remove block truncation heuristic which had very marginal effect for zlib
|
||||||
(smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
|
(smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
|
||||||
compression ratio on some files. This also allows inlining _tr_tally for
|
compression ratio on some files. This also allows inlining _tr_tally for
|
||||||
matches in deflate_slow.
|
matches in deflate_slow
|
||||||
- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
|
- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
|
||||||
|
|
||||||
Changes in 1.1.0 (24 Feb 98)
|
Changes in 1.1.0 (24 Feb 98)
|
||||||
@ -1162,7 +1225,7 @@ Changes in 1.0.8 (27 Jan 1998)
|
|||||||
- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
|
- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
|
||||||
- use constant arrays for the static trees in trees.c instead of computing
|
- use constant arrays for the static trees in trees.c instead of computing
|
||||||
them at run time (thanks to Ken Raeburn for this suggestion). To create
|
them at run time (thanks to Ken Raeburn for this suggestion). To create
|
||||||
trees.h, compile with GEN_TREES_H and run "make test".
|
trees.h, compile with GEN_TREES_H and run "make test"
|
||||||
- check return code of example in "make test" and display result
|
- check return code of example in "make test" and display result
|
||||||
- pass minigzip command line options to file_compress
|
- pass minigzip command line options to file_compress
|
||||||
- simplifying code of inflateSync to avoid gcc 2.8 bug
|
- simplifying code of inflateSync to avoid gcc 2.8 bug
|
||||||
@ -1201,12 +1264,12 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
|
- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
|
||||||
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
|
gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
|
||||||
- Fix a deflate bug occurring only with compression level 0 (thanks to
|
- Fix a deflate bug occurring only with compression level 0 (thanks to
|
||||||
Andy Buckler for finding this one).
|
Andy Buckler for finding this one)
|
||||||
- In minigzip, pass transparently also the first byte for .Z files.
|
- In minigzip, pass transparently also the first byte for .Z files
|
||||||
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
|
- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
|
||||||
- check Z_FINISH in inflate (thanks to Marc Schluper)
|
- check Z_FINISH in inflate (thanks to Marc Schluper)
|
||||||
- Implement deflateCopy (thanks to Adam Costello)
|
- Implement deflateCopy (thanks to Adam Costello)
|
||||||
- make static libraries by default in configure, add --shared option.
|
- make static libraries by default in configure, add --shared option
|
||||||
- move MSDOS or Windows specific files to directory msdos
|
- move MSDOS or Windows specific files to directory msdos
|
||||||
- suppress the notion of partial flush to simplify the interface
|
- suppress the notion of partial flush to simplify the interface
|
||||||
(but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
|
(but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
|
||||||
@ -1218,7 +1281,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
- added Makefile.nt (thanks to Stephen Williams)
|
- added Makefile.nt (thanks to Stephen Williams)
|
||||||
- added the unsupported "contrib" directory:
|
- added the unsupported "contrib" directory:
|
||||||
contrib/asm386/ by Gilles Vollant <info@winimage.com>
|
contrib/asm386/ by Gilles Vollant <info@winimage.com>
|
||||||
386 asm code replacing longest_match().
|
386 asm code replacing longest_match()
|
||||||
contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
||||||
A C++ I/O streams interface to the zlib gz* functions
|
A C++ I/O streams interface to the zlib gz* functions
|
||||||
contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
|
contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
|
||||||
@ -1226,7 +1289,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
|
contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
|
||||||
A very simple tar.gz file extractor using zlib
|
A very simple tar.gz file extractor using zlib
|
||||||
contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
|
contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
|
||||||
How to use compress(), uncompress() and the gz* functions from VB.
|
How to use compress(), uncompress() and the gz* functions from VB
|
||||||
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
|
- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
|
||||||
level) in minigzip (thanks to Tom Lane)
|
level) in minigzip (thanks to Tom Lane)
|
||||||
|
|
||||||
@ -1235,8 +1298,8 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
|
- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
|
||||||
- add undocumented function zError to convert error code to string
|
- add undocumented function zError to convert error code to string
|
||||||
(for Tim Smithers)
|
(for Tim Smithers)
|
||||||
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
|
- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code
|
||||||
- Use default memcpy for Symantec MSDOS compiler.
|
- Use default memcpy for Symantec MSDOS compiler
|
||||||
- Add EXPORT keyword for check_func (needed for Windows DLL)
|
- Add EXPORT keyword for check_func (needed for Windows DLL)
|
||||||
- add current directory to LD_LIBRARY_PATH for "make test"
|
- add current directory to LD_LIBRARY_PATH for "make test"
|
||||||
- create also a link for libz.so.1
|
- create also a link for libz.so.1
|
||||||
@ -1249,7 +1312,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
- allow compilation with ANSI keywords only enabled for TurboC in large model
|
- allow compilation with ANSI keywords only enabled for TurboC in large model
|
||||||
- avoid "versionString"[0] (Borland bug)
|
- avoid "versionString"[0] (Borland bug)
|
||||||
- add NEED_DUMMY_RETURN for Borland
|
- add NEED_DUMMY_RETURN for Borland
|
||||||
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
|
- use variable z_verbose for tracing in debug mode (L. Peter Deutsch)
|
||||||
- allow compilation with CC
|
- allow compilation with CC
|
||||||
- defined STDC for OS/2 (David Charlap)
|
- defined STDC for OS/2 (David Charlap)
|
||||||
- limit external names to 8 chars for MVS (Thomas Lund)
|
- limit external names to 8 chars for MVS (Thomas Lund)
|
||||||
@ -1259,7 +1322,7 @@ Changes in 1.0.6 (19 Jan 1998)
|
|||||||
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
|
- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
|
||||||
- added makelcc.bat for lcc-win32 (Tom St Denis)
|
- added makelcc.bat for lcc-win32 (Tom St Denis)
|
||||||
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
|
- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
|
||||||
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
|
- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion
|
||||||
- check for unistd.h in configure (for off_t)
|
- check for unistd.h in configure (for off_t)
|
||||||
- remove useless check parameter in inflate_blocks_free
|
- remove useless check parameter in inflate_blocks_free
|
||||||
- avoid useless assignment of s->check to itself in inflate_blocks_new
|
- avoid useless assignment of s->check to itself in inflate_blocks_new
|
||||||
@ -1280,7 +1343,7 @@ Changes in 1.0.5 (3 Jan 98)
|
|||||||
Changes in 1.0.4 (24 Jul 96)
|
Changes in 1.0.4 (24 Jul 96)
|
||||||
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
|
- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
|
||||||
bit, so the decompressor could decompress all the correct data but went
|
bit, so the decompressor could decompress all the correct data but went
|
||||||
on to attempt decompressing extra garbage data. This affected minigzip too.
|
on to attempt decompressing extra garbage data. This affected minigzip too
|
||||||
- zlibVersion and gzerror return const char* (needed for DLL)
|
- zlibVersion and gzerror return const char* (needed for DLL)
|
||||||
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
|
- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
|
||||||
- use z_error only for DEBUG (avoid problem with DLLs)
|
- use z_error only for DEBUG (avoid problem with DLLs)
|
||||||
@ -1310,7 +1373,7 @@ Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
|
|||||||
- fix array overlay in deflate.c which sometimes caused bad compressed data
|
- fix array overlay in deflate.c which sometimes caused bad compressed data
|
||||||
- fix inflate bug with empty stored block
|
- fix inflate bug with empty stored block
|
||||||
- fix MSDOS medium model which was broken in 0.99
|
- fix MSDOS medium model which was broken in 0.99
|
||||||
- fix deflateParams() which could generate bad compressed data.
|
- fix deflateParams() which could generate bad compressed data
|
||||||
- Bytef is define'd instead of typedef'ed (work around Borland bug)
|
- Bytef is define'd instead of typedef'ed (work around Borland bug)
|
||||||
- added an INDEX file
|
- added an INDEX file
|
||||||
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
|
- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
|
||||||
@ -1331,7 +1394,7 @@ Changes in 0.99 (27 Jan 96)
|
|||||||
- allow preset dictionary shared between compressor and decompressor
|
- allow preset dictionary shared between compressor and decompressor
|
||||||
- allow compression level 0 (no compression)
|
- allow compression level 0 (no compression)
|
||||||
- add deflateParams in zlib.h: allow dynamic change of compression level
|
- add deflateParams in zlib.h: allow dynamic change of compression level
|
||||||
and compression strategy.
|
and compression strategy
|
||||||
- test large buffers and deflateParams in example.c
|
- test large buffers and deflateParams in example.c
|
||||||
- add optional "configure" to build zlib as a shared library
|
- add optional "configure" to build zlib as a shared library
|
||||||
- suppress Makefile.qnx, use configure instead
|
- suppress Makefile.qnx, use configure instead
|
||||||
@ -1373,30 +1436,30 @@ Changes in 0.99 (27 Jan 96)
|
|||||||
- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
|
- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
|
||||||
- use Z_BINARY instead of BINARY
|
- use Z_BINARY instead of BINARY
|
||||||
- document that gzclose after gzdopen will close the file
|
- document that gzclose after gzdopen will close the file
|
||||||
- allow "a" as mode in gzopen.
|
- allow "a" as mode in gzopen
|
||||||
- fix error checking in gzread
|
- fix error checking in gzread
|
||||||
- allow skipping .gz extra-field on pipes
|
- allow skipping .gz extra-field on pipes
|
||||||
- added reference to Perl interface in README
|
- added reference to Perl interface in README
|
||||||
- put the crc table in FAR data (I dislike more and more the medium model :)
|
- put the crc table in FAR data (I dislike more and more the medium model :)
|
||||||
- added get_crc_table
|
- added get_crc_table
|
||||||
- added a dimension to all arrays (Borland C can't count).
|
- added a dimension to all arrays (Borland C can't count)
|
||||||
- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
|
- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
|
||||||
- guard against multiple inclusion of *.h (for precompiled header on Mac)
|
- guard against multiple inclusion of *.h (for precompiled header on Mac)
|
||||||
- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
|
- Watcom C pretends to be Microsoft C small model even in 32 bit mode
|
||||||
- don't use unsized arrays to avoid silly warnings by Visual C++:
|
- don't use unsized arrays to avoid silly warnings by Visual C++:
|
||||||
warning C4746: 'inflate_mask' : unsized array treated as '__far'
|
warning C4746: 'inflate_mask' : unsized array treated as '__far'
|
||||||
(what's wrong with far data in far model?).
|
(what's wrong with far data in far model?)
|
||||||
- define enum out of inflate_blocks_state to allow compilation with C++
|
- define enum out of inflate_blocks_state to allow compilation with C++
|
||||||
|
|
||||||
Changes in 0.95 (16 Aug 95)
|
Changes in 0.95 (16 Aug 95)
|
||||||
- fix MSDOS small and medium model (now easier to adapt to any compiler)
|
- fix MSDOS small and medium model (now easier to adapt to any compiler)
|
||||||
- inlined send_bits
|
- inlined send_bits
|
||||||
- fix the final (:-) bug for deflate with flush (output was correct but
|
- fix the final (:-) bug for deflate with flush (output was correct but
|
||||||
not completely flushed in rare occasions).
|
not completely flushed in rare occasions)
|
||||||
- default window size is same for compression and decompression
|
- default window size is same for compression and decompression
|
||||||
(it's now sufficient to set MAX_WBITS in zconf.h).
|
(it's now sufficient to set MAX_WBITS in zconf.h)
|
||||||
- voidp -> voidpf and voidnp -> voidp (for consistency with other
|
- voidp -> voidpf and voidnp -> voidp (for consistency with other
|
||||||
typedefs and because voidnp was not near in large model).
|
typedefs and because voidnp was not near in large model)
|
||||||
|
|
||||||
Changes in 0.94 (13 Aug 95)
|
Changes in 0.94 (13 Aug 95)
|
||||||
- support MSDOS medium model
|
- support MSDOS medium model
|
||||||
@ -1405,12 +1468,12 @@ Changes in 0.94 (13 Aug 95)
|
|||||||
- added support for VMS
|
- added support for VMS
|
||||||
- allow a compression level in gzopen()
|
- allow a compression level in gzopen()
|
||||||
- gzflush now calls fflush
|
- gzflush now calls fflush
|
||||||
- For deflate with flush, flush even if no more input is provided.
|
- For deflate with flush, flush even if no more input is provided
|
||||||
- rename libgz.a as libz.a
|
- rename libgz.a as libz.a
|
||||||
- avoid complex expression in infcodes.c triggering Turbo C bug
|
- avoid complex expression in infcodes.c triggering Turbo C bug
|
||||||
- work around a problem with gcc on Alpha (in INSERT_STRING)
|
- work around a problem with gcc on Alpha (in INSERT_STRING)
|
||||||
- don't use inline functions (problem with some gcc versions)
|
- don't use inline functions (problem with some gcc versions)
|
||||||
- allow renaming of Byte, uInt, etc... with #define.
|
- allow renaming of Byte, uInt, etc... with #define
|
||||||
- avoid warning about (unused) pointer before start of array in deflate.c
|
- avoid warning about (unused) pointer before start of array in deflate.c
|
||||||
- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
|
- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
|
||||||
- avoid reserved word 'new' in trees.c
|
- avoid reserved word 'new' in trees.c
|
||||||
@ -1429,7 +1492,7 @@ Changes in 0.92 (3 May 95)
|
|||||||
- no memcpy on Pyramid
|
- no memcpy on Pyramid
|
||||||
- suppressed inftest.c
|
- suppressed inftest.c
|
||||||
- optimized fill_window, put longest_match inline for gcc
|
- optimized fill_window, put longest_match inline for gcc
|
||||||
- optimized inflate on stored blocks.
|
- optimized inflate on stored blocks
|
||||||
- untabify all sources to simplify patches
|
- untabify all sources to simplify patches
|
||||||
|
|
||||||
Changes in 0.91 (2 May 95)
|
Changes in 0.91 (2 May 95)
|
||||||
@ -1447,7 +1510,7 @@ Changes in 0.9 (1 May 95)
|
|||||||
- let again gzread copy uncompressed data unchanged (was working in 0.71)
|
- let again gzread copy uncompressed data unchanged (was working in 0.71)
|
||||||
- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
|
- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
|
||||||
- added a test of inflateSync in example.c
|
- added a test of inflateSync in example.c
|
||||||
- moved MAX_WBITS to zconf.h because users might want to change that.
|
- moved MAX_WBITS to zconf.h because users might want to change that
|
||||||
- document explicitly that zalloc(64K) on MSDOS must return a normalized
|
- document explicitly that zalloc(64K) on MSDOS must return a normalized
|
||||||
pointer (zero offset)
|
pointer (zero offset)
|
||||||
- added Makefiles for Microsoft C, Turbo C, Borland C++
|
- added Makefiles for Microsoft C, Turbo C, Borland C++
|
||||||
@ -1456,7 +1519,7 @@ Changes in 0.9 (1 May 95)
|
|||||||
Changes in 0.8 (29 April 95)
|
Changes in 0.8 (29 April 95)
|
||||||
- added fast inflate (inffast.c)
|
- added fast inflate (inffast.c)
|
||||||
- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
|
- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
|
||||||
is incompatible with previous versions of zlib which returned Z_OK.
|
is incompatible with previous versions of zlib which returned Z_OK
|
||||||
- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
|
- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
|
||||||
(actually that was not a compiler bug, see 0.81 above)
|
(actually that was not a compiler bug, see 0.81 above)
|
||||||
- gzread no longer reads one extra byte in certain cases
|
- gzread no longer reads one extra byte in certain cases
|
||||||
@ -1466,50 +1529,50 @@ Changes in 0.8 (29 April 95)
|
|||||||
|
|
||||||
Changes in 0.71 (14 April 95)
|
Changes in 0.71 (14 April 95)
|
||||||
- Fixed more MSDOS compilation problems :( There is still a bug with
|
- Fixed more MSDOS compilation problems :( There is still a bug with
|
||||||
TurboC large model.
|
TurboC large model
|
||||||
|
|
||||||
Changes in 0.7 (14 April 95)
|
Changes in 0.7 (14 April 95)
|
||||||
- Added full inflate support.
|
- Added full inflate support
|
||||||
- Simplified the crc32() interface. The pre- and post-conditioning
|
- Simplified the crc32() interface. The pre- and post-conditioning
|
||||||
(one's complement) is now done inside crc32(). WARNING: this is
|
(one's complement) is now done inside crc32(). WARNING: this is
|
||||||
incompatible with previous versions; see zlib.h for the new usage.
|
incompatible with previous versions; see zlib.h for the new usage
|
||||||
|
|
||||||
Changes in 0.61 (12 April 95)
|
Changes in 0.61 (12 April 95)
|
||||||
- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
|
- workaround for a bug in TurboC. example and minigzip now work on MSDOS
|
||||||
|
|
||||||
Changes in 0.6 (11 April 95)
|
Changes in 0.6 (11 April 95)
|
||||||
- added minigzip.c
|
- added minigzip.c
|
||||||
- added gzdopen to reopen a file descriptor as gzFile
|
- added gzdopen to reopen a file descriptor as gzFile
|
||||||
- added transparent reading of non-gziped files in gzread.
|
- added transparent reading of non-gziped files in gzread
|
||||||
- fixed bug in gzread (don't read crc as data)
|
- fixed bug in gzread (don't read crc as data)
|
||||||
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
|
- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose)
|
||||||
- don't allocate big arrays in the stack (for MSDOS)
|
- don't allocate big arrays in the stack (for MSDOS)
|
||||||
- fix some MSDOS compilation problems
|
- fix some MSDOS compilation problems
|
||||||
|
|
||||||
Changes in 0.5:
|
Changes in 0.5:
|
||||||
- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
|
- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
|
||||||
not yet Z_FULL_FLUSH.
|
not yet Z_FULL_FLUSH
|
||||||
- support decompression but only in a single step (forced Z_FINISH)
|
- support decompression but only in a single step (forced Z_FINISH)
|
||||||
- added opaque object for zalloc and zfree.
|
- added opaque object for zalloc and zfree
|
||||||
- added deflateReset and inflateReset
|
- added deflateReset and inflateReset
|
||||||
- added a variable zlib_version for consistency checking.
|
- added a variable zlib_version for consistency checking
|
||||||
- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
|
- renamed the 'filter' parameter of deflateInit2 as 'strategy'
|
||||||
Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
|
Added Z_FILTERED and Z_HUFFMAN_ONLY constants
|
||||||
|
|
||||||
Changes in 0.4:
|
Changes in 0.4:
|
||||||
- avoid "zip" everywhere, use zlib instead of ziplib.
|
- avoid "zip" everywhere, use zlib instead of ziplib
|
||||||
- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
|
- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
|
||||||
if compression method == 8.
|
if compression method == 8
|
||||||
- added adler32 and crc32
|
- added adler32 and crc32
|
||||||
- renamed deflateOptions as deflateInit2, call one or the other but not both
|
- renamed deflateOptions as deflateInit2, call one or the other but not both
|
||||||
- added the method parameter for deflateInit2.
|
- added the method parameter for deflateInit2
|
||||||
- added inflateInit2
|
- added inflateInit2
|
||||||
- simplied considerably deflateInit and inflateInit by not supporting
|
- simplied considerably deflateInit and inflateInit by not supporting
|
||||||
user-provided history buffer. This is supported only in deflateInit2
|
user-provided history buffer. This is supported only in deflateInit2
|
||||||
and inflateInit2.
|
and inflateInit2
|
||||||
|
|
||||||
Changes in 0.3:
|
Changes in 0.3:
|
||||||
- prefix all macro names with Z_
|
- prefix all macro names with Z_
|
||||||
- use Z_FINISH instead of deflateEnd to finish compression.
|
- use Z_FINISH instead of deflateEnd to finish compression
|
||||||
- added Z_HUFFMAN_ONLY
|
- added Z_HUFFMAN_ONLY
|
||||||
- added gzerror()
|
- added gzerror()
|
@ -32,7 +32,7 @@ CPP=$(CC) -E
|
|||||||
|
|
||||||
STATICLIB=libz.a
|
STATICLIB=libz.a
|
||||||
SHAREDLIB=libz.so
|
SHAREDLIB=libz.so
|
||||||
SHAREDLIBV=libz.so.1.2.11
|
SHAREDLIBV=libz.so.1.2.12
|
||||||
SHAREDLIBM=libz.so.1
|
SHAREDLIBM=libz.so.1
|
||||||
LIBS=$(STATICLIB) $(SHAREDLIBV)
|
LIBS=$(STATICLIB) $(SHAREDLIBV)
|
||||||
|
|
||||||
@ -91,8 +91,8 @@ teststatic: static
|
|||||||
echo ' *** zlib test OK ***'; \
|
echo ' *** zlib test OK ***'; \
|
||||||
else \
|
else \
|
||||||
echo ' *** zlib test FAILED ***'; false; \
|
echo ' *** zlib test FAILED ***'; false; \
|
||||||
fi; \
|
fi
|
||||||
rm -f $$TMPST
|
@rm -f tmpst_$$
|
||||||
|
|
||||||
testshared: shared
|
testshared: shared
|
||||||
@LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
|
@LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
|
||||||
@ -104,8 +104,8 @@ testshared: shared
|
|||||||
echo ' *** zlib shared test OK ***'; \
|
echo ' *** zlib shared test OK ***'; \
|
||||||
else \
|
else \
|
||||||
echo ' *** zlib shared test FAILED ***'; false; \
|
echo ' *** zlib shared test FAILED ***'; false; \
|
||||||
fi; \
|
fi
|
||||||
rm -f $$TMPSH
|
@rm -f tmpsh_$$
|
||||||
|
|
||||||
test64: all64
|
test64: all64
|
||||||
@TMP64=tmp64_$$; \
|
@TMP64=tmp64_$$; \
|
||||||
@ -113,8 +113,8 @@ test64: all64
|
|||||||
echo ' *** zlib 64-bit test OK ***'; \
|
echo ' *** zlib 64-bit test OK ***'; \
|
||||||
else \
|
else \
|
||||||
echo ' *** zlib 64-bit test FAILED ***'; false; \
|
echo ' *** zlib 64-bit test FAILED ***'; false; \
|
||||||
fi; \
|
fi
|
||||||
rm -f $$TMP64
|
@rm -f tmp64_$$
|
||||||
|
|
||||||
infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h
|
infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h
|
||||||
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c
|
$(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c
|
||||||
@ -376,15 +376,13 @@ clean:
|
|||||||
rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
|
rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
|
||||||
|
|
||||||
maintainer-clean: distclean
|
maintainer-clean: distclean
|
||||||
distclean: clean zconf zconf.h.cmakein docs
|
distclean: clean zconf zconf.h.cmakein
|
||||||
rm -f Makefile zlib.pc configure.log
|
rm -f Makefile zlib.pc configure.log
|
||||||
-@rm -f .DS_Store
|
-@rm -f .DS_Store
|
||||||
@if [ -f Makefile.in ]; then \
|
@if [ -f Makefile.in ]; then \
|
||||||
printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
|
printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
|
||||||
printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \
|
printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \
|
||||||
touch -r $(SRCDIR)Makefile.in Makefile ; fi
|
touch -r $(SRCDIR)Makefile.in Makefile ; fi
|
||||||
@if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi
|
|
||||||
@if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi
|
|
||||||
|
|
||||||
tags:
|
tags:
|
||||||
etags $(SRCDIR)*.[ch]
|
etags $(SRCDIR)*.[ch]
|
@ -1,6 +1,6 @@
|
|||||||
ZLIB DATA COMPRESSION LIBRARY
|
ZLIB DATA COMPRESSION LIBRARY
|
||||||
|
|
||||||
zlib 1.2.11 is a general purpose data compression library. All the code is
|
zlib 1.2.12 is a general purpose data compression library. All the code is
|
||||||
thread safe. The data format used by the zlib library is described by RFCs
|
thread safe. The data format used by the zlib library is described by RFCs
|
||||||
(Request for Comments) 1950 to 1952 in the files
|
(Request for Comments) 1950 to 1952 in the files
|
||||||
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
|
||||||
@ -31,7 +31,7 @@ Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
|
|||||||
issue of Dr. Dobb's Journal; a copy of the article is available at
|
issue of Dr. Dobb's Journal; a copy of the article is available at
|
||||||
http://marknelson.us/1997/01/01/zlib-engine/ .
|
http://marknelson.us/1997/01/01/zlib-engine/ .
|
||||||
|
|
||||||
The changes made in version 1.2.11 are documented in the file ChangeLog.
|
The changes made in version 1.2.12 are documented in the file ChangeLog.
|
||||||
|
|
||||||
Unsupported third party contributions are provided in directory contrib/ .
|
Unsupported third party contributions are provided in directory contrib/ .
|
||||||
|
|
||||||
@ -84,7 +84,7 @@ Acknowledgments:
|
|||||||
|
|
||||||
Copyright notice:
|
Copyright notice:
|
||||||
|
|
||||||
(C) 1995-2017 Jean-loup Gailly and Mark Adler
|
(C) 1995-2022 Jean-loup Gailly and Mark Adler
|
||||||
|
|
||||||
This software is provided 'as-is', without any express or implied
|
This software is provided 'as-is', without any express or implied
|
||||||
warranty. In no event will the authors be held liable for any damages
|
warranty. In no event will the authors be held liable for any damages
|
||||||
@ -108,7 +108,10 @@ Copyright notice:
|
|||||||
If you use the zlib library in a product, we would appreciate *not* receiving
|
If you use the zlib library in a product, we would appreciate *not* receiving
|
||||||
lengthy legal documents to sign. The sources are provided for free but without
|
lengthy legal documents to sign. The sources are provided for free but without
|
||||||
warranty of any kind. The library has been entirely written by Jean-loup
|
warranty of any kind. The library has been entirely written by Jean-loup
|
||||||
Gailly and Mark Adler; it does not include third-party code.
|
Gailly and Mark Adler; it does not include third-party code. We make all
|
||||||
|
contributions to and distributions of this project solely in our personal
|
||||||
|
capacity, and are not conveying any rights to any intellectual property of
|
||||||
|
any third parties.
|
||||||
|
|
||||||
If you redistribute modified sources, we would appreciate that you include in
|
If you redistribute modified sources, we would appreciate that you include in
|
||||||
the file ChangeLog history information documenting your changes. Please read
|
the file ChangeLog history information documenting your changes. Please read
|
48
test/extern/zlib-1.2.11/configure → test/extern/zlib-1.2.12/configure
vendored
Normal file → Executable file
48
test/extern/zlib-1.2.11/configure → test/extern/zlib-1.2.12/configure
vendored
Normal file → Executable file
@ -87,6 +87,7 @@ build64=0
|
|||||||
gcc=0
|
gcc=0
|
||||||
warn=0
|
warn=0
|
||||||
debug=0
|
debug=0
|
||||||
|
sanitize=0
|
||||||
old_cc="$CC"
|
old_cc="$CC"
|
||||||
old_cflags="$CFLAGS"
|
old_cflags="$CFLAGS"
|
||||||
OBJC='$(OBJZ) $(OBJG)'
|
OBJC='$(OBJZ) $(OBJG)'
|
||||||
@ -137,6 +138,7 @@ case "$1" in
|
|||||||
-c* | --const) zconst=1; shift ;;
|
-c* | --const) zconst=1; shift ;;
|
||||||
-w* | --warn) warn=1; shift ;;
|
-w* | --warn) warn=1; shift ;;
|
||||||
-d* | --debug) debug=1; shift ;;
|
-d* | --debug) debug=1; shift ;;
|
||||||
|
--sanitize) sanitize=1; shift ;;
|
||||||
*)
|
*)
|
||||||
echo "unknown option: $1" | tee -a configure.log
|
echo "unknown option: $1" | tee -a configure.log
|
||||||
echo "$0 --help for help" | tee -a configure.log
|
echo "$0 --help for help" | tee -a configure.log
|
||||||
@ -165,8 +167,14 @@ extern int getchar();
|
|||||||
int hello() {return getchar();}
|
int hello() {return getchar();}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
|
if test -z "$CC"; then
|
||||||
cc=${CC-${CROSS_PREFIX}gcc}
|
echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
|
||||||
|
if ${CROSS_PREFIX}gcc -v >/dev/null 2>&1; then
|
||||||
|
cc=${CROSS_PREFIX}gcc
|
||||||
|
else
|
||||||
|
cc=${CROSS_PREFIX}cc
|
||||||
|
fi
|
||||||
|
fi
|
||||||
cflags=${CFLAGS-"-O3"}
|
cflags=${CFLAGS-"-O3"}
|
||||||
# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
|
# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
|
||||||
case "$cc" in
|
case "$cc" in
|
||||||
@ -199,6 +207,9 @@ if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
|
|||||||
CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
|
CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
if test $sanitize -eq 1; then
|
||||||
|
CFLAGS="${CFLAGS} -fsanitize=address"
|
||||||
|
fi
|
||||||
if test $debug -eq 1; then
|
if test $debug -eq 1; then
|
||||||
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
|
CFLAGS="${CFLAGS} -DZLIB_DEBUG"
|
||||||
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
|
SFLAGS="${SFLAGS} -DZLIB_DEBUG"
|
||||||
@ -367,8 +378,11 @@ else
|
|||||||
try()
|
try()
|
||||||
{
|
{
|
||||||
show $*
|
show $*
|
||||||
( $* ) >> configure.log 2>&1
|
got=`( $* ) 2>&1`
|
||||||
ret=$?
|
ret=$?
|
||||||
|
if test "$got" != ""; then
|
||||||
|
printf "%s\n" "$got" >> configure.log
|
||||||
|
fi
|
||||||
if test $ret -ne 0; then
|
if test $ret -ne 0; then
|
||||||
echo "(exit code "$ret")" >> configure.log
|
echo "(exit code "$ret")" >> configure.log
|
||||||
fi
|
fi
|
||||||
@ -381,8 +395,11 @@ tryboth()
|
|||||||
show $*
|
show $*
|
||||||
got=`( $* ) 2>&1`
|
got=`( $* ) 2>&1`
|
||||||
ret=$?
|
ret=$?
|
||||||
printf %s "$got" >> configure.log
|
if test "$got" != ""; then
|
||||||
|
printf "%s\n" "$got" >> configure.log
|
||||||
|
fi
|
||||||
if test $ret -ne 0; then
|
if test $ret -ne 0; then
|
||||||
|
echo "(exit code "$ret")" >> configure.log
|
||||||
return $ret
|
return $ret
|
||||||
fi
|
fi
|
||||||
test "$got" = ""
|
test "$got" = ""
|
||||||
@ -457,17 +474,11 @@ size_t dummy = 0;
|
|||||||
EOF
|
EOF
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
if try $CC -c $CFLAGS $test.c; then
|
||||||
echo "Checking for size_t... Yes." | tee -a configure.log
|
echo "Checking for size_t... Yes." | tee -a configure.log
|
||||||
need_sizet=0
|
|
||||||
else
|
else
|
||||||
echo "Checking for size_t... No." | tee -a configure.log
|
echo "Checking for size_t... No." | tee -a configure.log
|
||||||
need_sizet=1
|
# find a size_t integer type
|
||||||
fi
|
# check for long long
|
||||||
|
cat > $test.c << EOF
|
||||||
echo >> configure.log
|
|
||||||
|
|
||||||
# find the size_t integer type, if needed
|
|
||||||
if test $need_sizet -eq 1; then
|
|
||||||
cat > $test.c <<EOF
|
|
||||||
long long dummy = 0;
|
long long dummy = 0;
|
||||||
EOF
|
EOF
|
||||||
if try $CC -c $CFLAGS $test.c; then
|
if try $CC -c $CFLAGS $test.c; then
|
||||||
@ -495,17 +506,13 @@ EOF
|
|||||||
if try $CC $CFLAGS -o $test $test.c; then
|
if try $CC $CFLAGS -o $test $test.c; then
|
||||||
sizet=`./$test`
|
sizet=`./$test`
|
||||||
echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
|
echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
|
||||||
|
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
|
||||||
|
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
|
||||||
else
|
else
|
||||||
echo "Failed to find a pointer-size integer type." | tee -a configure.log
|
echo "Checking for a pointer-size integer type... not found." | tee -a configure.log
|
||||||
leave 1
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test $need_sizet -eq 1; then
|
|
||||||
CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
|
|
||||||
SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo >> configure.log
|
echo >> configure.log
|
||||||
|
|
||||||
# check for large file support, and if none, check for fseeko()
|
# check for large file support, and if none, check for fseeko()
|
||||||
@ -849,7 +856,6 @@ echo SHAREDLIBV = $SHAREDLIBV >> configure.log
|
|||||||
echo STATICLIB = $STATICLIB >> configure.log
|
echo STATICLIB = $STATICLIB >> configure.log
|
||||||
echo TEST = $TEST >> configure.log
|
echo TEST = $TEST >> configure.log
|
||||||
echo VER = $VER >> configure.log
|
echo VER = $VER >> configure.log
|
||||||
echo Z_U4 = $Z_U4 >> configure.log
|
|
||||||
echo SRCDIR = $SRCDIR >> configure.log
|
echo SRCDIR = $SRCDIR >> configure.log
|
||||||
echo exec_prefix = $exec_prefix >> configure.log
|
echo exec_prefix = $exec_prefix >> configure.log
|
||||||
echo includedir = $includedir >> configure.log
|
echo includedir = $includedir >> configure.log
|
@ -8,14 +8,6 @@ ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
|
|||||||
Support for Ada
|
Support for Ada
|
||||||
See http://zlib-ada.sourceforge.net/
|
See http://zlib-ada.sourceforge.net/
|
||||||
|
|
||||||
amd64/ by Mikhail Teterin <mi@ALDAN.algebra.com>
|
|
||||||
asm code for AMD64
|
|
||||||
See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393
|
|
||||||
|
|
||||||
asm686/ by Brian Raiter <breadbox@muppetlabs.com>
|
|
||||||
asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
|
|
||||||
See http://www.muppetlabs.com/~breadbox/software/assembly.html
|
|
||||||
|
|
||||||
blast/ by Mark Adler <madler@alumni.caltech.edu>
|
blast/ by Mark Adler <madler@alumni.caltech.edu>
|
||||||
Decompressor for output of PKWare Data Compression Library (DCL)
|
Decompressor for output of PKWare Data Compression Library (DCL)
|
||||||
|
|
||||||
@ -32,9 +24,6 @@ gcc_gvmat64/by Gilles Vollant <info@winimage.com>
|
|||||||
infback9/ by Mark Adler <madler@alumni.caltech.edu>
|
infback9/ by Mark Adler <madler@alumni.caltech.edu>
|
||||||
Unsupported diffs to infback to decode the deflate64 format
|
Unsupported diffs to infback to decode the deflate64 format
|
||||||
|
|
||||||
inflate86/ by Chris Anderson <christop@charm.net>
|
|
||||||
Tuned x86 gcc asm code to replace inflate_fast()
|
|
||||||
|
|
||||||
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
|
||||||
A C++ I/O streams interface to the zlib gz* functions
|
A C++ I/O streams interface to the zlib gz* functions
|
||||||
|
|
||||||
@ -45,16 +34,6 @@ iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
|
|||||||
and Kevin Ruland <kevin@rodin.wustl.edu>
|
and Kevin Ruland <kevin@rodin.wustl.edu>
|
||||||
Yet another C++ I/O streams interface
|
Yet another C++ I/O streams interface
|
||||||
|
|
||||||
masmx64/ by Gilles Vollant <info@winimage.com>
|
|
||||||
x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to
|
|
||||||
replace longest_match() and inflate_fast(), also masm x86
|
|
||||||
64-bits translation of Chris Anderson inflate_fast()
|
|
||||||
|
|
||||||
masmx86/ by Gilles Vollant <info@winimage.com>
|
|
||||||
x86 asm code to replace longest_match() and inflate_fast(),
|
|
||||||
for Visual C++ and MASM (32 bits).
|
|
||||||
Based on Brian Raiter (asm686) and Chris Anderson (inflate86)
|
|
||||||
|
|
||||||
minizip/ by Gilles Vollant <info@winimage.com>
|
minizip/ by Gilles Vollant <info@winimage.com>
|
||||||
Mini zip and unzip based on zlib
|
Mini zip and unzip based on zlib
|
||||||
Includes Zip64 support by Mathias Svensson <mathias@result42.com>
|
Includes Zip64 support by Mathias Svensson <mathias@result42.com>
|
@ -57,7 +57,7 @@ int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
|
|||||||
* use by the application to pass an input descriptor to infun(), if desired.
|
* use by the application to pass an input descriptor to infun(), if desired.
|
||||||
*
|
*
|
||||||
* If left and in are not NULL and *left is not zero when blast() is called,
|
* If left and in are not NULL and *left is not zero when blast() is called,
|
||||||
* then the *left bytes are *in are consumed for input before infun() is used.
|
* then the *left bytes at *in are consumed for input before infun() is used.
|
||||||
*
|
*
|
||||||
* The output function is invoked: err = outfun(how, buf, len), where the bytes
|
* The output function is invoked: err = outfun(how, buf, len), where the bytes
|
||||||
* to be written are buf[0..len-1]. If err is not zero, then blast() returns
|
* to be written are buf[0..len-1]. If err is not zero, then blast() returns
|
@ -152,7 +152,7 @@ procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
|
|||||||
const OutBuf: Pointer; BufSize: Integer);
|
const OutBuf: Pointer; BufSize: Integer);
|
||||||
|
|
||||||
const
|
const
|
||||||
zlib_version = '1.2.11';
|
zlib_version = '1.2.12';
|
||||||
|
|
||||||
type
|
type
|
||||||
EZlibError = class(Exception);
|
EZlibError = class(Exception);
|
@ -156,7 +156,7 @@ namespace DotZLibTests
|
|||||||
public void Info_Version()
|
public void Info_Version()
|
||||||
{
|
{
|
||||||
Info info = new Info();
|
Info info = new Info();
|
||||||
Assert.AreEqual("1.2.11", Info.Version);
|
Assert.AreEqual("1.2.12", Info.Version);
|
||||||
Assert.AreEqual(32, info.SizeOfUInt);
|
Assert.AreEqual(32, info.SizeOfUInt);
|
||||||
Assert.AreEqual(32, info.SizeOfULong);
|
Assert.AreEqual(32, info.SizeOfULong);
|
||||||
Assert.AreEqual(32, info.SizeOfPointer);
|
Assert.AreEqual(32, info.SizeOfPointer);
|
@ -1,5 +1,5 @@
|
|||||||
/* inftree9.c -- generate Huffman trees for efficient decoding
|
/* inftree9.c -- generate Huffman trees for efficient decoding
|
||||||
* Copyright (C) 1995-2017 Mark Adler
|
* Copyright (C) 1995-2022 Mark Adler
|
||||||
* For conditions of distribution and use, see copyright notice in zlib.h
|
* For conditions of distribution and use, see copyright notice in zlib.h
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -9,7 +9,7 @@
|
|||||||
#define MAXBITS 15
|
#define MAXBITS 15
|
||||||
|
|
||||||
const char inflate9_copyright[] =
|
const char inflate9_copyright[] =
|
||||||
" inflate9 1.2.11 Copyright 1995-2017 Mark Adler ";
|
" inflate9 1.2.12 Copyright 1995-2022 Mark Adler ";
|
||||||
/*
|
/*
|
||||||
If you use the zlib library in a product, an acknowledgment is welcome
|
If you use the zlib library in a product, an acknowledgment is welcome
|
||||||
in the documentation of your product. If for some reason you cannot
|
in the documentation of your product. If for some reason you cannot
|
||||||
@ -64,7 +64,7 @@ unsigned short FAR *work;
|
|||||||
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
|
||||||
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
|
128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
|
||||||
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
|
130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
|
||||||
133, 133, 133, 133, 144, 77, 202};
|
133, 133, 133, 133, 144, 199, 202};
|
||||||
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
|
static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
|
||||||
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
|
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
|
||||||
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
|
65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
|
@ -1,5 +1,5 @@
|
|||||||
CC=cc
|
CC=cc
|
||||||
CFLAGS=-O -I../..
|
CFLAGS := $(CFLAGS) -O -I../..
|
||||||
|
|
||||||
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
|
UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
|
||||||
ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
|
ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
|
||||||
@ -16,10 +16,14 @@ minizip: $(ZIP_OBJS)
|
|||||||
$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
|
$(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
|
||||||
|
|
||||||
test: miniunz minizip
|
test: miniunz minizip
|
||||||
./minizip test readme.txt
|
@rm -f test.*
|
||||||
|
@echo hello hello hello > test.txt
|
||||||
|
./minizip test test.txt
|
||||||
./miniunz -l test.zip
|
./miniunz -l test.zip
|
||||||
mv readme.txt readme.old
|
@mv test.txt test.old
|
||||||
./miniunz test.zip
|
./miniunz test.zip
|
||||||
|
@cmp test.txt test.old
|
||||||
|
@rm -f test.*
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
/bin/rm -f *.o *~ minizip miniunz
|
/bin/rm -f *.o *~ minizip miniunz test.*
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user