ちょっと調べていて、 rvv-intrinsic-doc で記述されているセグメント・メモリ・アクセスのintrinsicの仕様が微妙に変わっているような気がして一旦まとめることにした。
- v0.11.x:
void __riscv_vlseg3e16_v_u16m2 (vuint16m2_t *v0, vuint16m2_t *v1, vuint16m2_t *v2, const uint16_t *base, size_t vl);
ロードする値は、3つに分割されている。
- v0.12.x
vuint16m2x3_t __riscv_vlseg3e16_v_u16m2x3 (const uint16_t *base, size_t vl);
新たなデータ型が導入され、戻り値として渡されるようになっている。
- v1.0x
vuint16m2x3_t __riscv_vlseg3e16_v_u16m2x3(const uint16_t *rs1, size_t vl);
v1.0xになると、データ型の変化はない。
GCCがどのバージョンをサポートしているのか、以下のコマンドでチェックすることができるらしい:
riscv64-unknown-elf-gcc -march=rv64gcv -mabi=lp64d -dM -E - < /dev/null | grep __riscv_v
#define __riscv_v_elen_fp 64 #define __riscv_v_intrinsic 11000 #define __riscv_v_min_vlen 128 #define __riscv_v_elen 64 #define __riscv_v 1000000 #define __riscv_vector 1