首页/指令库/寄存器设置向量长度
VSETVL

RISC-V VSETVL 指令详解

指令手册R-type

使用寄存器 AVL 和 vtype 设置 vl/vtype。

指令语法

vsetvl rd, rs1, rs2
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
V向量配置vset指令

指令编码

31..25
funct7
24..20
rs2
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode

VSETVL 使用 opcode 1010111(0x57)、funct3 111。rs1 和 rs2 字段选择两个源寄存器,rd 字段选择目标寄存器。

格式: R-type
opcode: 1010111 (0x57)
funct3: 111 (0x7)

指令行为说明

VSETVL 根据 rs1 中的 AVL 和 rs2 中的 vtype 值选择新的 vl 与 vtype,并把新 vl 写入 rd。

快速理解与检索要点

VSETVL 是 RVV 配置指令,决定后续向量指令使用的 vl 和 vtype。

AVL 来自 rs1,新的 vtype 值来自 rs2。
结果 vl 写入 rd;rd=x0 时不保存在整数寄存器。
vsetvl 常用于从已保存的 vtype 值恢复向量配置。

常见使用场景

上下文切换

结合 «vsetvl t0, a0, a1» 等实际代码理解该场景。

向量状态恢复

结合 «vsetvl t0, a0, a1» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

rs2 中作为 vtype 的所有 XLEN 位都必须被检查。
rs1=x0 且 rd=x0 的保持 vl 形式只适用于 VLMAX 不变且原 vill=0 的情况。
vtype 值来自寄存器 rs2,不在汇编中直接写 e32/m1/ta/ma。

常见问题

VSETVL 的 rs2 是什么?

rs2 保存完整 vtype 值,包括 vill、vma、vta、vsew 和 vlmul 等位;它不是 vsetvli 那种文本立即数字段。