先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
VFSGNJX.VF 是 RVV 单宽向量浮点标量异或符号注入指令,语法为 vfsgnjx.vf vd, vs2, rs1, vm;每个活动元素保留 vs2[i] 的非符号位,并用 vs2[i] 与标量 f[rs1] 符号位 XOR 生成 vd[i]。
VFSGNJX.VF 对 vl 范围内的活动元素执行逐 lane 浮点符号位组合。第二源来自标量浮点寄存器 f[rs1];vm=0 时 v0.t 控制哪些元素执行,vm=1 时不使用执行掩码。官方 FSGNJ 类语义是位模式操作:非符号位来自 vs2,结果符号由 vs2[i] 与标量 f[rs1] 符号位 XOR 决定,并且不设置浮点异常标志;这不是浮点加减、比较或跨 lane 归约。
从 OP-V 编码解码到逐元素浮点符号注入:保留 vs2 的非符号位,符号来源为 vs2 与 scalar f[rs1] 的符号 XOR。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
VFSGNJX.VF 的学习重点是 OP-V 编码、标量浮点寄存器 f[rs1]、v0.t 掩码,以及每个活动元素的 vd[i] = {vs2[i] 的非符号位, sign(vs2[i]) XOR sign(f[rs1])}。
阅读 VFSGNJX.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 vfsgnjx.vf v1, v2, ft0 # v1[i] takes non-sign bits from v2[i] and sign(v2[i]) XOR sign(ft0)» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfsgnjx.vf v1, v2, ft0 # v1[i] takes non-sign bits from v2[i] and sign(v2[i]) XOR sign(ft0)» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfsgnjx.vf v1, v2, ft0 # v1[i] takes non-sign bits from v2[i] and sign(v2[i]) XOR sign(ft0)» 等实际代码理解该场景。
vm=0 时只执行 v0.t 为 1 的活动元素;vm=1 表示不使用执行掩码。本页公式是 vd[i] = {vs2[i] 的非符号位, sign(vs2[i]) XOR sign(f[rs1])}。
不是。它是 FSGNJ 类位模式操作,保留 vs2 的非符号位并组合新的符号位,不设置浮点异常标志。
不会。本指令只使用第二源的符号位信息;f[rs1] 的非符号位不决定结果数值大小。