LLVM IR和浮点数

时间:2014-12-03 13:56:53

标签: assembly floating-point hex llvm llvm-ir

我试图找出如何在LLVM中写出非精确浮点数(例如1.3)。这就是documentation对它们所说的内容:

  

汇编程序需要浮点常量的精确十进制值。例如,汇编程序接受1.25但拒绝1.3,因为1.3是二进制的重复小数。

为了尝试这一点,我在C中编写了以下代码,并使Clang输出IR。

int main() {
  float t = 0x3fa66666;
  printf("%f\n", t);
}


// LLVM IR:
define i32 @main() #0 {
  %t = alloca float, align 4
  store float 0x41CFD33340000000, float* %t, align 4
  %1 = load float* %t, align 4
  %2 = fpext float %1 to double
  %3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0), double %2)
  ret i32 0
}

我在这里不明白的是0x41CFD33340000000来自何处以及如何计算?起初我只是认为它是一个双精度数,但是当我将其转换为32位IEEE-754浮点数时,我得到了0x4E7E999A。

0 个答案:

没有答案