FPGA開発日記

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

LLVM16でRISC-V Vector Supportはどのように変わったのか (1. Vector Intrinsicの確認)

LLVM16になって、RISC-VのVectorizationの状態について確認していきたい。

muxup.com

まずはIntrinsicのサポートについてだが、LLVM15と比較してAPIが変わったようだ。 これは、RISC-V VectorのIntrinsicの公式フォーマットに完全に基づいているようだ。

github.com

例えば、LLVM15では以下のようなIntrinsicが使えた。

void vmvf_test(void *dst, float in)
{
  size_t vlmax = vsetvlmax_e16m1();
  vfloat32m8_t vf = vfmv_v_f_f32m8(in, vlmax);
  vse32_v_f32m8(dst, vf, vlmax);

  return;
}

LLVM16では以下のような記述になる。

void vmvf_test(void *dst, float in)
{
  size_t vlmax = __riscv_vsetvlmax_e16m1();
  vfloat32m8_t vf = __riscv_vfmv_v_f_f32m8(in, vlmax);
  __riscv_vse32_v_f32m8(dst, vf, vlmax);

  return;
}

実行コマンド。

clang-16  \
    -I../env  \
    -I../../common  \
    -O2  \
    -I/work/sniper/sniper/sniper/include/  \
    --target=riscv64  \
    -march=rv64imafdcv  \
    --sysroot=/home/msyksphinz/riscv64/riscv64-unknown-elf  \
    --gcc-toolchain=/home/msyksphinz/riscv64/  \
    -DPREALLOCATE=1  \
    -mcmodel=medany  \
    -DUSE_RISCV_VECTOR  \
    -ffast-math  \
    -fno-common  \
    -fno-builtin-printf  \
    -o rvv_vmvf_test.vector  \
    rvv_vmvf_test.c  \
    -static  \
    -nostdlib  \
    -nostartfiles  \
    -lm  \
    -lgcc  \
    -T ../../common/test.ld
0000000080000000 <vmvf_test>:
    80000000:   048075d7            vsetvli a1,zero,e16,m1,ta,mu
    80000004:   0d35f057            vsetvli zero,a1,e32,m8,ta,ma
    80000008:   5e055457            vfmv.v.f    v8,fa0
    8000000c:   02056427            vse32.v v8,(a0)
    80000010:   8082                    ret