[sim] added SoftFloat-3 source
[riscv-isa-sim.git] / softfloat / SoftFloat-3 / source / s_addMagsF32.c
diff --git a/softfloat/SoftFloat-3/source/s_addMagsF32.c b/softfloat/SoftFloat-3/source/s_addMagsF32.c
new file mode 100755 (executable)
index 0000000..f361e2b
--- /dev/null
@@ -0,0 +1,75 @@
+\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