assembly 将LLVM、RISC-V中的vsetivli替换为vsetvli

von4xj4u  于 2023-01-13  发布在  其他
关注(0)|答案(1)|浏览(252)

我有一个从Halide项目LLVM的帮助下生成的二进制文件。为了保持简短的故事,二进制文件使用RVV 1.0,而我的硬件是AllWinner D1 C906是RVV 0.7,所以一些intrinsic不受支持,我正在寻找一个选项来确定和删除/替换LLVM源代码中不受支持的RVV 1.0 intrinsic。
首先是vsetivli,在我看来可以替换为旧的vsetvli。唯一的问题是如何做到这一点?

1dfae:       cd027057                vsetivli        zero,4,e32,m1,ta,ma

RVV 0.7 spec
RVV 1.0 spec
source

3wabscal

3wabscal1#

好了,我尝试了vsetivli的变通方法,在selectVLOp上打了一些粗略的补丁(实际上适用于LLVM 13.0 - 16.0),现在vsetvli由else条件添加。

--- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -1503,10 +1503,11 @@ bool RISCVDAGToDAGISel::selectZExti32(SDValue N, SDValue &Val) {
 // allows us to choose betwen VSETIVLI or VSETVLI later.
 bool RISCVDAGToDAGISel::selectVLOp(SDValue N, SDValue &VL) {
   auto *C = dyn_cast<ConstantSDNode>(N);
-  if (C && isUInt<5>(C->getZExtValue()))
-    VL = CurDAG->getTargetConstant(C->getZExtValue(), SDLoc(N),
-                                   N->getValueType(0));
-  else
+  // if (C && isUInt<5>(C->getZExtValue())) {
+  //   VL = CurDAG->getTargetConstant(C->getZExtValue(), SDLoc(N),
+  //                                  N->getValueType(0));
+  // }
+  // else
     VL = N;
 
   return true;

相关问题