Hi,
Just wondering if it’s possible to construct a 128 bit quad precision floating point
constant without converting the value back to a string.
Cheers Peter
Hi,
Just wondering if it’s possible to construct a 128 bit quad precision floating point
constant without converting the value back to a string.
Cheers Peter
Hi Peter,
Hi Tim,
Thanks for the hint.
I tried the following, (it’s a C interface since that’s what I need it for) where a and b are
the top and bottom halves of the 128 bit value,
LLVMValueRef TestConst(LLVMContextRef C, uint64_t a, uint64_t b) {
Type *ty = Type::getFP128Ty(*unwrap(C));
ArrayRef<uint64_t> ar[2] = {a,b};
APInt ai(128,*ar);
APFloat quad(APFloat::IEEEquad(), ai);
return wrap(ConstantFP::get(ty,quad));
}
but for 1.0e0 it returns zero
store fp128 0xL00000000000000000000000000000000, fp128* %e, align 16
and for 1.23e0 returns this, which is wrong. (that repeating 147AE is a bit weird)
store fp128 0xLE147AE147AE147AE0000000000000000, fp128* %e, align 16
so I’m obviously doing something wrong.
Regards Peter
This code line of code might not work correctly
ArrayRef<uint64_t> ar[2] = {a,b};
The initializer_list goes out of scope right after and the ArrayRef will be left dangling.
Just use a regular array
uint64_t ar[2] = {a,b};
APInt ai(128,ar);
The array should be implicitly converted to an ArrayRef at the call site.
Thanks Craig,
Worked a treat.
Regards Peter