

//#ifdef HAVE_CONFIG_H
#include "config.h"
//#endif

#include "rc_code.h"
#include "ssc_macro.h"

#ifndef VC_PROJ
#include <xtensa/tie/xt_hifi2.h>
extern ae_int64 AE_MUL32U_LL(ae_int32x2 d0, ae_int32x2 d1);
#endif

int ec_ilog(unsigned int _v){

#ifdef FOR_VISUAL_C_NO_ASSM
  int ret;
  int m;
  ret=!!_v;
  m=!!(_v&0xFFFF0000)<<4;
  _v>>=m;
  ret|=m;
  m=!!(_v&0xFF00)<<3;
  _v>>=m;
  ret|=m;
  m=!!(_v&0xF0)<<2;
  _v>>=m;
  ret|=m;
  m=!!(_v&0xC)<<1;
  _v>>=m;
  ret|=m;
  ret+=!!(_v&0x2);
  return ret;

#else

  return (32-__clz(_v));	

#endif
  
}

unsigned int ec_tell_frac(ec_ctx *_this){
  unsigned int nbits;


  unsigned int r;

#ifndef VC_PROJ
  long long tmp;
#endif  
  int          l;
  int          i;

  nbits=_this->nbits_total<<BITRES;
  l=EC_ILOG(_this->rng);
  r=_this->rng>>(l-16);
//#if 0
#ifdef VC_PROJ
  for(i=BITRES;i-->0;){
    int b;
    r=r*r>>15;
    b=(int)(r>>16);
    l=l<<1|b;
    r>>=b;
  }
#else
  int b;
  tmp = AE_MUL32_HH(r, r);
  r = ((int)(tmp>>15));
  b=(int)(r>>16);
  l=l<<1|b;
  r>>=b;

  tmp = AE_MUL32_HH(r, r);
  r = ((int)(tmp>>15));
  b=(int)(r>>16);
  l=l<<1|b;
  r>>=b;

  tmp = AE_MUL32_HH(r, r);
  r = ((int)(tmp>>15));
  b=(int)(r>>16);
  l=l<<1|b;
  r>>=b;
#endif
  return nbits-l;
}
