RVV Intrinsicではベクトルレジスタを vuint64m1_t
や vfloat32m4_t
などの独自の型で表現されている.
プログラム実行中にこれをダンプして printf()
で表示したいが,ベクトルレジスタはスカラレジスタよりも長いので,単純には表示できない.
専用のインライン関数などを持っているほうが,便利そうだ.
例えば,以下のような感じ.
inline void dump_vecregs(char *name, vireg in) { int64_t arrays[32]; const size_t vlmax = __riscv_vsetvlmax_e64m4(); for (int i = 0; i < vlmax; i++) { arrays[i] = __riscv_vmv_x_s_i64m4_i64(in); in = __riscv_vslide1down_vx_i64m4 (in, 0, vlmax); } printf("%s : ", name); for (int i = vlmax-1; i >= 0; i--) { printf("%016lx_", arrays[i]); } printf("\n"); } inline void dump_mvecregs(char *name, vmreg in) { uint32_t tmp; const size_t vlmax = __riscv_vsetvlmax_e64m4(); __riscv_vsm_v_b16((uint8_t *)(&tmp), in, vlmax); printf("%s : %016lx\n", name, tmp); }
dump_vecreg()
は vslide1down
を使って1個ずつ取り出して表示してるけど,よく考えたら dump_mvecregs()
と同様にいったんメモリにストアしてスカラロード命令でロードすればいいようにも感じる.
__riscv_vse64_v_i64m4 (arrays, in, vlmax); printf("%s : ", name); for (int i = vlmax-1; i >= 0; i--) { printf("%016lx_", arrays[i]); } printf("\n");