FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVMのRISC-V Vector Extensionのサポート状況を確認する

ふと気になって、LLVMにおけるRISC-VのVector Extensionのサポート状況を確認しようと思った。 LLVMRISC-Vをすでにサポートしているが、Vector Extensionはどこまでサポートしているのか分からない。確認してみよう。

リビジョンは75f98f0f8c813a0cffb130bc0589e4609ab09076を使用した。

github.com

llvm/lib/Target/RISCV/RISCVInstrInfoV.tdを見てみると、結構そろっている。メモリアクセス命令とか名前が変わったような記憶があるのだが、そこも対応しているようだ。

  • llvm/lib/Target/RISCV/RISCVInstrInfoV.td
// Vector Unit-Stride Instructions
def VLE8_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth8, "vle8.v">;
def VLE16_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth16, "vle16.v">;
def VLE32_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth32, "vle32.v">;
def VLE64_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth64, "vle64.v">;
def VLE128_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth128, "vle128.v">;
def VLE256_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth256, "vle256.v">;
def VLE512_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth512, "vle512.v">;
def VLE1024_V : VUnitStrideLoad<LUMOPUnitStride, LSWidth1024, "vle1024.v">;

def VLE8FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth8, "vle8ff.v">;
def VLE16FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth16, "vle16ff.v">;
def VLE32FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth32, "vle32ff.v">;
def VLE64FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth64, "vle64ff.v">;
def VLE128FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth128, "vle128ff.v">;
def VLE256FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth256, "vle256ff.v">;
def VLE512FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth512, "vle512ff.v">;
def VLE1024FF_V : VUnitStrideLoad<LUMOPUnitStrideFF, LSWidth1024, "vle1024ff.v">;
...

一点気になったのは、vfrsqrt7.v命令とvfrece7.vが追加されていないことだ。別にこれはv1.0で追加予定のものなのでまだ入れていなくていいのだけれども、何となく入れて見たくなった。

diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
index 220aa9acc771..31a89eaf0c73 100644
--- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td
@@ -789,6 +789,9 @@ defm VFWNMSAC_V : VALUr_FV_V_F<"vfwnmsac", 0b111111>;
 // Vector Floating-Point Square-Root Instruction
 defm VFSQRT_V : VALU_FV_VS2<"vfsqrt.v", 0b010011, 0b00000>;

+defm VFRSQRTE7_V : VALU_FV_VS2<"vfrsqrte7.v", 0b010011, 0b00100>;
+defm VFRECE7_V   : VALU_FV_VS2<"vfrece7.v", 0b010011, 0b00101>;
+
 // Vector Floating-Point MIN/MAX Instructions
 defm VFMIN_V : VALU_FV_V_F<"vfmin", 0b000100>;
 defm VFMAX_V : VALU_FV_V_F<"vfmax", 0b000110>;

入れてみた。ビルドして何となくアセンブルしてみた。

  • sample.S
        vfrsqrte7.v v10, v20
        vfrece7.v   v11, v21
$ ./llvm-mc -arch=riscv64 -mattr=experimental-v sample.S -o -
        .text
        vfrsqrte7.v     v10, v20
        vfrece7.v       v11, v21

お、動いた。

f:id:msyksphinz:20201218012727p:plain