【发布时间】:2020-12-01 18:02:42
【问题描述】:
在 LLVM 中,有一个 LLVMFP128Type,尽管我似乎无法找到如何将实际的 long double 直接转换为 LLVMFP128Type 类型的 LLVMValueRef。
我可以执行以下操作(使用 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
但是我该如何为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
如何通过第一个示例的简单性获得所需的结果(下例)?
【问题讨论】:
标签: c floating-point llvm llvm-ir 128-bit