【问题标题】:How can I get an LLVM Backend to generate function calls for mul instructions?如何让 LLVM 后端为 mul 指令生成函数调用?
【发布时间】:2017-11-09 23:00:23
【问题描述】:

我正在尝试为没有乘法指令的 ISA 编写后端,因此需要使用加法循环来进行乘法运算。

我关注this guide.

我尝试在 InstrInfo.td 文件中简单地不定义任何乘法,但这只会导致它在到达它时失败。 这是一个完全 1:1 的翻译,所以如果我把它写在某个地方,有没有办法告诉编译器用 Multiply() 函数调用替换任何 mul 指令?

【问题讨论】:

  • RISC-V RV32I 基础 ISA 没有乘法指令。你可以看看它的后端。

标签: compiler-construction llvm backend


【解决方案1】:

每个架构都有一些限制。

如果架构不支持某个操作或特定类型的操作,则可以在 LLVM 中将它们设置为expand。代码生成器会将它们转换为 libcalls 或将它们分解为更小的支持操作。

这些扩展调用可以在XXXISelLowering.cpp中找到

setOperationAction(ISD::FDIV, MVT::f32, Expand);

对于上面的示例,F32 Div 将扩展为__divsf3 调用。

类似地,对于您的情况,i32 乘法将扩展为 glibc 中的 __mulsi3 函数。

  • 检查lib/CodeGen/TargetLoweringBase.cppinclude/llvm/IR/RuntimeLibcalls.def 中的所有此类libcall

【讨论】:

    【解决方案2】:

    您可以编写一个 IR 到 IR 转换通道,用您建议的等效函数调用替换 mul 指令。这样您就不必更改代码生成器。

    【讨论】:

    • 我曾考虑过使用该解决方案,但这绝对是一个 hack,因为放置它的合适位置似乎是 TargetLowering,因为这就是该阶段的意义所在。甚至还有一个用于 setOperationAction() 的内置函数,带有指定 LibCall 的选项,但我不明白如何实际指定该函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多