5 #include "primitives.h"
7 #include "specialize.h"
10 float64_t
f64_rem( float64_t a
, float64_t b
)
22 struct exp16_sig64 normExpSig
;
24 uint_fast64_t q
, alternateSigA
;
32 signA
= signF64UI( uiA
);
33 expA
= expF64UI( uiA
);
34 sigA
= fracF64UI( uiA
);
37 signB
= signF64UI( uiB
);
38 expB
= expF64UI( uiB
);
39 sigB
= fracF64UI( uiB
);
40 if ( expA
== 0x7FF ) {
41 if ( sigA
|| ( ( expB
== 0x7FF ) && sigB
) ) goto propagateNaN
;
44 if ( expB
== 0x7FF ) {
45 if ( sigB
) goto propagateNaN
;
49 if ( ! sigB
) goto invalid
;
50 normExpSig
= softfloat_normSubnormalF64Sig( sigB
);
51 expB
= normExpSig
.exp
;
52 sigB
= normExpSig
.sig
;
55 if ( ! sigA
) return a
;
56 normExpSig
= softfloat_normSubnormalF64Sig( sigA
);
57 expA
= normExpSig
.exp
;
58 sigA
= normExpSig
.sig
;
60 expDiff
= expA
- expB
;
61 sigA
= ( sigA
| UINT64_C( 0x0010000000000000 ) )<<11;
62 sigB
= ( sigB
| UINT64_C( 0x0010000000000000 ) )<<11;
64 if ( expDiff
< -1 ) return a
;
68 if ( q
) sigA
-= sigB
;
70 while ( 0 < expDiff
) {
71 q
= softfloat_estimateDiv128To64( sigA
, 0, sigB
);
72 q
= ( 2 < q
) ? q
- 2 : 0;
73 sigA
= - ( ( sigB
>>2 ) * q
);
78 q
= softfloat_estimateDiv128To64( sigA
, 0, sigB
);
79 q
= ( 2 < q
) ? q
- 2 : 0;
82 sigA
= ( ( sigA
>>1 )<<( expDiff
- 1 ) ) - sigB
* q
;
91 } while ( sigA
< UINT64_C( 0x8000000000000000 ) );
92 sigMean
= sigA
+ alternateSigA
;
94 ( UINT64_C( 0x8000000000000000 ) <= sigMean
)
95 || ( ! sigMean
&& ( q
& 1 ) )
99 signZ
= ( UINT64_C( 0x8000000000000000 ) <= sigA
);
100 if ( signZ
) sigA
= - sigA
;
101 return softfloat_normRoundPackToF64( signA
^ signZ
, expB
, sigA
);
103 uiZ
= softfloat_propagateNaNF64UI( uiA
, uiB
);
106 softfloat_raiseFlags( softfloat_flag_invalid
);
107 uiZ
= defaultNaNF64UI
;