如何在LLVM IR中使用RISC-V向量(RVV)指令?

如何在LLVM IR中使用RISC-V向量(RVV)指令?,llvm,llvm-ir,riscv,Llvm,Llvm Ir,Riscv,在Kruppe和Espasa中,对RISC-V向量扩展(RVV)进行了概述,并在其上显示了通过内在函数使用向量指令的LLVM IR样本,例如: %vl = call i32 @llvm.riscv.vsetvl(i32 8) 在会谈时(2019年4月),对V扩展的LLVM支持是在树上开发的。但是,该存储库现在已存档,自述文件表明它已过时,因为对RISC-V扩展的支持现在已在上游开发。我假设这意味着这些特性现在可以从LLVM主机上获得 但是,当我拉取当前主机并构建它并尝试使用llc编译示例代码(

在Kruppe和Espasa中,对RISC-V向量扩展(RVV)进行了概述,并在其上显示了通过内在函数使用向量指令的LLVM IR样本,例如:

%vl = call i32 @llvm.riscv.vsetvl(i32 8)
在会谈时(2019年4月),对V扩展的LLVM支持是在树上开发的。但是,该存储库现在已存档,自述文件表明它已过时,因为对RISC-V扩展的支持现在已在上游开发。我假设这意味着这些特性现在可以从LLVM主机上获得

但是,当我拉取当前主机并构建它并尝试使用
llc
编译示例代码(使用
--mtriple=riscv32-unknown-none-rv32imv
指定目标)时,我得到以下错误:

error: ../llvm-project/build/bin/llc: test.ll:4:18: error: use of undefined value '@llvm.riscv.vsetvl'
似乎V扩展是可用的,因为
llc-march=riscv32-mattr=help
列出了它:

Available features for this target:
...
  experimental-v           - 'V' (Vector Instructions).
我是否必须显式启用标记为实验性的目标功能?幻灯片中显示的这些向量本质是否在上游版本中出现?如果是,我如何使用它们?如果否,那么如何在LLVM IR中使用向量指令



后续:在Eli中,Friedman解释说,特定于目标的内部函数应该在
include/llvm/IR/IntrinsicsRISCV.td
中定义,事实上,该文件包含一些在中不存在的函数。如果这些内部函数没有被移植到上游,那么使用RISC-V向量指令的正确方法是什么?

llvm/include/llvm/ADT/triple.h
中只定义了两个riscv三元组:riscv32和riscv64

默认情况下,
HasStdExtV
是在
llvm/lib/Target/RISCV/RISCVSubtarget.h
中初始化为false的中与
experimental-v
相对应的标志,如果要使用此扩展,则需要启用此功能

Clangs似乎也支持此功能。在
clang/lib/Driver/toolschains/Arch/RISCV.cpp
中,您可以看到march支持llc的
v
功能并生成
experimental-v

include/llvm/IR/IntrinsicsRISCV.td
中没有关于向量扩展的内容,但是您可以从标准的“V”向量中找到指令说明 扩展名位于llvm/lib/Target/RISCV/RISCVInstrInfoV.td它仍然是实验性的。在clang中,您还可以发现,即使支持v扩展,在默认情况下,您也可以在clang/lib/Driver/toolschains/Arch/RISCV.cpp中看到
//当前LLVM仅支持“mafdc”。
(所以现在没有内在论)


但是,有一个and,它添加了对向量加载、存储和整数添加内部函数的初始支持,以及生成
vsetvl[i]所需的基础结构
说明。

非常感谢您指出这一点,我现在确实在
llc
中使用
-mtriple=riscv32-mattr=+experimental-V
中使用
-menable-experimental extensions-march=rv32imv0p9
显式启用了V扩展。但由于缺少使用内部函数意味着向量指令不能在LLVM IR中使用。除非有另一种方法不涉及内部函数?@kassiopeia如何使用内联汇编程序或用汇编语言编写向量函数(即编译
.s
文件,然后将其作为单独的翻译单元)?这可能已经得到LLVM/clang的支持。@maxschlepzig我在LLVM-dev邮件列表上询问过,并被告知目前只有MC层(即汇编级)支持RISC-V指令,所以是的,我可以在汇编代码中使用向量指令。但是,我希望使用LLVM的寄存器分配和指令调度功能,这目前是不可能的。