基于riscv_vector.h
,抄的https://www.bilibili.com/video/BV1VT411E7iQ。
Vector寄存器长度是厂商可选的。可以是64, 128, ..., 2048bits。
寄存器数据类型:v<type><len><group>_t
. e.g. vfloat32m1_t
。group代表几个寄存器拼成一组,最大八个。下文用reg_type
指代。
uint vsetvlmax_e<len><group>()
: 返回寄存器最大能操作多少个len bit的元素。如vsetvlmax_e32m1()
。
reg_type vfmv_v_f_f32m1(f, vl)
:返回一个每个元素初始化为f的reg_type。vl代表寄存器操作几个数,0 <= vl <= vlmax
。f32m1对应vfloat32m1_t
,_v
和_f
见下: 1. v:向量寄存器 2. f:浮点数寄存器 3. i:立即数 4. x:普通寄存器 5. s:向量寄存器的第0位(标量寄存器)
reg_type vle32_v_f32m1(addr, vl)
:从addr开始读取vl个数据。f32m1同上。这条是连续访存,还有固定间隔跳跃访存和index间接访存。
reg_type vfadd_vv_f32m1(op1, op2, vl)
:op1和op2相加。还有标量形式的reg_type vfadd_vf_f32m1(reg_type op1, float op2, vl)
reg_type vfredusum_vs_f32m1_f32m1(vd, vv, vs, vl)
:等同于vd[0] = (((vs[0] + vv[0]) + vv[1]) + ...) + vv[vl-1]
。返回vd。
有一个mask类型,可以指定向量寄存器哪几位不更新。分支的时候用。