亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? math32f.h

?? FreeRTOS 是一個源碼公開的免費的嵌入式實時操作系統
?? H
?? 第 1 頁 / 共 2 頁
字號:
// *************************************************
// 32 bit basic floating point math operations
// Copyright (c) B Knudsen Data, Norway, 2000 - 2005
// *************************************************

#pragma library 1
/* PROTOTYPES for page definition in application header file:
float32 operator* _fmul32( float32 arg1f32, float32 arg2f32);
float32 operator/ _fdiv32( float32 arg1f32, float32 arg2f32);
float32 operator+ _fadd32( float32 arg1f32, float32 arg2f32);
float32 operator- _fsub32( float32 arg1f32, float32 arg2f32);
float32 operator= _int32ToFloat32( int32 arg1f32);
int32 operator= _float32ToInt32( float32 arg1f32);
bit operator< _f32_LT_f32( float32 arg1f32, float32 arg2f32);
bit operator>= _f32_GE_f32( float32 arg1f32, float32 arg2f32);
bit operator> _f32_GT_f32( float32 arg1f32, float32 arg2f32);
bit operator<= _f32_LE_f32( float32 arg1f32, float32 arg2f32);
*/

// DEFINABLE SYMBOLS (in the application code):
//#define FP_OPTIM_SPEED  // optimize for SPEED: default
//#define FP_OPTIM_SIZE   // optimize for SIZE
//#define DISABLE_ROUNDING   // disable rounding and save code space

#define float32ToIEEE754(a) { a.midH8=rl(a.midH8); a.high8=rr(a.high8);\
                              a.midH8=rr(a.midH8); }
#define IEEE754ToFloat32(a) { a.midH8=rl(a.midH8); a.high8=rl(a.high8);\
                              a.midH8=rr(a.midH8); }

/*  32 bit floating point format:

  address  ID
    X      a.low8  : LSB, bit 0-7 of mantissa
    X+1    a.midL8 : bit 8-15 of mantissa
    X+2    a.midH8 : bit 16-22 of mantissa, bit 23 is the sign bit
    X+3    a.high8 : MSB, bit 0-7 of exponent, with bias 0x7F

    bit 23 of mantissa is a hidden bit, always equal to 1
    zero (0.0) :  a.high8 = 0 (mantissa & sign ignored)

   MSB       LSB
    7F 00 00 00  : 1.0   =  1.0  * 2**(0x7F-0x7F) = 1.0 * 1
    7F 80 00 00  : -1.0  = -1.0  * 2**(0x7F-0x7F) = -1.0 * 1
    80 00 00 00  : 2.0   =  1.0  * 2**(0x80-0x7F) = 1.0 * 2
    80 40 00 00  : 3.0   =  1.5  * 2**(0x80-0x7F) = 1.5 * 2
    7E 60 00 00  : 0.875 =  1.75 * 2**(0x7E-0x7F) = 1.75 * 0.5
    7F 60 00 00  : 1.75  =  1.75 * 2**(0x7E-0x7F) = 1.75 * 1
    7F 7F FF FF  : 1.9999998808
    00 7C E3 5A  : 0.0 (mantissa & sign ignored)
    01 00 00 00  : 1.1754943508e-38 =  1.0 * 2**(0x01-0x7F)
    FE 7F FF FF  : 3.4028234664e+38 =  1.9999998808 * 2**(0xFE-0x7F)
    FF 00 00 00  : +INF : positive infinity
    FF 80 00 00  : -INF : negative infinity
*/                 

#define  FpBIAS  0x7F

#ifndef FpFlags_defined
 #define FpFlags_defined

 char FpFlags;
 //bit IOV         @ FpFlags.0; // integer overflow flag: NOT USED
 bit FpOverflow    @ FpFlags.1; // floating point overflow flag
 bit FpUnderFlow   @ FpFlags.2; // floating point underflow flag
 bit FpDiv0        @ FpFlags.3; // floating point divide by zero flag
 //bit FpNAN       @ FpFlags.4; // not-a-number exception flag: NOT USED
 bit FpDomainError @ FpFlags.5; // domain error exception flag
 bit FpRounding    @ FpFlags.6; // floating point rounding flag, 0=truncation
                                // 1 = unbiased rounding to nearest LSB
 //bit FpSaturate  @ FpFlags.7; // floating point saturate flag: NOT USED

 #pragma floatOverflow FpOverflow
 #pragma floatUnderflow FpUnderFlow

 #define InitFpFlags()  FpFlags = 0x40 /* enable rounding as default */
#endif

#ifdef DISABLE_ROUNDING
 #pragma floatRounding 0
#endif

#if __CoreSet__ < 1600
 #define genAdd(r,a) W=a; btsc(Carry); W=incsz(a); r+=W;
 #define genSub(r,a) W=a; btss(Carry); W=incsz(a); r-=W;
 #define genAddW(r,a) W=a; btsc(Carry); W=incsz(a); W=r+W;
 #define genSubW(r,a) W=a; btss(Carry); W=incsz(a); W=r-W;
#else
 #define genAdd(r,a) W=a; r=addWFC(r);
 #define genSub(r,a) W=a; r=subWFB(r);
 #define genAddW(r,a) W=a; W=addWFC(r);
 #define genSubW(r,a) W=a; W=subWFB(r);
#endif

#if __CoreSet__ == 1700 || __CoreSet__ == 1800
 #define hw_mult8x8(a,b)  { W = a; multiply(b); }
 #define loRES PRODL
 #define hiRES PRODH
#endif

#if __CoreSet__ == 2000
 #define hw_mult8x8(a,b)  { W = a; multiply(b); }
 #define loRES W
 #define hiRES MULH
#endif


float32 operator* _fmul32( sharedM float32 arg1f32, sharedM float32 arg2f32)
// CYCLES: 24 + 21*24 + 30 + 7 = 565
{
    uns24 aarg;
    W = arg1f32.midH8;
    aarg.high8 = W;

    // save sign
    char sign = arg2f32.midH8 ^ W;  // before first overflow test

    W = arg1f32.high8;
   #if __CoreSet__ / 100 == 17
    if (W != 0)
        W = arg2f32.high8;
    if (W == 0)
        goto RES0;
   #else
    if (!Zero_)
        W = arg2f32.high8;
    if (Zero_)
        goto RES0;
   #endif

    arg1f32.high8 += W /* arg2f32.high8 */;
    W = FpBIAS-1;
    if (Carry)  {
        arg1f32.high8 -= W;
        if (Carry)
            goto OVERFLOW;
    }
    else  {
        arg1f32.high8 -= W;
        if (!Carry)
            goto UNDERFLOW;
    }
    aarg.low16 = arg1f32.low16;

    aarg.23 = 1;
    arg2f32.23 = 1;

   #if defined hw_mult8x8  &&  !defined FP_OPTIM_SIZE

    char tmpL, tmpM;
    tmpL = 0;
    arg1f32.low24 = 0;

    hw_mult8x8( arg2f32.low8, aarg.low8);   // p1
    tmpM = hiRES;

    hw_mult8x8( arg2f32.midL8, aarg.low8);  // p2
    tmpM += loRES;
    genAdd( tmpL, hiRES);
    genAdd( arg1f32.low8, 0);

    hw_mult8x8( arg2f32.low8, aarg.midL8);  // p2
    tmpM += loRES;
    genAdd( tmpL, hiRES);
    genAdd( arg1f32.low8, 0);

    hw_mult8x8( arg2f32.midH8, aarg.low8);  // p3
    tmpL += loRES;
    genAdd( arg1f32.low8, hiRES);
    genAdd( arg1f32.midL8, 0);

    hw_mult8x8( arg2f32.midL8, aarg.midL8);  // p3
    tmpL += loRES;
    genAdd( arg1f32.low8, hiRES);
    genAdd( arg1f32.midL8, 0);

    hw_mult8x8( arg2f32.low8, aarg.midH8);  // p3
    tmpL += loRES;
    genAdd( arg1f32.low8, hiRES);
    genAdd( arg1f32.midL8, 0);

    hw_mult8x8( arg2f32.midH8, aarg.midL8);  // p4
    arg1f32.low8 += loRES;
    genAdd( arg1f32.midL8, hiRES);
    genAdd( arg1f32.midH8, 0);

    hw_mult8x8( arg2f32.midL8, aarg.midH8);  // p4
    arg1f32.low8 += loRES;
    genAdd( arg1f32.midL8, hiRES);
    genAdd( arg1f32.midH8, 0);

    hw_mult8x8( arg2f32.midH8, aarg.midH8);  // p5
    arg1f32.midL8 += loRES;
    genAdd( arg1f32.midH8, hiRES);

   #undef hw_mult8x8
   #undef loRES
   #undef hiRES

    if (!arg1f32.23)  {
        tmpL = rl( tmpL);
        arg1f32.low24 = rl( arg1f32.low24);
        if (arg1f32.high8 == 0)
            goto UNDERFLOW;
        arg1f32.high8 -= 1;
        W = rl( tmpL);  // restore bit behind LSB in Carry
    }

   #else

    arg1f32.low24 = 0;

    char counter = sizeof(aarg)*8;

    do  {
        aarg = rr( aarg);
        if (Carry)  {
            arg1f32.low8 += arg2f32.low8;
            genAdd( arg1f32.midL8, arg2f32.midL8);
            genAdd( arg1f32.midH8, arg2f32.midH8);
        }
        arg1f32.low24 = rr( arg1f32.low24);
        counter = decsz(counter);
    } while (1);

    if (!arg1f32.23)  {
        // catch Carry bit that was shifted out previously
        arg1f32.low24 = rl( arg1f32.low24);
        if (arg1f32.high8 == 0)
            goto UNDERFLOW;
        arg1f32.high8 -= 1;
        W = rl( aarg.high8);
        // restore bit behind LSB in Carry
    }

   #endif

   #ifndef DISABLE_ROUNDING
    if (FpRounding  &&  Carry)  {
        arg1f32.low8 += 1;
        if (!arg1f32.low8)  {
            arg1f32.midL8 += 1;
            if (!arg1f32.midL8)  {
                arg1f32.midH8 += 1;
                if (!arg1f32.midH8)  {
                   #if __CoreSet__ >= 1700 && __CoreSet__ <= 1800
                    Carry = 1; // previous INCF changes Carry
                   #else
                    // Carry = 1; //OK
                   #endif
                    arg1f32.low24 = rr( arg1f32.low24);
                    arg1f32.high8 += 1;
                    if (Zero_)
                        goto OVERFLOW;
                }
            }
        }
    }
   #endif
    goto SET_SIGN;

  UNDERFLOW:
    FpUnderFlow = 1;
  RES0:
    arg1f32.high8 = 0;
    goto MANTISSA;

  OVERFLOW:
    FpOverflow = 1;
    arg1f32.high8 = 0xFF;
  MANTISSA:
    arg1f32.low24 = 0x800000;

  SET_SIGN:
    if (!(sign & 0x80))
        arg1f32.23 = 0;
    return arg1f32;
}



float32 operator/ _fdiv32( sharedM float32 arg1f32, sharedM float32 arg2f32)
// CYCLES: 28 + 23(++)*24 + 8+23(++)(align) + 37(round) = 648++
{
    uns24 aarg;
    W = arg1f32.midH8;
    aarg.high8 = W;

    // save sign
    char sign = arg2f32.midH8 ^ W;  // before first overflow test

   #if __CoreSet__ / 100 == 17
    if (!arg2f32.high8)
        goto Div0;
   #else
    W = arg2f32.high8;
    if (Zero_)
        goto Div0;
   #endif
    if (!arg1f32.high8)
        goto RES0;

    arg1f32.high8 -= arg2f32.high8;
    W = FpBIAS;
    if (!Carry)  {
        arg1f32.high8 += W;
        if (!Carry)
            goto UNDERFLOW;
    }
    else  {
        arg1f32.high8 += W;
        if (Carry)
            goto OVERFLOW;
    }

    aarg.low16 = arg1f32.low16;
    aarg.23 = 1;
    arg2f32.23 = 1;

    // division: shift & add
    char counter = 24;
    arg1f32.low24 = 0;  // speedup

#if defined FP_OPTIM_SPEED || !defined FP_OPTIM_SIZE  // SPEED

    // CYCLES :  23 * 25 = 575
    // cycles pr loop:
    //   23 if Carry = 1
    //   28 if aarg.MSB > arg2f32.MSB
    //   18 if aarg.MSB < arg2f32.MSB
    //         aarg.MSB = arg2f32.MSB : 7 (init) + 9 (goto_shift_in_carry)
    //   31: 16+15 aarg.low16 >= arg2f32.low16
    //   25: 16+9 aarg.low16 < arg2f32.low16

    goto START;

  TEST_ZERO_L:
    W = aarg.low8 - arg2f32.low8;
    genSubW( aarg.mid8, arg2f32.midL8);
    if (!Carry)
        goto SHIFT_IN_CARRY;
    aarg.mid8 = W;
    aarg.high8 = 0;
    aarg.low8 -= arg2f32.low8;
    goto SET_AND_SHIFT_IN_CARRY;

// MAIN LOOP
    do  {
      LOOP:
        if (!Carry)  {
           START:
            W = aarg.high8 - arg2f32.midH8;
            if (Zero_)
                goto TEST_ZERO_L;
            if (!Carry)
                goto SHIFT_IN_CARRY;
        }
        aarg.low8 -= arg2f32.low8;
        genSub( aarg.mid8, arg2f32.midL8);
        genSub( aarg.high8, arg2f32.midH8);
      SET_AND_SHIFT_IN_CARRY:
        Carry = 1;
      SHIFT_IN_CARRY:
        arg1f32.low24 = rl( arg1f32.low24);
        // Carry = 0;  // ok, speedup
        aarg = rl( aarg);
        counter = decsz(counter);
    } while (1);



#else  // SIZE

    goto START;

// MAIN LOOP
    do  {
      LOOP:
        if (Carry)
            goto SUBTRACT;
      START:
        W = aarg.low8 - arg2f32.low8;
        genSubW( aarg.mid8, arg2f32.midL8);
        genSubW( aarg.high8, arg2f32.midH8);
        if (!Carry)
            goto SKIP_SUB;
       SUBTRACT:
        aarg.low8 -= arg2f32.low8;
        genSub( aarg.mid8, arg2f32.midL8);
        genSub( aarg.high8, arg2f32.midH8);
        Carry = 1;
       SKIP_SUB:
        arg1f32.low24 = rl( arg1f32.low24);
        // Carry = 0;  // ok
        aarg = rl( aarg);
        counter = decsz(counter);
    } while (1);

#endif

    if (!arg1f32.23)  {
        if (!arg1f32.high8)
            goto UNDERFLOW;
       #if __CoreSet__ >= 1700 && __CoreSet__ <= 1800
        sign = rr( sign);   // Save Carry
       #endif
        arg1f32.high8 --;
        counter ++;
       #if __CoreSet__ >= 1700 && __CoreSet__ <= 1800
        sign = rl( sign);   // Restore Carry, changed by INCF/DECF
       #endif
        goto LOOP;
    }

   #ifndef DISABLE_ROUNDING
    if (FpRounding)  {
        if (Carry)
            goto ADD_1;
        aarg.low8 -= arg2f32.low8;
        genSub( aarg.mid8, arg2f32.midL8);
        genSub( aarg.high8, arg2f32.midH8);
        if (Carry)  {
          ADD_1:
            arg1f32.low8 += 1;
            if (!arg1f32.low8)  {
                arg1f32.midL8++;
                if (!arg1f32.midL8)  {
                    arg1f32.midH8 ++;
                    if (!arg1f32.midH8)  {
                        arg1f32.low24 = rr( arg1f32.low24);
                        arg1f32.high8 ++;
                        if (!arg1f32.high8)
                            goto OVERFLOW;
                    }
                }
            }
        }
    }
   #endif
    goto SET_SIGN;

  Div0:
    FpDiv0 = 1;
    goto SATURATE;

  UNDERFLOW:
    FpUnderFlow = 1;
  RES0:
    arg1f32.high8 = 0;
    goto MANTISSA;

  OVERFLOW:
    FpOverflow = 1;
  SATURATE:
    arg1f32.high8 = 0xFF;
  MANTISSA:
    arg1f32.low24 = 0x800000;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
宅男噜噜噜66一区二区66| 日韩va欧美va亚洲va久久| 丰满少妇在线播放bd日韩电影| 精品国产凹凸成av人网站| 国产自产高清不卡| 国产欧美一区视频| 99久久国产综合精品色伊| 亚洲一级二级三级| 日韩免费一区二区| 国产成+人+日韩+欧美+亚洲| 亚洲色图欧美偷拍| 欧美日韩中文一区| 狠狠色综合日日| 国产精品久久久久久久久晋中| 91麻豆精品在线观看| 日韩中文字幕一区二区三区| 欧美一区二区三区视频免费| 国产精品一级黄| 一区二区三区四区视频精品免费| 欧美久久一二区| 国产传媒日韩欧美成人| 亚洲天堂av老司机| 欧美一区二区高清| av电影一区二区| 青青草91视频| 亚洲天堂2014| 26uuu国产一区二区三区| 92精品国产成人观看免费| 免费观看91视频大全| 亚洲国产精品v| 91精品国产综合久久婷婷香蕉 | 精品三级在线看| www.亚洲精品| 久久国产精品72免费观看| 亚洲欧美偷拍三级| 久久久久久久综合| 欧美日韩视频在线观看一区二区三区| 国产美女主播视频一区| 亚洲成av人**亚洲成av**| 国产精品色在线| 日韩欧美一区在线| 欧洲一区在线电影| 国产传媒一区在线| 激情偷乱视频一区二区三区| 一区二区三区在线观看国产| 久久久www免费人成精品| 欧美日韩1234| 91首页免费视频| 国产精品456| 美女视频一区二区| 偷拍一区二区三区四区| 亚洲精选在线视频| 中文字幕一区二区5566日韩| 26uuu久久综合| 欧美一区二区三区在线电影| 欧美三级欧美一级| 色综合天天综合网天天狠天天| 国产精品影视在线| 蜜桃视频在线观看一区| 日韩成人免费在线| 亚洲国产精品麻豆| 一区二区三区高清| 亚洲日本青草视频在线怡红院 | 亚洲第一久久影院| 亚洲少妇中出一区| 亚洲伦在线观看| 综合av第一页| 中文字幕亚洲视频| 国产精品传媒入口麻豆| 欧美国产一区在线| 国产欧美1区2区3区| 久久精品视频一区二区三区| 精品国产乱码久久久久久久 | 成人aa视频在线观看| 国产成人av影院| 成人蜜臀av电影| 99久久久免费精品国产一区二区| 岛国一区二区三区| 成人免费不卡视频| 色素色在线综合| 欧美婷婷六月丁香综合色| 欧美色涩在线第一页| 欧美美女一区二区三区| 国产精品理论片在线观看| 欧美极品美女视频| 成人免费一区二区三区在线观看| 亚洲婷婷在线视频| 亚洲不卡一区二区三区| 日韩综合一区二区| 韩国v欧美v亚洲v日本v| 国产91丝袜在线观看| av在线不卡电影| 欧美系列日韩一区| 欧美一级黄色录像| 久久精品视频在线看| 亚洲人午夜精品天堂一二香蕉| 亚洲黄色av一区| 日本欧美一区二区三区乱码| 久久精品二区亚洲w码| 国产成人8x视频一区二区| 色综合激情五月| 宅男在线国产精品| 欧美国产精品中文字幕| 亚洲一区二区av在线| 国产综合色在线视频区| 99国产精品视频免费观看| 欧美性猛交xxxx黑人交| www成人在线观看| 亚洲男人的天堂网| 久久精品二区亚洲w码| 99精品欧美一区二区三区综合在线| 欧美色涩在线第一页| 久久色.com| 亚洲影院免费观看| 国产在线精品一区二区不卡了 | 色综合激情久久| 欧美一区二区三区视频| 国产精品热久久久久夜色精品三区| 一二三区精品视频| 久久99精品一区二区三区| 色哟哟国产精品| wwww国产精品欧美| 午夜精品一区二区三区免费视频| 国产精品系列在线播放| 欧美日韩精品一区二区三区蜜桃| 中文字幕欧美激情| 免费人成网站在线观看欧美高清| 成人久久久精品乱码一区二区三区| 欧美日韩五月天| 亚洲人成网站在线| 国产一区二区美女诱惑| 欧美福利视频一区| 亚洲九九爱视频| 成人av电影免费在线播放| 日韩免费观看高清完整版| 一区二区三区欧美久久| 国产成人av资源| 日韩美女视频在线| 亚洲成人av电影在线| caoporen国产精品视频| 久久伊人蜜桃av一区二区| 日本vs亚洲vs韩国一区三区| 91国产成人在线| 1000精品久久久久久久久| 国产乱码精品一区二区三区av| 91麻豆精品国产91久久久 | 午夜激情久久久| 91在线免费看| 欧美韩国日本综合| 国产乱人伦偷精品视频免下载| 日韩欧美成人一区| 日韩国产欧美在线观看| 欧美三级韩国三级日本一级| 亚洲欧美一区二区三区孕妇| 成人va在线观看| 日本一区二区成人| 国产寡妇亲子伦一区二区| 精品国产乱码91久久久久久网站| 日本亚洲三级在线| 4438x亚洲最大成人网| 午夜精品久久久久影视| 欧美日韩午夜在线视频| 亚洲影院免费观看| 欧美日韩精品系列| 首页欧美精品中文字幕| 欧美高清视频在线高清观看mv色露露十八 | 免费美女久久99| 337p亚洲精品色噜噜狠狠| 五月激情综合网| 91精品国产色综合久久| 人人超碰91尤物精品国产| 日韩一本二本av| 精品无人码麻豆乱码1区2区| 精品欧美乱码久久久久久1区2区| 久久精品72免费观看| 久久精品视频一区二区三区| 成人免费视频视频| 亚洲视频一区二区在线| 欧美日韩国产大片| 久久99热99| 久久久久久影视| 99精品久久久久久| 亚洲国产精品自拍| 欧美va日韩va| 丁香婷婷综合色啪| 一区二区三区美女视频| 欧美日本不卡视频| 久久er99精品| 综合久久综合久久| 欧美日韩国产不卡| 久久91精品国产91久久小草| 中文字幕精品一区二区精品绿巨人 | 成人精品在线视频观看| 亚洲青青青在线视频| 欧美情侣在线播放| 国产老肥熟一区二区三区| 亚洲欧洲韩国日本视频| 欧美在线观看禁18| 国产美女精品一区二区三区| 亚洲私人黄色宅男|