blob: dc9992b20896398a90421a70d4e036acb2426ff0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
#include <stdbool.h>
#include <stdint.h>
#include "platform.h"
#include "internals.h"
#include "softfloat.h"
uint_fast64_t
softfloat_roundPackToUI64(
bool sign,
uint_fast64_t sig64,
uint_fast64_t sig0,
int_fast8_t roundingMode,
bool exact
)
{
bool roundNearestEven, increment;
roundNearestEven = ( roundingMode == softfloat_round_nearest_even );
increment = ( UINT64_C( 0x8000000000000000 ) <= sig0 );
if (
! roundNearestEven
&& ( roundingMode != softfloat_round_nearest_maxMag )
) {
increment =
( roundingMode != softfloat_round_minMag )
&& ( roundingMode
== ( sign ? softfloat_round_min : softfloat_round_max ) )
&& sig0;
}
if ( increment ) {
++sig64;
if ( ! sig64 ) goto invalid;
sig64 &=
~ ( ! ( sig0 & UINT64_C( 0x7FFFFFFFFFFFFFFF ) )
& roundNearestEven );
}
if ( sign && sig64 ) goto invalid;
if ( exact && sig0 ) softfloat_raiseFlags( softfloat_flag_inexact );
return sig64;
invalid:
softfloat_raiseFlags( softfloat_flag_invalid );
return UINT64_C( 0xFFFFFFFFFFFFFFFF );
}
|