--- /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
+\r
+float32_t\r
+ softfloat_addMagsF32( uint_fast32_t uiA, uint_fast32_t uiB, bool signZ )\r
+{\r
+ int_fast16_t expA;\r
+ uint_fast32_t sigA;\r
+ int_fast16_t expB;\r
+ uint_fast32_t sigB;\r
+ int_fast16_t expDiff;\r
+ uint_fast32_t uiZ;\r
+ int_fast16_t expZ;\r
+ uint_fast32_t sigZ;\r
+ union ui32_f32 uZ;\r
+\r
+ expA = expF32UI( uiA );\r
+ sigA = fracF32UI( uiA );\r
+ expB = expF32UI( uiB );\r
+ sigB = fracF32UI( uiB );\r
+ expDiff = expA - expB;\r
+ sigA <<= 6;\r
+ sigB <<= 6;\r
+ if ( ! expDiff ) {\r
+ if ( expA == 0xFF ) {\r
+ if ( sigA | sigB ) goto propagateNaN;\r
+ uiZ = uiA;\r
+ goto uiZ;\r
+ }\r
+ if ( ! expA ) {\r
+ uiZ = packToF32UI( signZ, 0, ( uiA + uiB ) & 0x7FFFFFFF );\r
+ goto uiZ;\r
+ }\r
+ expZ = expA;\r
+ sigZ = 0x40000000 + sigA + sigB;\r
+ } else {\r
+ if ( expDiff < 0 ) {\r
+ if ( expB == 0xFF ) {\r
+ if ( sigB ) goto propagateNaN;\r
+ uiZ = packToF32UI( signZ, 0xFF, 0 );\r
+ goto uiZ;\r
+ }\r
+ expZ = expB;\r
+ sigA += expA ? 0x20000000 : sigA;\r
+ sigA = softfloat_shift32RightJam( sigA, - expDiff );\r
+ } else {\r
+ if ( expA == 0xFF ) {\r
+ if ( sigA ) goto propagateNaN;\r
+ uiZ = uiA;\r
+ goto uiZ;\r
+ }\r
+ expZ = expA;\r
+ sigB += expB ? 0x20000000 : sigB;\r
+ sigB = softfloat_shift32RightJam( sigB, expDiff );\r
+ }\r
+ sigZ = 0x20000000 + sigA + sigB;\r
+ if ( sigZ < 0x40000000 ) {\r
+ --expZ;\r
+ sigZ <<= 1;\r
+ }\r
+ }\r
+ return softfloat_roundPackToF32( signZ, expZ, sigZ );\r
+ propagateNaN:\r
+ uiZ = softfloat_propagateNaNF32UI( uiA, uiB );\r
+ uiZ:\r
+ uZ.ui = uiZ;\r
+ return uZ.f;\r
+\r
+}\r
+\r