首页/指令库/设置向量长度立即数
VSETVLI

RISC-V VSETVLI 指令详解

指令手册I-type

设置 vtype 与 vl:rd 写入新 vl,rs1/rd 编码决定 AVL,vtypei 指定 SEW、LMUL 与 tail/mask 策略

指令语法

vsetvli rd, rs1, vtypei
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数所在的寄存器。
立即数 imm:12 位有符号立即数,符号扩展后与 rs1 进行运算。
V向量运算向量配置

指令编码

31..20
imm[11:0]
19..15
rs1
14..12
funct3
11..7
rd
6..0
opcode

VSETVLI 使用 opcode 1010111(0x57)、funct3 111。rs1 字段选择源寄存器,12 位立即数提供第二操作数,rd 选择目标寄存器。

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

指令行为说明

VSETVLI 是 RVV 配置指令:根据 rs1/rd 编码确定 AVL,根据 vtypei 设置 SEW、LMUL、vta、vma,并把新 vl 写入 rd。rs1!=x0 时 AVL=x[rs1];rs1=x0 且 rd!=x0 时 AVL=~0,用于请求 VLMAX;rs1=x0 且 rd=x0 时使用当前 vl,且只有新 SEW/LMUL 比例不改变 VLMAX 时才可用。

快速理解与检索要点

VSETVLI 根据 rs1/rd 编码得到 AVL,并用 vtypei 设置 SEW、LMUL、tail/mask 策略,随后把硬件选择的新 vl 写入 rd。现代汇编应显式写 ta/tu 与 ma/mu。

rs1!=x0 时 AVL=x[rs1];rs1=x0 且 rd!=x0 时 AVL=~0,用于请求 VLMAX。
rs1=x0 且 rd=x0 表示保留现有 vl;只有新 SEW/LMUL 比例不改变 VLMAX 时才可用。
不支持的 vtype 会设置 vill,并把 vl 置 0(实现也可选择 trap)。

常见使用场景

位操作与掩码

结合 «vsetvli t0, a0, e32, m1, ta, ma # set vl for 32-bit elements» 等实际代码理解该场景。

向量运算

结合 «vsetvli t0, a0, e32, m1, ta, ma # set vl for 32-bit elements» 等实际代码理解该场景。

循环与迭代

结合 «vsetvli t0, a0, e32, m1, ta, ma # set vl for 32-bit elements» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

rs1=x0 且 rd!=x0 才是请求 VLMAX;rd=x0,rs1=x0 是保留现有 vl 的特殊形式。
V 1.0 汇编应显式写 ta/tu 和 ma/mu。
不支持的 vtype 会设置 vill 并使 vl=0(实现也可 trap)。

常见问题

vsetvli x0, x0 一定是设置 VLMAX 吗?

不是。rs1=x0 且 rd=x0 是保留现有 vl 的形式;设置 VLMAX 需要 rd!=x0。

为什么要写 ta/ma?

V 1.0 汇编语法要求显式指定 tail 与 mask 策略,避免旧草案默认值造成歧义。