VSETVL 的 rs2 是普通源操作数吗?
不是。rs2 的值被解释为完整 vtype 配置,用于设置 SEW、LMUL、vta、vma 等状态。
按 rs1/rd 的 AVL 规则和 rs2 中的完整 vtype 值配置 vl/vtype,并写回新 vl
VSETVL 是寄存器 vtype 形式的 RVV 配置指令。它与 VSETVLI 一样按 rs1/rd 组合确定 AVL。普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0,并且只在 VLMAX 不变和原 vtype.vill=0 时有效。rs2 提供完整 vtype 值,而不是 e32/m1/ta/ma 这类汇编文本字段。指令按官方规则检查 vtype、选择新 vl、更新 vl/vtype,并把新 vl 写入 rd;成功执行会把 vstart 归零。
从 vset 编码字段解析 AVL 来源和 vtype 设置,再展示 vl/vtype/rd 的架构可见更新。
VSETVL 属于 OP-V 配置指令。本步先看 opcode、funct3 以及承载 AVL/vtype 的字段。
假定 V 和所需向量状态已启用。本动画只演示成功完成路径(不支持配置采用 vill 路径);实现也可对非法 vtype 选择陷入以支持模拟。AVL 数值输入限于可精确表示的非负安全整数,按 RV64 教学环境解释。各步骤用于讲解,不代表硬件周期。
VSETVL 用寄存器而不是 vtypei 立即数字段提供 vtype。它仍然按 rs1/rd 组合确定 AVL。普通 AVL 形式从 rs1 读取元素请求数。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。该形式适合从整数寄存器中的完整 vtype 值恢复向量状态。
rd、rs1、rs2 均为整数寄存器。rs2 的全部 XLEN 位提供 vtype;x0 提供 0(e8,m1,tu,mu)。同名源必须读取同一旧值。
32 位 OP-V:bits[31:25]=1000000,随后是 rs2、rs1、funct3=111、rd、opcode=1010111;没有 rs3 或 v0.t。rs1≠x0 时 AVL=x[rs1];rs1=x0 且 rd≠x0 请求 VLMAX。
VLMAX=LMUL×VLEN/SEW。AVL≤VLMAX 时 vl=AVL;VLMAX<AVL<2×VLMAX 时 ceil(AVL/2)≤vl≤VLMAX;AVL≥2×VLMAX 时 vl=VLMAX。同一实现对相同 AVL/VLMAX 确定。
rd=rs1=x0 使用当前 vl 作 AVL,仅在 VLMAX 不变且原 vill=0 时可用,否则保留,实现可设置 vill。rd=x0 只丢弃 GPR 写回。
要求 V 1.0 和所需向量状态已启用;vset 不依赖旧 vtype。成功完成更新 vl/vtype 并清 vstart。不支持的 vtype 设置 vill、其他 vtype 位及 vl 为 0;实现也可选择陷入以模拟非法配置。
假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。a0=8、a1=0xD0(完整 vtype,其他位为0):成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。
假定 RV32/RV64 V、向量状态已启用、e32,m1,ta,ma 可用、VLEN=256,故 VLMAX=8。a0=8、a1=0xD0(完整 vtype,其他位为0):成功执行示例后 vl=t0=8、vstart=0。没有逐元素 mask 操作。
不是。rs2 的值被解释为完整 vtype 配置,用于设置 SEW、LMUL、vta、vma 等状态。
因为保存/恢复代码可以把之前保存的 vtype 值放入 rs2,再用 VSETVL 重建 vl/vtype 一致状态。
不是。普通 AVL 形式:rs1 非零,AVL=x[rs1]。VLMAX 请求形式:rs1=x0,rd 必须非零。保留当前 vl 形式:rd=x0,rs1=x0。