16 bit integer square root
;Copyryght(c) 2005, Isaac Marino Bavaresco
;PIC24/dsPIC assembly:
;Input value = W10
;Result = W11
isqrt: mov.w #0x0080,W2
mov.w #0,W11
do #7,greater
ior.w W2,W11,W13
mul.uu W13,W13,W4
cp.w W10,W4
bra LTU,Greater
ior.w W2,W11,W11
greater: lsr.w W2,#1,W2
/*
C equivalent:
*/
unsigned short isqrt( unsigned short value )
{
unsigned short result, exp, temp;
for( result = 0, exp = 0x0080; exp != 0; exp >>= 1 )
{
temp = result | exp;
if( temp * temp <= value )
result = temp;
}
return result;
}
unsigned long isqrtl( unsigned long value )
{
unsigned long result, exp, temp;
for( result = 0, exp = 0x00008000; exp != 0; exp >>= 1 )
{
temp = result | exp;
if( temp * temp <= value )
result = temp;
}
return result;
}