+++ /dev/null
-\r
-#include <stdbool.h>\r
-#include <stdint.h>\r
-#include "platform.h"\r
-#include "primitives.h"\r
-#include "internals.h"\r
-#include "specialize.h"\r
-#include "softfloat.h"\r
-\r
-float64_t f64_mul( float64_t a, float64_t b )\r
-{\r
- union ui64_f64 uA;\r
- uint_fast64_t uiA;\r
- bool signA;\r
- int_fast16_t expA;\r
- uint_fast64_t sigA;\r
- union ui64_f64 uB;\r
- uint_fast64_t uiB;\r
- bool signB;\r
- int_fast16_t expB;\r
- uint_fast64_t sigB;\r
- bool signZ;\r
- uint_fast64_t magBits;\r
- struct exp16_sig64 normExpSig;\r
- int_fast16_t expZ;\r
- struct uint128 sigZ128;\r
- uint_fast64_t sigZ, uiZ;\r
- union ui64_f64 uZ;\r
-\r
- uA.f = a;\r
- uiA = uA.ui;\r
- signA = signF64UI( uiA );\r
- expA = expF64UI( uiA );\r
- sigA = fracF64UI( uiA );\r
- uB.f = b;\r
- uiB = uB.ui;\r
- signB = signF64UI( uiB );\r
- expB = expF64UI( uiB );\r
- sigB = fracF64UI( uiB );\r
- signZ = signA ^ signB;\r
- if ( expA == 0x7FF ) {\r
- if ( sigA || ( ( expB == 0x7FF ) && sigB ) ) goto propagateNaN;\r
- magBits = expB | sigB;\r
- goto infArg;\r
- }\r
- if ( expB == 0x7FF ) {\r
- if ( sigB ) goto propagateNaN;\r
- magBits = expA | sigA;\r
- goto infArg;\r
- }\r
- if ( ! expA ) {\r
- if ( ! sigA ) goto zero;\r
- normExpSig = softfloat_normSubnormalF64Sig( sigA );\r
- expA = normExpSig.exp;\r
- sigA = normExpSig.sig;\r
- }\r
- if ( ! expB ) {\r
- if ( ! sigB ) goto zero;\r
- normExpSig = softfloat_normSubnormalF64Sig( sigB );\r
- expB = normExpSig.exp;\r
- sigB = normExpSig.sig;\r
- }\r
- expZ = expA + expB - 0x3FF;\r
- sigA = ( sigA | UINT64_C( 0x0010000000000000 ) )<<10;\r
- sigB = ( sigB | UINT64_C( 0x0010000000000000 ) )<<11;\r
- sigZ128 = softfloat_mul64To128( sigA, sigB );\r
- sigZ = sigZ128.v64 | ( sigZ128.v0 != 0 );\r
- if ( sigZ < UINT64_C( 0x4000000000000000 ) ) {\r
- --expZ;\r
- sigZ <<= 1;\r
- }\r
- return softfloat_roundPackToF64( signZ, expZ, sigZ );\r
- propagateNaN:\r
- uiZ = softfloat_propagateNaNF64UI( uiA, uiB );\r
- goto uiZ;\r
- infArg:\r
- if ( ! magBits ) {\r
- softfloat_raiseFlags( softfloat_flag_invalid );\r
- uiZ = defaultNaNF64UI;\r
- } else {\r
- uiZ = packToF64UI( signZ, 0x7FF, 0 );\r
- }\r
- goto uiZ;\r
- zero:\r
- uiZ = packToF64UI( signZ, 0, 0 );\r
- uiZ:\r
- uZ.ui = uiZ;\r
- return uZ.f;\r
-\r
-}\r
-\r