--- /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
+float32_t f32_mul( float32_t a, float32_t b )\r
+{\r
+ union ui32_f32 uA;\r
+ uint_fast32_t uiA;\r
+ bool signA;\r
+ int_fast16_t expA;\r
+ uint_fast32_t sigA;\r
+ union ui32_f32 uB;\r
+ uint_fast32_t uiB;\r
+ bool signB;\r
+ int_fast16_t expB;\r
+ uint_fast32_t sigB;\r
+ bool signZ;\r
+ uint_fast32_t magBits;\r
+ struct exp16_sig32 normExpSig;\r
+ int_fast16_t expZ;\r
+ uint_fast32_t sigZ, uiZ;\r
+ union ui32_f32 uZ;\r
+\r
+ uA.f = a;\r
+ uiA = uA.ui;\r
+ signA = signF32UI( uiA );\r
+ expA = expF32UI( uiA );\r
+ sigA = fracF32UI( uiA );\r
+ uB.f = b;\r
+ uiB = uB.ui;\r
+ signB = signF32UI( uiB );\r
+ expB = expF32UI( uiB );\r
+ sigB = fracF32UI( uiB );\r
+ signZ = signA ^ signB;\r
+ if ( expA == 0xFF ) {\r
+ if ( sigA || ( ( expB == 0xFF ) && sigB ) ) goto propagateNaN;\r
+ magBits = expB | sigB;\r
+ goto infArg;\r
+ }\r
+ if ( expB == 0xFF ) {\r
+ if ( sigB ) goto propagateNaN;\r
+ magBits = expA | sigA;\r
+ goto infArg;\r
+ }\r
+ if ( ! expA ) {\r
+ if ( ! sigA ) goto zero;\r
+ normExpSig = softfloat_normSubnormalF32Sig( sigA );\r
+ expA = normExpSig.exp;\r
+ sigA = normExpSig.sig;\r
+ }\r
+ if ( ! expB ) {\r
+ if ( ! sigB ) goto zero;\r
+ normExpSig = softfloat_normSubnormalF32Sig( sigB );\r
+ expB = normExpSig.exp;\r
+ sigB = normExpSig.sig;\r
+ }\r
+ expZ = expA + expB - 0x7F;\r
+ sigA = ( sigA | 0x00800000 )<<7;\r
+ sigB = ( sigB | 0x00800000 )<<8;\r
+ sigZ = softfloat_shortShift64RightJam( (uint_fast64_t) sigA * sigB, 32 );\r
+ if ( sigZ < 0x40000000 ) {\r
+ --expZ;\r
+ sigZ <<= 1;\r
+ }\r
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );\r
+ propagateNaN:\r
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );\r
+ goto uiZ;\r
+ infArg:\r
+ if ( ! magBits ) {\r
+ softfloat_raiseFlags( softfloat_flag_invalid );\r
+ uiZ = defaultNaNF32UI;\r
+ } else {\r
+ uiZ = packToF32UI( signZ, 0xFF, 0 );\r
+ }\r
+ goto uiZ;\r
+ zero:\r
+ uiZ = packToF32UI( signZ, 0, 0 );\r
+ uiZ:\r
+ uZ.ui = uiZ;\r
+ return uZ.f;\r
+\r
+}\r
+\r