TI中文支持网
TI专业的中文技术问题搜集分享网站

关于MSP430的库函数int32_t div_sh48(int16_t x[3], int sh, int16_t y)

我想问下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计量包里的一个函数额

赞(0)
未经允许不得转载:TI中文支持网 » 关于MSP430的库函数int32_t div_sh48(int16_t x[3], int sh, int16_t y)
分享到: 更多 (0)