我想问下int32_t div_sh48(int16_t x[3], int sh, int16_t y)这个函数的功能是干什么的?看了下英语介绍没有看懂。
int32_t div_sh48(register int16_t x[3], int sh, register int16_t y)
{
#if !(defined(__GNUC__) && defined(__MSP430__)) && !defined(__AQCOMPILER__)
int64_t tmp;
#endif
/* Preshift a 48 bit integer upwards by a specified amount. Then divide
a 16 bit integer into the shifted 48 bit one. Expect the answer to be
no greater than 32 bits, so return the answer as a 32 bit integer.
A somewhat domain specific divide operation, but pretty useful when
handling dot products. */
int32_t x1;
int32_t z;
register int16_t xx0;
register int16_t xx1;
register int16_t xx2;
/* Avoid any divide by zero trouble */
if (y == 0)
return 0;
xx0 = x[0];
xx1 = x[1];
xx2 = x[2];
if (sh > 0)
{
while (sh–)
{
#if defined(__GNUC__) && defined(__MSP430__)
__asm__ __volatile__ (
" rla %[xx0] \n"
" rlc %[xx1] \n"
" rlc %[xx2] \n"
: [xx0] "+r"(xx0), [xx1] "+r"(xx1), [xx2] "+r"(xx2)
: );
#elif defined(__AQCOMPILER__)
/$
rla @xx0
rlc @xx1
rlc @xx2
$/
#else
tmp = (uint16_t) xx2;
tmp <<= 16;
tmp |= (uint16_t) xx1;
tmp <<= 16;
tmp |= (uint16_t) xx0;
tmp <<= 1;
xx2 = (tmp >> 32) & 0xFFFF;
xx1 = (tmp >> 16) & 0xFFFF;
xx0 = tmp & 0xFFFF;
#endif
}
}
else
{
while (sh++)
{
#if defined(__GNUC__) && defined(__MSP430__)
__asm__ __volatile__ (
" rra %[xx2] \n"
" rrc %[xx1] \n"
" rrc %[xx0] \n"
: [xx0] "+r"(xx0), [xx1] "+r"(xx1), [xx2] "+r"(xx2)
: );
#elif defined(__AQCOMPILER__)
/$
rra @xx2
rrc @xx1
rrc @xx0
$/
#else
tmp = (uint16_t) xx2;
tmp <<= 16;
tmp |= (uint16_t) xx1;
tmp <<= 16;
tmp |= (uint16_t) xx0;
/* Make sure sign extension works */
tmp <<= 16;
tmp >>= 17;
xx2 = (tmp >> 32) & 0xFFFF;
xx1 = (tmp >> 16) & 0xFFFF;
xx0 = tmp & 0xFFFF;
#endif
}
}
x1 = xx2%y;
x1 <<= 16;
x1 |= (uint16_t) xx1;
z = x1/y;
x1 = x1%y;
x1 <<= 16;
x1 |= (uint16_t) xx0;
z = (z << 16) + x1/y;
return z;
}
Shi JianHua:
还真没用过,那个编译器呀
zhang zhigang:
回复 Shi JianHua:
这个就是6736J计量包里的一个函数额