LLVM16になって、RISC-VのVectorizationの状態について確認していきたい。
まずはIntrinsicのサポートについてだが、LLVM15と比較してAPIが変わったようだ。 これは、RISC-V VectorのIntrinsicの公式フォーマットに完全に基づいているようだ。
例えば、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