在这份报告中,Kruppe和Espasa概述了RISC-V向量扩展(RVV),并在幻灯片16上展示了通过本征函数使用向量指令的LLVM IR样本,例如:
%vl = call i32 @llvm.riscv.vsetvl(i32 8)在演讲时(2019年4月),LLVM对V扩展的支持是在https://github.com/hanna-kruppe/rvv-llvm上开发的。然而,该存储库现在已经存档,自述文件表明它已经过时,因为对RISC-V扩展的支持现在是上游开发的。我假设这意味着这些特性现在可以从https://github.com/llvm/llvm-project的LLVM母版中获得。
但是,当我提取当前的母版并构建它并尝试用llc编译示例代码(用--mtriple=riscv32-unkown-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解释说,特定于目标的本质应该在include/llvm/IR/IntrinsicsRISCV.td中定义,实际上在存档的树外存储库中,该文件包含一些在上游版本中不存在的载体特异性内含子。如果这些本质没有移植到上游,那么使用RISC-V矢量指令的正确方法是什么?
发布于 2020-11-06 08:41:44
我在LLVM开发人员邮件列表上问到:目前(2020年11月)只有MC层(即组装级)支持LLVM中的RISC扩展(所以现在没有本质)。
但是,有一个RFC和补丁,它增加了对矢量加载、存储和整数添加本质的初始支持,以及生成vsetvl[i]指令所需的基础结构。
发布于 2020-09-29 21:17:27
在llvm/include/llvm/ADT/Triple.h中只有两个riscv三重定义: riscv32和riscv64。
默认情况下,HasStdExtV是与experimental-v对应的标志,在llvm/lib/Target/RISCV/RISCVSubtarget.h中初始化为false,如果要使用此扩展,则需要启用此特性。
Clangs似乎也支持这个特性。在clang/lib/Driver/ToolChains/Arch/RISCV.cpp中,您可以看到三月支持v特性,并为llc生成experimental-v。
include/llvm/IR/IntrinsicsRISCV.td中没有关于向量扩展的任何内容,但是您可以在llvm/lib/Target/RISCV/RISCVInstrInfoV.td中找到标准'V‘向量扩展中的指令描述。,它还在实验。在clang中还可以发现,即使支持v扩展,默认情况下也可以在clang/lib/Driver/ToolChains/Arch/RISCV.cpp中看到clang/lib/Driver/ToolChains/Arch/RISCV.cpp中的
https://stackoverflow.com/questions/64099125
复制相似问题