【问题标题】:How do I obtain / compute values like FLT_MAX and FLT_EPSILON with LLVM?如何使用 LLVM 获取/计算 FLT_MAX 和 FLT_EPSILON 等值?
【发布时间】:2021-06-09 01:25:57
【问题描述】:

如果我的代码正在为可能与其当前运行的平台不同的平台生成 LLVM SSA,我如何获得像 FLT_MAXFLT_EPSILON 之类的值(或者对于双精度数或任何其他值相同)浮点宽度)?

我猜一般来说,为我自己的系统获取这些值并使用它们是不正确的。将问题委托给clanggcc 也是不可接受的解决方案。

在生成 LLVM 代码时,我如何知道要为 FLT_MAX 发出什么值?

【问题讨论】:

  • 我不需要这些,但我已经使用ConstantExpr 和常量的定义生成了其他常量。 LLVM 然后将我的常量表达式折叠成一个简单的常量。
  • 您的目标(以及您的开发机器)很可能使用 IEEE-754 浮点类型。 LLVM 甚至还支持其他任何东西吗?因此,您可以只查找该值,并可能将其写为十六进制浮点数。
  • @NateEldredge 如果 LLVM 的 FloatType 和 DoubleType 保证在所有平台上都是 IEEE754 32 位和 64 位,那可能会成功。

标签: floating-point llvm llvmlite


【解决方案1】:

FLT_MAX / FLT_EPSILON 是特定于 C/C++ 的实体,与 LLVM 无关。因此,您需要借助 C/C++ 编译器来导出它。或者,您需要保留支持的平台列表,并为每个支持的平台硬编码这些值。

【讨论】:

  • 我相信 OP 使用 FLT_MAXFLT_EPSILON 作为它们为其提供值的概念的占位符,而不是它们的特定于语言的定义。换句话说,OP 想知道如何引用 LLVM IR 中浮点格式的最大浮点值和所谓的“epsilon”精度度量。
猜你喜欢
  • 1970-01-01
  • 2019-10-07
  • 2020-05-28
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多