先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
VFSUB.VV 对 VL 范围内的活动元素执行向量-向量浮点减法:vd[i] = vs2[i] - vs1[i]。
VFSUB.VV 是 RVV 单宽浮点减法指令,语法为 vfsub.vv vd, vs2, vs1, vm。每个活动元素按当前 SEW 的浮点格式执行 vd[i] = vs2[i] - vs1[i];操作数顺序是 vs2[i] - vs1[i]。 vm=0 时 v0.t 控制活动元素,vm=1 时不使用执行掩码。舍入模式和异常标志遵循官方 RVV 浮点规则,定点 vxrm 不控制这些指令。
从 OP-V 编码解码到逐元素浮点减法:第二源来自 same-lane vs1。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
VFSUB.VV 的学习重点是 OP-V 编码、同 lane 的 vs1 元素、v0.t 掩码和逐元素 vd[i] = vs2[i] - vs1[i]。
阅读 VFSUB.VV 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。.vv:两个向量源逐元素参与运算。
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。
带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfsub.vv v1, v2, v3 # v1[i] = v2[i] - v3[i]» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfsub.vv v1, v2, v3 # v1[i] = v2[i] - v3[i]» 等实际代码理解该场景。
不使用。普通 RVV 浮点算术使用浮点舍入环境 frm 或指令规定的浮点舍入规则;vxrm 用于定点舍入指令。
vm=0 表示用 v0.t 作为执行掩码;vm=1 表示不使用执行掩码。它不是一个普通数据源寄存器。