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