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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
#include "softfloat_ext.hpp"
#include "zigendian.h"
extern "C" {
#include "softfloat.h"
}
void f128M_abs(const float128_t *aPtr, float128_t *zPtr) {
// Clear the sign bit.
#if ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN
zPtr->v[1] = aPtr->v[1] & ~(UINT64_C(1) << 63);
zPtr->v[0] = aPtr->v[0];
#elif ZIG_BYTE_ORDER == ZIG_BIG_ENDIAN
zPtr->v[0] = aPtr->v[0] & ~(UINT64_C(1) << 63);
zPtr->v[1] = aPtr->v[1];
#else
#error Unsupported endian
#endif
}
void f128M_trunc(const float128_t *aPtr, float128_t *zPtr) {
float128_t zero_float;
ui32_to_f128M(0, &zero_float);
if (f128M_lt(aPtr, &zero_float)) {
f128M_roundToInt(aPtr, softfloat_round_max, false, zPtr);
} else {
f128M_roundToInt(aPtr, softfloat_round_min, false, zPtr);
}
}
void f128M_neg(const float128_t *aPtr, float128_t *zPtr) {
// Toggle the sign bit.
#if ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN
zPtr->v[1] = aPtr->v[1] ^ (UINT64_C(1) << 63);
zPtr->v[0] = aPtr->v[0];
#elif ZIG_BYTE_ORDER == ZIG_BIG_ENDIAN
zPtr->v[0] = aPtr->v[0] ^ (UINT64_C(1) << 63);
zPtr->v[1] = aPtr->v[1];
#else
#error Unsupported endian
#endif
}
void extF80M_abs(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
// Clear the sign bit.
zPtr->signExp = aPtr->signExp & UINT16_C(0x7FFF);
zPtr->signif = aPtr->signif;
}
void extF80M_trunc(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
extFloat80_t zero_float;
ui32_to_extF80M(0, &zero_float);
if (extF80M_lt(aPtr, &zero_float)) {
extF80M_roundToInt(aPtr, softfloat_round_max, false, zPtr);
} else {
extF80M_roundToInt(aPtr, softfloat_round_min, false, zPtr);
}
}
void extF80M_neg(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
// Toggle the sign bit.
zPtr->signExp = aPtr->signExp ^ UINT16_C(0x8000);
zPtr->signif = aPtr->signif;
}
float16_t f16_neg(const float16_t a) {
union { uint16_t ui; float16_t f; } uA;
// Toggle the sign bit.
uA.ui = a.v ^ (UINT16_C(1) << 15);
return uA.f;
}
|