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

