summaryrefslogtreecommitdiffstats
path: root/Modules/zlib/contrib/masmx86/gvmat32c.c
blob: 7ad2b27943bc0bbbdbd06df733548c47e157dc85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* gvmat32.c -- C portion of the optimized longest_match for 32 bits x86

 * Copyright (C) 1995-1996 Jean-loup Gailly and Gilles Vollant.

 * File written by Gilles Vollant, by modifiying the longest_match

 *  from Jean-loup Gailly in deflate.c

 *  it prepare all parameters and call the assembly longest_match_gvasm

 *  longest_match execute standard C code is wmask != 0x7fff

 *     (assembly code is faster with a fixed wmask)

 *

 * Read comment at beginning of gvmat32.asm for more information

 */

#if defined(ASMV) && (!defined(NOOLDPENTIUMCODE))

#include "deflate.h"


/* if your C compiler don't add underline before function name,

        define ADD_UNDERLINE_ASMFUNC */
#ifdef ADD_UNDERLINE_ASMFUNC

#define longest_match_7fff _longest_match_7fff

#define longest_match_686  _longest_match_686

#define cpudetect32        _cpudetect32

#endif



unsigned long cpudetect32();

uInt longest_match_c(
    deflate_state *s,
    IPos cur_match);                             /* current match */


uInt longest_match_7fff(
    deflate_state *s,
    IPos cur_match);                             /* current match */

uInt longest_match_686(
    deflate_state *s,
    IPos cur_match);                             /* current match */


static uInt iIsPPro=2;

void match_init ()
{
    iIsPPro = (((cpudetect32()/0x100)&0xf)>=6) ? 1 : 0;
}

uInt longest_match(
    deflate_state *s,
    IPos cur_match)                             /* current match */
{
    if (iIsPPro!=0)
        return longest_match_686(s,cur_match);

    if (s->w_mask != 0x7fff)
        return longest_match_686(s,cur_match);

    /* now ((s->w_mask == 0x7fff) && (iIsPPro==0)) */
        return longest_match_7fff(s,cur_match);
}


#endif /* defined(ASMV) && (!defined(NOOLDPENTIUMCODE)) */