
#include "entcode.h"
#include "basic_op.h"

unsigned short ec_tell_frac(ec_ctx *_this)
{
	unsigned int r;
	unsigned short nbits;
	short l, i;
#ifdef HW_HIFI3
	int b;
	long long tmp;
#endif
	nbits=_this->nbits_total<<BITRES;
#ifndef HW_FOR_GCC
	l=EC_ILOG(_this->rng);
#else
	asm volatile
		(
		"clz      %0,%1 \n\t"
		"RSB		%0,%0,#0x20 \n\t"
		:"=r"(l)
		:"r"(_this->rng) 
		);
#endif
	r=_this->rng>>(l-16);


#ifndef HW_HIFI3
	for(i=BITRES;i-->0;)
	{
		int b;
		r=r*r>>15;
		b=(int)(r>>16);
		l=l<<1|b;
		r>>=b;
	}
#else
//	r=r*r>>15;
	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;

#endif
	return nbits-l;
}
