⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 math32x.h

📁 FreeRTOS 是一个源码公开的免费的嵌入式实时操作系统
💻 H
📖 第 1 页 / 共 2 页
字号:
        rval = -rval;
    return rval;
}



fixedU16_16 operator* _xmulU16_16( fixedU16_16 arg1, fixedU16_16 arg2)
{
    fixedU16_16 rval;

   #ifdef hw_mult8x8

    uns8 tmpL;

    hw_mult8x8( arg1.low8, arg2.low8);   // p1
    tmpL = hiRES;
    rval = 0;

    hw_mult8x8( arg1.midL8, arg2.low8);  // p2
    tmpL += loRES;
    genAdd( rval.low8, hiRES);
    genAdd( rval.midL8, 0);

    hw_mult8x8( arg1.low8, arg2.midL8);  // p2
    tmpL += loRES;
    genAdd( rval.low8, hiRES);
    genAdd( rval.midL8, 0);

    hw_mult8x8( arg1.midH8, arg2.low8);  // p3
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.midL8, arg2.midL8);  // p3
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.low8, arg2.midH8);  // p3
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.high8, arg2.low8);  // p4
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.midH8, arg2.midL8);  // p4
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.midL8, arg2.midH8);  // p4
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.low8, arg2.high8);  // p4
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.high8, arg2.midL8);  // p5
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midH8, arg2.midH8);  // p5
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midL8, arg2.high8);  // p5
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.high8, arg2.midH8);  // p6
    rval.high8 += loRES;

    hw_mult8x8( arg1.midH8, arg2.high8);  // p6
    rval.high8 += loRES;

   #else

    char counter = sizeof(arg1)*8;
    uns16 rvalH = 0;
    rval.high16 = 0;
    do  {
        arg1 = rr( arg1);
        if (Carry)  {
            rval.midH8 += arg2.low8;
            genAdd( rval.high8, arg2.midL8);
            genAdd( rvalH.low8, arg2.midH8);
            genAdd( rvalH.high8, arg2.high8);
        }
        rvalH = rr( rvalH);
        rval = rr( rval);
        counter = decsz(counter);
    } while (1);

   #endif

    return rval;
}



fixed16_16 operator/ _xdiv16_16( fixed16_16 arg1, fixed16_16 arg2)
{
    fixedU16_16 rm = 0;
    char counter = sizeof(arg1)*8+16+1;
    char c2 = sizeof(arg1)*8 + 1;
    char sign = arg1.high8 ^ arg2.high8;
    if (arg1 < 0)  {
       INVERT:
        arg1 = -arg1;
        if (c2 & 0x80)
            goto EXIT;
    }
    if (arg2 < 0)
        arg2 = -arg2;
    goto ENTRY;
    do  {
        c2 = decsz(c2);
        btsc(c2.7);
        Carry = 0;
        rm = rl( rm);
        W = rm.low8 - arg2.low8;
        genSubW( rm.midL8, arg2.midL8);
        genSubW( rm.midH8, arg2.midH8);
        genSubW( rm.high8, arg2.high8);
        if (!Carry)
            goto ENTRY;
        rm.high8 = W;
        rm.low8 -= arg2.low8;
        genSub( rm.midL8, arg2.midL8);
        genSub( rm.midH8, arg2.midH8);
        Carry = 1;
       ENTRY:
        arg1 = rl( arg1);
        counter = decsz(counter);
    } while (1);
    if (sign & 0x80)
        goto INVERT;
   EXIT:
    return arg1;
}



fixedU16_16 operator/ _xdivU16_16( fixedU16_16 arg1, fixedU16_16 arg2)
{
    fixedU16_16 rm = 0;
    char counter = sizeof(arg1)*8+16+1;
    char c2 = sizeof(arg1)*8 + 1;
    goto ENTRY;
    do  {
        c2 = decsz(c2);
        btsc(c2.7);
        Carry = 0;
        rm = rl( rm);
        if (Carry)
            goto SUBTRACT;
        W = rm.low8 - arg2.low8;
        genSubW( rm.midL8, arg2.midL8);
        genSubW( rm.midH8, arg2.midH8);
        genSubW( rm.high8, arg2.high8);
        if (!Carry)
            goto ENTRY;
       SUBTRACT:
        rm.low8 -= arg2.low8;
        genSub( rm.midL8, arg2.midL8);
        genSub( rm.midH8, arg2.midH8);
        genSub( rm.high8, arg2.high8);
        Carry = 1;
       ENTRY:
        arg1 = rl( arg1);
        counter = decsz(counter);
    } while (1);
    return arg1;
}



fixed24_8 operator* _xmul24_8( fixed24_8 arg1, fixed24_8 arg2)
{
    fixed24_8 rval;
    char sign = arg1.high8 ^ arg2.high8;
    if (arg1 < 0)
        arg1 = -arg1;
    if (arg2 < 0)
        arg2 = -arg2;

   #ifdef hw_mult8x8

    hw_mult8x8( arg1.low8, arg2.low8);   // p1
    rval.low8 = hiRES;
    rval.high24 = 0;

    hw_mult8x8( arg1.midL8, arg2.low8);  // p2
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.low8, arg2.midL8);  // p2
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.midH8, arg2.low8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.midL8, arg2.midL8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.low8, arg2.high8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.high8, arg2.low8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midH8, arg2.midL8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midL8, arg2.midH8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.low8, arg2.high8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.high8, arg2.midL8);  // p5
    rval.high8 += loRES;

    hw_mult8x8( arg1.midH8, arg2.midH8);  // p5
    rval.high8 += loRES;

    hw_mult8x8( arg1.midL8, arg2.high8);  // p5
    rval.high8 += loRES;

   #else

    char counter = sizeof(arg1)*8;
    uns8 rvalL = 0;
    do  {
        Carry = 0;
        rvalL = rl( rvalL);
        rval = rl( rval);
        arg1 = rl( arg1);
        if (Carry)  {
            rvalL += arg2.low8;
            genAdd( rval.low8, arg2.midL8);
            genAdd( rval.midL8, arg2.midH8);
            genAdd( rval.midH8, arg2.high8);
            if (Carry)
                rval.high8++;
        }
        counter = decsz(counter);
    } while (1);

   #endif

    if (sign & 0x80)
        rval = -rval;
    return rval;
}



fixedU24_8 operator* _xmulU24_8( fixedU24_8 arg1, fixedU24_8 arg2)
{
    fixedU24_8 rval;

   #ifdef hw_mult8x8

    hw_mult8x8( arg1.low8, arg2.low8);   // p1
    rval.low8 = hiRES;
    rval.high24 = 0;

    hw_mult8x8( arg1.midL8, arg2.low8);  // p2
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.low8, arg2.midL8);  // p2
    rval.low8 += loRES;
    genAdd( rval.midL8, hiRES);
    genAdd( rval.midH8, 0);

    hw_mult8x8( arg1.midH8, arg2.low8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.midL8, arg2.midL8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.low8, arg2.high8);  // p3
    rval.midL8 += loRES;
    genAdd( rval.midH8, hiRES);
    genAdd( rval.high8, 0);

    hw_mult8x8( arg1.high8, arg2.low8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midH8, arg2.midL8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.midL8, arg2.midH8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.low8, arg2.high8);  // p4
    rval.midH8 += loRES;
    genAdd( rval.high8, hiRES);

    hw_mult8x8( arg1.high8, arg2.midL8);  // p5
    rval.high8 += loRES;

    hw_mult8x8( arg1.midH8, arg2.midH8);  // p5
    rval.high8 += loRES;

    hw_mult8x8( arg1.midL8, arg2.high8);  // p5
    rval.high8 += loRES;

   #else

    char counter = sizeof(arg1)*8;
    uns8 rvalL = 0;
    do  {
        Carry = 0;
        rvalL = rl( rvalL);
        rval = rl( rval);
        arg1 = rl( arg1);
        if (Carry)  {
            rvalL += arg2.low8;
            genAdd( rval.low8, arg2.midL8);
            genAdd( rval.midL8, arg2.midH8);
            genAdd( rval.midH8, arg2.high8);
            if (Carry)
                rval.high8++;
        }
        counter = decsz(counter);
    } while (1);

   #endif

    return rval;
}



fixed24_8 operator/ _xdiv24_8( fixed24_8 arg1, fixed24_8 arg2)
{
    fixedU24_8 rm = 0;
    char counter = sizeof(arg1)*8+8+1;
    char c2 = sizeof(arg1)*8 + 1;
    char sign = arg1.high8 ^ arg2.high8;
    if (arg1 < 0)  {
       INVERT:
        arg1 = -arg1;
        if (c2 & 0x80)
            goto EXIT;
    }
    if (arg2 < 0)
        arg2 = -arg2;
    goto ENTRY;
    do  {
        c2 = decsz(c2);
        btsc(c2.7);
        Carry = 0;
        rm = rl( rm);
        W = rm.low8 - arg2.low8;
        genSubW( rm.midL8, arg2.midL8);
        genSubW( rm.midH8, arg2.midH8);
        genSubW( rm.high8, arg2.high8);
        if (!Carry)
            goto ENTRY;
        rm.high8 = W;
        rm.low8 -= arg2.low8;
        genSub( rm.midL8, arg2.midL8);
        genSub( rm.midH8, arg2.midH8);
        Carry = 1;
       ENTRY:
        arg1 = rl( arg1);
        counter = decsz(counter);
    } while (1);
    if (sign & 0x80)
        goto INVERT;
   EXIT:
    return arg1;
}


fixedU24_8 operator/ _xdivU24_8( fixedU24_8 arg1, fixedU24_8 arg2)
{
    fixedU24_8 rm = 0;
    char counter = sizeof(arg1)*8+8+1;
    char c2 = sizeof(arg1)*8 + 1;
    goto ENTRY;
    do  {
        c2 = decsz(c2);
        btsc(c2.7);
        Carry = 0;
        rm = rl( rm);
        if (Carry)
            goto SUBTRACT;
        W = rm.low8 - arg2.low8;
        genSubW( rm.midL8, arg2.midL8);
        genSubW( rm.midH8, arg2.midH8);
        genSubW( rm.high8, arg2.high8);
        if (!Carry)
            goto ENTRY;
       SUBTRACT:
        rm.low8 -= arg2.low8;
        genSub( rm.midL8, arg2.midL8);
        genSub( rm.midH8, arg2.midH8);
        genSub( rm.high8, arg2.high8);
        Carry = 1;
       ENTRY:
        arg1 = rl( arg1);
        counter = decsz(counter);
    } while (1);
    return arg1;
}

#ifdef hw_mult8x8
 #undef hw_mult8x8
 #undef loRES
 #undef hiRES
#endif

#undef genAdd
#undef genSub
#undef genAddW
#undef genSubW

#pragma library 0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -