1/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86
2 * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.
3 * File written by Gilles Vollant, by modifiying the longest_match
4 *  from Jean-loup Gailly in deflate.c
5 *  it prepare all parameters and call the assembly longest_match_gvasm
6 *  longest_match execute standard C code is wmask != 0x7fff
7 *     (assembly code is faster with a fixed wmask)
8 *
9 * Read comment at beginning of gvmat32.asm for more information
10 */
11
12#if defined(ASMV) && (!defined(NOOLDPENTIUMCODE))
13#include "deflate.h"
14
15/* if your C compiler don't add underline before function name,
16        define ADD_UNDERLINE_ASMFUNC */
17#ifdef ADD_UNDERLINE_ASMFUNC
18#define longest_match_7fff _longest_match_7fff
19#define longest_match_686  _longest_match_686
20#define cpudetect32        _cpudetect32
21#endif
22
23
24unsigned long cpudetect32();
25
26uInt longest_match_c(
27    deflate_state *s,
28    IPos cur_match);                             /* current match */
29
30
31uInt longest_match_7fff(
32    deflate_state *s,
33    IPos cur_match);                             /* current match */
34
35uInt longest_match_686(
36    deflate_state *s,
37    IPos cur_match);                             /* current match */
38
39
40static uInt iIsPPro=2;
41
42void match_init ()
43{
44    iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
45}
46
47uInt longest_match(
48    deflate_state *s,
49    IPos cur_match)                             /* current match */
50{
51    if (iIsPPro!=0)
52        return longest_match_686(s,cur_match);
53
54    if (s->w_mask != 0x7fff)
55        return longest_match_686(s,cur_match);
56
57    /* now ((s->w_mask == 0x7fff) && (iIsPPro==0)) */
58        return longest_match_7fff(s,cur_match);
59}
60
61
62#endif /* defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) */
63