zoukankan      html  css  js  c++  java
  • Berkeley SoftFloat fp16mul

    #include <stdbool.h>
    #include <stdint.h>
    #include "platform.h"
    #include "internals.h"
    #include "specialize.h"
    #include "softfloat.h"
    
    float16_t f16_mul( float16_t a, float16_t b )
    {
        union ui16_f16 uA;
        uint_fast16_t uiA;
        bool signA;
        int_fast8_t expA;
        uint_fast16_t sigA;
        union ui16_f16 uB;
        uint_fast16_t uiB;
        bool signB;
        int_fast8_t expB;
        uint_fast16_t sigB;
        bool signZ;
        uint_fast16_t magBits;
        struct exp8_sig16 normExpSig;
        int_fast8_t expZ;
        uint_fast32_t sig32Z;
        uint_fast16_t sigZ, uiZ;
        union ui16_f16 uZ;
    
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
        uA.f = a;
        uiA = uA.ui;
        signA = signF16UI( uiA );
        expA  = expF16UI( uiA );
        sigA  = fracF16UI( uiA );
        uB.f = b;
        uiB = uB.ui;
        signB = signF16UI( uiB );
        expB  = expF16UI( uiB );
        sigB  = fracF16UI( uiB );
        signZ = signA ^ signB;
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
        if ( expA == 0x1F ) {
            if ( sigA || ((expB == 0x1F) && sigB) ) goto propagateNaN;
            magBits = expB | sigB;
            goto infArg;
        }
        if ( expB == 0x1F ) {
            if ( sigB ) goto propagateNaN;
            magBits = expA | sigA;
            goto infArg;
        }
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
        if ( ! expA ) {
            if ( ! sigA ) goto zero;
            normExpSig = softfloat_normSubnormalF16Sig( sigA );
            expA = normExpSig.exp;
            sigA = normExpSig.sig;
        }
        if ( ! expB ) {
            if ( ! sigB ) goto zero;
            normExpSig = softfloat_normSubnormalF16Sig( sigB );
            expB = normExpSig.exp;
            sigB = normExpSig.sig;
        }
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
        expZ = expA + expB - 0xF;
        sigA = (sigA | 0x0400)<<4;
        sigB = (sigB | 0x0400)<<5;
        sig32Z = (uint_fast32_t) sigA * sigB;
        sigZ = sig32Z>>16;
        if ( sig32Z & 0xFFFF ) sigZ |= 1;
        if ( sigZ < 0x4000 ) {
            --expZ;
            sigZ <<= 1;
        }
        return softfloat_roundPackToF16( signZ, expZ, sigZ );
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
     propagateNaN:
        uiZ = softfloat_propagateNaNF16UI( uiA, uiB );
        goto uiZ;
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
     infArg:
        if ( ! magBits ) {
            softfloat_raiseFlags( softfloat_flag_invalid );
            uiZ = defaultNaNF16UI;
        } else {
            uiZ = packToF16UI( signZ, 0x1F, 0 );
        }
        goto uiZ;
        /*------------------------------------------------------------------------
        *------------------------------------------------------------------------*/
     zero:
        uiZ = packToF16UI( signZ, 0, 0 );
     uiZ:
        uZ.ui = uiZ;
        return uZ.f;
    
    }
  • 相关阅读:
    P1486 [NOI2004]郁闷的出纳员
    P1966 火柴排队
    P2627 修剪草坪
    P1621 集合
    P1025 数的划分
    中国剩余定理
    P2043 质因子分解
    P1075 质因数分解
    C#之引用类型参数
    C#之方法的定义及调用学习案例
  • 原文地址:https://www.cnblogs.com/yiyedada/p/11759452.html
Copyright © 2011-2022 走看看