/* 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)) */ |