@@ -82,6 +82,12 @@ void CTFloat::toAPFloat(const real_t src, APFloat &dst) {
82
82
CTFloatUnion u;
83
83
u.fp = src;
84
84
85
+ #ifdef __FLOAT_WORD_ORDER
86
+ #if __FLOAT_WORD_ORDER == __ORDER_BIG_ENDIAN__
87
+ std::swap (u.bits [0 ], u.bits [1 ]);
88
+ #endif // __FLOAT_WORD_ORDER == __ORDER_BIG_ENDIAN__
89
+ #endif // __FLOAT_WORD_ORDER
90
+
85
91
const unsigned sizeInBits = APFloat::getSizeInBits (*apSemantics);
86
92
const APInt bits = APInt (sizeInBits, numUint64Parts, u.bits );
87
93
@@ -97,11 +103,20 @@ real_t CTFloat::fromAPFloat(const APFloat &src_) {
97
103
src.convert (*apSemantics, APFloat::rmNearestTiesToEven, &ignored);
98
104
}
99
105
106
+ #if LDC_LLVM_VER >= 2001 && defined(HAS_IEE754_FLOAT128)
107
+ return src.convertToQuad ();
108
+ #else
100
109
const APInt bits = src.bitcastToAPInt ();
101
-
102
- CTFloatUnion u;
103
- memcpy (u.bits , bits.getRawData (), bits.getBitWidth () / 8 );
110
+ CTFloatUnion u{};
111
+ memcpy (u.bits , bits.getRawData (),
112
+ std::min (static_cast <size_t >(bits.getNumWords ()) * 8 , sizeof (u.bits )));
113
+ #ifdef __FLOAT_WORD_ORDER
114
+ #if __FLOAT_WORD_ORDER == __ORDER_BIG_ENDIAN__
115
+ std::swap (u.bits [0 ], u.bits [1 ]);
116
+ #endif // __FLOAT_WORD_ORDER == __ORDER_BIG_ENDIAN__
117
+ #endif // __FLOAT_WORD_ORDER
104
118
return u.fp ;
119
+ #endif
105
120
}
106
121
107
122
// //////////////////////////////////////////////////////////////////////////////
0 commit comments