128 bit float constant


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