5 #include "primitives.h"
7 #include "specialize.h"
10 float32_t
f32_mul( float32_t a
, float32_t b
)
23 uint_fast32_t magBits
;
24 struct exp16_sig32 normExpSig
;
26 uint_fast32_t sigZ
, uiZ
;
31 signA
= signF32UI( uiA
);
32 expA
= expF32UI( uiA
);
33 sigA
= fracF32UI( uiA
);
36 signB
= signF32UI( uiB
);
37 expB
= expF32UI( uiB
);
38 sigB
= fracF32UI( uiB
);
39 signZ
= signA
^ signB
;
41 if ( sigA
|| ( ( expB
== 0xFF ) && sigB
) ) goto propagateNaN
;
42 magBits
= expB
| sigB
;
46 if ( sigB
) goto propagateNaN
;
47 magBits
= expA
| sigA
;
51 if ( ! sigA
) goto zero
;
52 normExpSig
= softfloat_normSubnormalF32Sig( sigA
);
53 expA
= normExpSig
.exp
;
54 sigA
= normExpSig
.sig
;
57 if ( ! sigB
) goto zero
;
58 normExpSig
= softfloat_normSubnormalF32Sig( sigB
);
59 expB
= normExpSig
.exp
;
60 sigB
= normExpSig
.sig
;
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 ) {
70 return softfloat_roundPackToF32( signZ
, expZ
, sigZ
);
72 uiZ
= softfloat_propagateNaNF32UI( uiA
, uiB
);
76 softfloat_raiseFlags( softfloat_flag_invalid
);
77 uiZ
= defaultNaNF32UI
;
79 uiZ
= packToF32UI( signZ
, 0xFF, 0 );
83 uiZ
= packToF32UI( signZ
, 0, 0 );