vsetvlmnemonic用两个整数寄存器配置 vl 与完整 vtype。
vsetvl 使用 rs1 中的应用向量长度(AVL)和 rs2 中完整的 XLEN 位 vtype 值配置向量状态,常用于恢复先前保存的 vl 与 vtype。
vsetvl 02rd, 03rs1, 04rs2vsetvlmnemonic用两个整数寄存器配置 vl 与完整 vtype。
rddestination接收硬件选出的 vl;写 x0 可丢弃结果。
rs1source整数寄存器提供应用向量长度;x0 的特殊组合见下文。
rs2source整数寄存器提供全部 XLEN 位 vtype,常用于上下文恢复。
li x11, 0x12
vsetvl x5, x10, x11 # VLEN=1281选择寄存器 vtype 形式
000000vsetvl 的保留编码位,必须全为 0
01011x11 提供完整 XLEN 位 vtype 值
01010整数寄存器 x10 提供 AVL
111向量配置指令的固定功能码
00101x5 接收新的 vl;rd=x0 时只更新 CSR
1010111OP-V 主操作码
0硬件接受配置时为 0;不支持任一位组合时置 1,并把其余位及 vl 清零。
全 0每一位都必须写 0;任一位非零都是不支持的 vtype。vsetvl 会检查 rs2 的全部 XLEN 位。
0mu:被掩码元素保持旧值
0tu:尾部元素保持旧值
0与位 4、3 组成 vsew=010,选择 SEW=32
1与位 5、3 共同编码元素宽度 SEW=32
0与位 5、4 共同编码元素宽度 SEW=32
0与位 1、0 组成 vlmul=010,选择 m4 · 4
1与位 2、0 共同编码 m4 · 4
0与位 2、1 共同编码 m4 · 4
| 语法 | 说明 |
|---|---|
vsetvl rd, rs1, rs2 | x[rs1] 提供 AVL,x[rs2] 提供完整 vtype |
VLMAX = LMUL × VLEN / SEW。硬件依据 x[rs1] 中的 AVL、VLMAX 和规范约束选择新 vl,成功执行后 x[rd] = vl。rs1=x0 时的 AVL 特殊组合与 vsetvli 相同。
x[rs2] 的全部 XLEN 位都会被检查:vtype[XLEN-1] 是 vill,XLEN-2:8 是必须为零的保留位,位 7 是 vma,位 6 是 vta,位 5:3 是 vsew,位 2:0 是 vlmul。上方演示以合法配置逐位显示其含义。
AVL = (rs1 == x0) ? special_AVL_rule(rd, old_vl) : x[rs1]
requested_vtype = x[rs2]
(vl, vtype) = select_vl_and_validate_vtype(AVL, requested_vtype)
x[rd] = vl # rd=x0 discards this write
vstart = 0指令写入 vl、vtype 和整数目标 rd,并在成功结束时把 vstart 清零;rs1、rs2、向量寄存器、fflags、vxrm 与 vxsat 保持不变。配置指令不使用执行掩码,也不直接改写任何尾部或被掩码的向量元素。
若 rs2 任一位形成实现不支持的 vtype,硬件令 vtype.vill=1、其余 vtype 位为零,并令 vl=0。
不访问数据内存,因此没有内存对齐要求。
csrr t1, vtype # 保存的 vtype
vsetvl t0, a0, t1 # AVL=a0,恢复完整 vtype,t0 得到新 vl