temporary undoing of renaming
[riscv-isa-sim.git] / softfloat / f32_mul.c
1
2 #include <stdbool.h>
3 #include <stdint.h>
4 #include "platform.h"
5 #include "primitives.h"
6 #include "internals.h"
7 #include "specialize.h"
8 #include "softfloat.h"
9
10 float32_t f32_mul( float32_t a, float32_t b )
11 {
12 union ui32_f32 uA;
13 uint_fast32_t uiA;
14 bool signA;
15 int_fast16_t expA;
16 uint_fast32_t sigA;
17 union ui32_f32 uB;
18 uint_fast32_t uiB;
19 bool signB;
20 int_fast16_t expB;
21 uint_fast32_t sigB;
22 bool signZ;
23 uint_fast32_t magBits;
24 struct exp16_sig32 normExpSig;
25 int_fast16_t expZ;
26 uint_fast32_t sigZ, uiZ;
27 union ui32_f32 uZ;
28
29 uA.f = a;
30 uiA = uA.ui;
31 signA = signF32UI( uiA );
32 expA = expF32UI( uiA );
33 sigA = fracF32UI( uiA );
34 uB.f = b;
35 uiB = uB.ui;
36 signB = signF32UI( uiB );
37 expB = expF32UI( uiB );
38 sigB = fracF32UI( uiB );
39 signZ = signA ^ signB;
40 if ( expA == 0xFF ) {
41 if ( sigA || ( ( expB == 0xFF ) && sigB ) ) goto propagateNaN;
42 magBits = expB | sigB;
43 goto infArg;
44 }
45 if ( expB == 0xFF ) {
46 if ( sigB ) goto propagateNaN;
47 magBits = expA | sigA;
48 goto infArg;
49 }
50 if ( ! expA ) {
51 if ( ! sigA ) goto zero;
52 normExpSig = softfloat_normSubnormalF32Sig( sigA );
53 expA = normExpSig.exp;
54 sigA = normExpSig.sig;
55 }
56 if ( ! expB ) {
57 if ( ! sigB ) goto zero;
58 normExpSig = softfloat_normSubnormalF32Sig( sigB );
59 expB = normExpSig.exp;
60 sigB = normExpSig.sig;
61 }
62 expZ = expA + expB - 0x7F;
63 sigA = ( sigA | 0x00800000 )<<7;
64 sigB = ( sigB | 0x00800000 )<<8;
65 sigZ = softfloat_shortShift64RightJam( (uint_fast64_t) sigA * sigB, 32 );
66 if ( sigZ < 0x40000000 ) {
67 --expZ;
68 sigZ <<= 1;
69 }
70 return softfloat_roundPackToF32( signZ, expZ, sigZ );
71 propagateNaN:
72 uiZ = softfloat_propagateNaNF32UI( uiA, uiB );
73 goto uiZ;
74 infArg:
75 if ( ! magBits ) {
76 softfloat_raiseFlags( softfloat_flag_invalid );
77 uiZ = defaultNaNF32UI;
78 } else {
79 uiZ = packToF32UI( signZ, 0xFF, 0 );
80 }
81 goto uiZ;
82 zero:
83 uiZ = packToF32UI( signZ, 0, 0 );
84 uiZ:
85 uZ.ui = uiZ;
86 return uZ.f;
87
88 }
89