在 LLVM 中,有一个LLVMFP128Type
,尽管我似乎无法找到如何将实际long double
转换为 a LLVMValueRef
of 类型LLVMFP128Type
。
我可以执行以下操作(使用double
):
LLVMValueRef var = LLVMBuildAlloca(
builder,
LLVMDoubleTypeInContext(ctx),
"x"
);
double num = 3.1415;
LLVMBuildStore(
builder,
LLVMConstReal(
LLVMDoubleTypeInContext(ctx),
num
),
var
);
生成以下 LLVM IR:
%x = alloca double
store double 3.141500e+00, double* %x
但是我如何为 a 做同样的事情long double
?有一个LLVMConstRealOfString
函数,它从一个字符串中获取一个常量浮点数,尽管我发现必须使用类似的东西来转换字符串和从字符串转换是低效的sprintf
:
LLVMValueRef var = LLVMBuildAlloca(
builder,
LLVMFP128TypeInContext(ctx),
"x"
);
// long double num = 3.1415L;
LLVMBuildStore(
builder,
LLVMConstRealOfString(
LLVMFP128TypeInContext(ctx),
"3.1415" // would have to sprintf `num`
),
var
);
给出以下(所需的)LLVM IR:
%x = alloca fp128
store fp128 0xLE978D4FDF3B645A24000921CAC083126, fp128* %x
如何通过第一个示例的简单性获得所需的结果(下例)?