ふと気になって、LLVMにおけるRISC-VのVector Extensionのサポート状況を確認しようと思った。 LLVMはRISC-Vをすでにサポートしているが、Vector Extensionはどこまでサポートしているのか分からない。確認してみよう。
リビジョンは75f98f0f8c813a0cffb130bc0589e4609ab09076を使用した。
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
お、動いた。