d29b840e3838d9b3a4c4d714c159e86531c66f62
5 #include "primitives.h"
7 #include "specialize.h"
10 float32_t
f32_rem( float32_t a
, float32_t b
)
22 struct exp16_sig32 normExpSig
;
25 uint_fast64_t sigA64
, sigB64
, q64
;
26 uint_fast32_t alternateSigA
;
34 signA
= signF32UI( uiA
);
35 expA
= expF32UI( uiA
);
36 sigA
= fracF32UI( uiA
);
39 signB
= signF32UI( uiB
);
40 expB
= expF32UI( uiB
);
41 sigB
= fracF32UI( uiB
);
43 if ( sigA
|| ( ( expB
== 0xFF ) && sigB
) ) goto propagateNaN
;
47 if ( sigB
) goto propagateNaN
;
51 if ( ! sigB
) goto invalid
;
52 normExpSig
= softfloat_normSubnormalF32Sig( sigB
);
53 expB
= normExpSig
.exp
;
54 sigB
= normExpSig
.sig
;
57 if ( ! sigA
) return a
;
58 normExpSig
= softfloat_normSubnormalF32Sig( sigA
);
59 expA
= normExpSig
.exp
;
60 sigA
= normExpSig
.sig
;
62 expDiff
= expA
- expB
;
69 if ( expDiff
< -1 ) return a
;
73 if ( q
) sigA
-= sigB
;
75 q
= ( (uint_fast64_t) sigA
<<32 ) / sigB
;
78 sigA
= ( ( sigA
>>1 )<<( expDiff
- 1 ) ) - sigB
* q
;
84 if ( sigB
<= sigA
) sigA
-= sigB
;
85 sigA64
= (uint_fast64_t) sigA
<<40;
86 sigB64
= (uint_fast64_t) sigB
<<40;
88 while ( 0 < expDiff
) {
89 q64
= softfloat_estimateDiv128To64( sigA64
, 0, sigB64
);
90 q64
= ( 2 < q64
) ? q64
- 2 : 0;
91 sigA64
= - ( ( sigB
* q64
)<<38 );
95 q64
= softfloat_estimateDiv128To64( sigA64
, 0, sigB64
);
96 q64
= ( 2 < q64
) ? q64
- 2 : 0;
97 q
= q64
>>( 64 - expDiff
);
99 sigA
= ( ( sigA64
>>33 )<<( expDiff
- 1 ) ) - sigB
* q
;
102 alternateSigA
= sigA
;
105 } while ( sigA
< 0x80000000 );
106 sigMean
= sigA
+ alternateSigA
;
107 if ( ( 0x80000000 <= sigMean
) || ( ! sigMean
&& ( q
& 1 ) ) ) {
108 sigA
= alternateSigA
;
110 signZ
= ( 0x80000000 <= sigA
);
111 if ( signZ
) sigA
= - sigA
;
112 return softfloat_normRoundPackToF32( signA
^ signZ
, expB
, sigA
);
114 uiZ
= softfloat_propagateNaNF32UI( uiA
, uiB
);
117 softfloat_raiseFlags( softfloat_flag_invalid
);
118 uiZ
= defaultNaNF32UI
;