将整数转换为浮点数的LLVM通道。

问题描述 投票:0回答:1

我正在编写一个LLVM通证,需要将一个整数类型转换为各种浮点类型。 我试图使用UIToFp指令将整数值转换为浮点值。 作为一个基本的测试案例,我使用的代码类似于

Value* promotedRandom = Builder.CreateUIToFP(ConstantInt::get(Type::getInt32Ty(M.getContext()), 4), Type::getFloatTy(M.getContext()));

其中Builder是我的函数IRBuilder的一个实例。 但是由于某些原因,在转换后这个值是0而不是4,我可以通过打印这个值来确认。 奇怪的是,如果CreateUIToFP的类型参数是double类型而不是float类型,正确的答案是4。 在下面的UIToFP文档中,我没有看到任何发生这种行为的原因。 这个问题的原因是什么,应该如何解决。

将一个无符号整数常量转换为相应的浮点常量。TYPE必须是标量或矢量浮点类型。CST必须是标量或向量整数类型。CST和TYPE都必须是标量或相同元素数的向量。

另外,如果我用clang编译这段代码,会发现

int main(){
    int test = 4;
    float test2 = (float)test;
    printf("%f\n", test2);
}

我得到以下说明

define dso_local i32 @main() #0 {
  %1 = alloca i32, align 4
  %2 = alloca float, align 4
  store i32 4, i32* %1, align 4
  %3 = load i32, i32* %1, align 4
  %4 = sitofp i32 %3 to float
  store float %4, float* %2, align 4
  %5 = load float, float* %2, align 4
  %6 = fpext float %5 to double
  %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), double %6)
  ret i32 0
}

其中显示sitofp和整数到浮点数的转换工作正确。 尽管我使用的是uitofp而不是sitofp,但我尝试了这两种方法,都没有成功。

casting llvm llvm-ir llvm-c++-api
1个回答
0
投票

我看问题是printf不接受浮点数作为参数。 当浮点数传递给printf时,它们会被提升为双数。 当我取了浮点值,然后将其提升为双倍值时,代码就能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.