转载自:【《RISC-V “V“ Vector Extension Version 1.0》阅读笔记】_risc v的rvv-CSDN博客
上述指令的作用:快速配置 vl 和 vtype 中的值以匹配应用程序需求;
vset{i}vl{i} 指令根据参数设置 vtype 和 vl CSR,并将 vl 的新值写入 rd。
- vtype的值,放在vsetvli 和 vsetivli 的立即数字段中,以及 vsetvl 的 rs2 寄存器中。
- vl需要根据AVL的值进行判断,确定写入值;
- AVL放在vsetvli 和 vsetvl的 rs1 和 rd 字段,编码如下:
-
- 当 rs1 不是 x0 时,AVL 是一个无符号整数,保存在 rs1 指定的 x 寄存器中,新的 vl 值也写入 rd 指定的 x 寄存器。
- 当 rs1=x0 但 rd!=x0 时,最大无符号整数值 (~0) 用作 AVL,生成的 VLMAX 写入 vl 以及 rd 指定的 x 寄存器。
- 当 rs1=x0 且 rd=x0 时,指令的操作就像将 vl 中的当前向量长度用作 AVL,并将结果值写入 vl,但不写入目标寄存器。这种形式只能在 VLMAX 和因此 vl 实际上没有被新的 SEW/LMUL 比率改变时使用。保留使用将导致 VLMAX 变化的新 SEW/LMUL 比率的指令。在这种情况下,实现可能会设置 vill。
- 对于 vsetivli 指令,AVL 被编码为 rs1 字段中的 5 位零扩展立即数 (0-31)。
VLMAX的计算
VL的约束
vset{i}vl{i} 指令首先根据它们的 vtype 参数设置 VLMAX,然后设置 vl 遵守以下约束:
-
如果 AVL ≤ VLMAX,则 vl = AVL
-
ceil(AVL / 2) ≤ vl ≤ VLMAX 如果 AVL < (2 * VLMAX)
-
如果 AVL ≥ (2 * VLMAX),则 vl = VLMAX
-
对相同输入 AVL 和 VLMAX 值的任何给定实现具有确定性
-
这些特定属性遵循先前的规则:
a. 如果 AVL = 0,则 vl = 0
b. vl > 0 如果 AVL > 0
c. vl ≤ VLMAX
d. vl ≤ AVL
e. 从 vl 读取的值用作 vset{i}vl{i} 的 AVL 参数时会在 vl 中产生相同的值,前提是结果 VLMAX 等于读取 vl 时的 VLMAX 值。