先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
VFMAX.VF 是 RVV 单宽浮点最大值选择指令,语法为 vfmax.vf vd, vs2, rs1, vm;每个活动元素比较 vs2[i] 与 f[rs1],把较大值写入 vd[i]。
VFMAX.VF 对 vl 范围内的活动元素执行逐 lane 浮点最大值选择。第二源来自标量浮点寄存器 f[rs1];vm=0 时 v0.t 控制哪些元素执行,vm=1 时不使用执行掩码。NaN、signaling NaN invalid flag、有符号零和结果选择遵循官方 RISC-V FMIN/FMAX 规则;这不是整数最值、饱和运算或融合乘加。
从 OP-V 编码解码到逐元素浮点最大值选择:第二源来自 scalar f[rs1]。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
VFMAX.VF 的学习重点是 OP-V 编码、标量浮点寄存器 f[rs1]、v0.t 掩码,以及每个活动元素的 vd[i] = max(vs2[i], f[rs1])。
阅读 VFMAX.VF 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。.vf:一个向量源和一个浮点标量源参与运算。
当前 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 vfmax.vf v1, v2, ft0 # v1[i] = max(v2[i], ft0)» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfmax.vf v1, v2, ft0 # v1[i] = max(v2[i], ft0)» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfmax.vf v1, v2, ft0 # v1[i] = max(v2[i], ft0)» 等实际代码理解该场景。
vm=0 时只执行 v0.t 为 1 的活动元素;vm=1 表示不使用执行掩码。本页公式是 vd[i] = max(vs2[i], f[rs1])。
不是。它逐 lane 产生一个目标向量元素;跨元素归约最值使用对应的 vector reduction 指令。
这些情况按官方 RISC-V FMIN/FMAX 规则处理,包括 signaling NaN 的 invalid flag 规则;本页不把它简化为普通整数式比较。