首页/指令库/VFSGNJX-VF
VFSGNJX.VF

RISC-V VFSGNJX.VF 指令详解

指令手册OP-V / OPFVF

VFSGNJX.VF 是 RVV 单宽向量浮点标量异或符号注入指令,语法为 vfsgnjx.vf vd, vs2, rs1[, v0.t];每个活动元素保留 vs2[i] 的非符号位,并用 vs2[i] 与标量 f[rs1] 符号位 XOR 生成 vd[i]。

指令语法

vfsgnjx.vf vd, vs2, rs1[, v0.t]
操作数说明
32 位 OP-V 编码:funct6=001010、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器;FLEN>SEW 时,有效 NaN-box 取低 SEW 位,否则使用 canonical NaN;FLEN<SEW 保留。
vd[i] 的非符号位来自 vs2[i],符号来自vs2 与第二源符号 XOR。不规范化 NaN、不设置浮点异常标志,也不按 frm 舍入。
向量操作数和结果为 SEW 位、EMUL=LMUL。同宽目标/源重叠合法;同名源须给出相同初始位模式。普通 masked 目标不能与 v0 重叠;同一源寄存器不能同时作为 EEW=1 掩码和 SEW 数据读取。
可选的汇编操作数 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;prestart 不更新、不产生异常。vstart≥vl 或 vl=0 时包括 tail 在内的所有目标元素均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零。
V 提供 FP32/FP64 并依赖 F/D;SEW=16 的本页操作需要 Zvfh。要求所需扩展、支持的宽度、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时,vsstatus.VS/FS 也须启用。所有向量浮点指令都要求有效 frm,即使不舍入或 vl=0;无效 frm 的使用保留。
教学动画固定 VLEN=4096、LMUL=m1、vstart=0、有效 frm=RNE、合法 vtype 和 VS/FS 已启用;VF 标量在 FLEN=64 下读取,SEW=32 时假定有效 NaN-box。动画展示教学步骤而非处理器周期,输入和异常范围见动画说明。
V向量运算浮点

指令行为说明

VFSGNJX.VF 对 vl 范围内的活动元素执行逐 lane 浮点符号位组合。第二源来自标量浮点寄存器 f[rs1];vm=0 时 v0.t 控制哪些元素执行,vm=1 时不使用执行掩码。官方 FSGNJ 类语义是位模式操作:非符号位来自 vs2,结果符号由 vs2[i] 与标量 f[rs1] 符号位 XOR 决定,并且不设置浮点异常标志;这不是浮点加减、比较或跨 lane 归约。V 本身定义 SEW=32 和 SEW=64;只有在 SEW=16 时才需要 Zvfh。

VFSGNJX.VF 指令解析与执行动画

从 OP-V 编码解码到逐元素浮点符号注入:保留 vs2 的非符号位,符号来源为 vs2 与 scalar f[rs1] 的符号 XOR。

输入的指令
vfsgnjx.vf
执行环境
LMULm1本动画固定的寄存器组倍数
VLEN4096固定向量寄存器长度(bits)
VLMAX128m1 下的最大元素数
vstart0本动画不展示 prestart 元素
frmRNE本指令不按 frm 舍入;真实指令仍要求有效 frm
FP stateFS enabledFS=Off 会触发非法指令;本动画固定展示 FS 已启用的架构路径
vta/vmata, ma尾部/非活动元素策略
opcode1010111OP-V 主操作码
编码字段
0x28855257
31..26
25
24..20
19..15
14..12
11..7
6..0
001010
funct6
0
vm
01000
vs2
01010
rs1
101
funct3
00100
vd
1010111
OP-V
执行数据路径

lane 0: bits 0x3fa00000 non-sign + sign XOR(0x3fa00000, 0x3fc00000) -> 0x3fa00000 (1.25)

显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。

步骤 1 / 15
读取 OP-V 编码字段

V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。

逐元素结果
长向量在模块内部横向滚动,不造成页面溢出。
i=0活动
bits 0x3fa00000 non-sign + sign XOR(0x3fa00000, 0x3fc00000)
0x3fa00000 (1.25)
i=1活动
bits 0xbfe00000 non-sign + sign XOR(0xbfe00000, 0x3fc00000)
0xbfe00000 (-1.75)
i=2跳过
v0.t=0,不执行
--
i=3活动
bits 0x40300000 non-sign + sign XOR(0x40300000, 0x3fc00000)
0x40300000 (2.75)
i=4活动
bits 0xc0500000 non-sign + sign XOR(0xc0500000, 0x3fc00000)
0xc0500000 (-3.25)
i=5活动
bits 0x40700000 non-sign + sign XOR(0x40700000, 0x3fc00000)
0x40700000 (3.75)
i=6跳过
v0.t=0,不执行
--
i=7活动
bits 0xc0980000 non-sign + sign XOR(0xc0980000, 0x3fc00000)
0xc0980000 (-4.75)
本动画按 SEW=32 / binary32 原始位模式执行符号位组合:非符号位来自 vs2,结果符号由 vs2 符号与第二源符号 XOR 决定。可输入十进制示例值或 8 位十六进制位模式;FSGNJ 类指令不设置浮点异常标志。

教学环境固定 VLEN=4096、LMUL=m1、vstart=0、合法 vtype、VS/FS 已启用及有效 frm=RNE,支持所选 binary32/64。FLEN=64;SEW=32 标量输入表示有效 NaN-box 中的低32位,未模拟无效 NaN-box。VL=0 时包括 tail 在内的目标元素均不更新;非活动和尾部按 ma/ta 处理,不显示确定值。符号注入保留 vs2 的 NaN payload,不设置 fflags;不按 frm 舍入,但真实指令仍要求有效 frm。

快速理解与检索要点

VFSGNJX.VF 的学习重点是 OP-V 编码、标量浮点寄存器 f[rs1]、v0.t 掩码,以及每个活动元素的 vd[i] = {vs2[i] 的非符号位, sign(vs2[i]) XOR sign(f[rs1])}。

OP-V 编码中 funct6=001010、funct3=101 选择 VFSGNJX.VF 的 vector-scalar 浮点符号注入形式。
语义是 vd[i] = {vs2[i] 的非符号位, sign(vs2[i]) XOR sign(f[rs1])},只对 vl 范围内的活动元素执行。
vm=0 使用 v0.t 作为执行掩码;vm=1 表示不使用执行掩码。
FSGNJ 类指令按位操作浮点表示,不设置浮点异常标志。 不规范化 NaN,保留 vs2 的非符号位(包括 NaN payload)。
普通 masked vector 指令的目标向量寄存器组不能与 v0 掩码源重叠;动画在 vm=0 且 vd=v0 时会报错。
汇编中可选的 v0.t 对应 vm=0;省略掩码操作数对应 vm=1。活动元素满足 vstart ≤ i < vl 且掩码允许;VL=0 时不更新任何目标元素(包括 tail)。
所有向量浮点指令均要求有效 frm,即使本指令无需舍入或 VL=0;使用无效 frm 的行为保留。
FLEN > SEW 时先检查标量是否有效 NaN-boxed:有效时读取低 SEW 位,否则使用 canonical NaN;不支持的浮点元素宽度(包括 FLEN < SEW)属于保留编码。

向量执行上下文

32 位 OP-V 编码:funct6=001010、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器;FLEN>SEW 时,有效 NaN-box 取低 SEW 位,否则使用 canonical NaN;FLEN<SEW 保留。

vd[i] 的非符号位来自 vs2[i],符号来自vs2 与第二源符号 XOR。不规范化 NaN、不设置浮点异常标志,也不按 frm 舍入。

向量操作数和结果为 SEW 位、EMUL=LMUL。同宽目标/源重叠合法;同名源须给出相同初始位模式。普通 masked 目标不能与 v0 重叠;同一源寄存器不能同时作为 EEW=1 掩码和 SEW 数据读取。

可选的汇编操作数 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;prestart 不更新、不产生异常。vstart≥vl 或 vl=0 时包括 tail 在内的所有目标元素均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零。

V 提供 FP32/FP64 并依赖 F/D;SEW=16 的本页操作需要 Zvfh。要求所需扩展、支持的宽度、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时,vsstatus.VS/FS 也须启用。所有向量浮点指令都要求有效 frm,即使不舍入或 vl=0;无效 frm 的使用保留。

教学动画固定 VLEN=4096、LMUL=m1、vstart=0、有效 frm=RNE、合法 vtype 和 VS/FS 已启用;VF 标量在 FLEN=64 下读取,SEW=32 时假定有效 NaN-box。动画展示教学步骤而非处理器周期,输入和异常范围见动画说明。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

用标量符号条件翻转向量

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32,ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:ft0=-1, v2=[1,-2,3,+0] → v1=[-1,2,-3,-0]。尾部按 ta 处理,不假定清零。

符号位 XOR

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32,ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:ft0=-1, v2=[1,-2,3,+0] → v1=[-1,2,-3,-0]。尾部按 ta 处理,不假定清零。

按标量符号选择保留或翻转符号

假定 V/VS/FS 已启用、合法 vtype、有效 frm=RNE、e32,m1 可用、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。输入为 binary32,ft0 若使用则在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:ft0=-1, v2=[1,-2,3,+0] → v1=[-1,2,-3,-0]。尾部按 ta 处理,不假定清零。

使用前检查清单

语法检查
  • 32 位 OP-V 编码:funct6=001010、funct3=101、opcode=1010111。rs1 选择浮点 f 寄存器;FLEN>SEW 时,有效 NaN-box 取低 SEW 位,否则使用 canonical NaN;FLEN<SEW 保留。
  • vd[i] 的非符号位来自 vs2[i],符号来自vs2 与第二源符号 XOR。不规范化 NaN、不设置浮点异常标志,也不按 frm 舍入。
语义检查
  • 向量操作数和结果为 SEW 位、EMUL=LMUL。同宽目标/源重叠合法;同名源须给出相同初始位模式。普通 masked 目标不能与 v0 重叠;同一源寄存器不能同时作为 EEW=1 掩码和 SEW 数据读取。
  • 可选的汇编操作数 v0.t 对应 vm=0,省略为 vm=1。活动元素满足 vstart≤i<vl 且掩码允许;prestart 不更新、不产生异常。vstart≥vl 或 vl=0 时包括 tail 在内的所有目标元素均不更新。其余非活动/尾部由 vma/vta 决定,ta/ma 不保证清零。
  • V 提供 FP32/FP64 并依赖 F/D;SEW=16 的本页操作需要 Zvfh。要求所需扩展、支持的宽度、合法 vtype 和 VS/FS 已启用;H 且虚拟化 V=1 时,vsstatus.VS/FS 也须启用。所有向量浮点指令都要求有效 frm,即使不舍入或 vl=0;无效 frm 的使用保留。
  • 教学动画固定 VLEN=4096、LMUL=m1、vstart=0、有效 frm=RNE、合法 vtype 和 VS/FS 已启用;VF 标量在 FLEN=64 下读取,SEW=32 时假定有效 NaN-box。动画展示教学步骤而非处理器周期,输入和异常范围见动画说明。

容易混淆 / 常见误区

结果不是数值乘法或普通算术取反;它按位保留 vs2 的非符号位,只替换符号位。
VFSGNJX.VF 的第二源只提供符号选择信息;不会把 f[rs1] 当作普通标量乘数。
FSGNJ 类指令不设置浮点异常标志;不要把 NaN payload 或异常行为按算术运算理解。
vm=0 时,只有 v0.t 选中的活动元素执行;vm=1 不使用执行掩码。被掩码关闭的元素不产生符号注入结果。
当 vm=0 使用 v0.t 作为执行掩码时,普通目标向量寄存器组不能与 v0 掩码寄存器重叠。

常见问题

VFSGNJX.VF 的 vm 操作数控制什么?

vm=0 时只执行 v0.t 为 1 的活动元素;vm=1 表示不使用执行掩码。本页公式是 vd[i] = {vs2[i] 的非符号位, sign(vs2[i]) XOR sign(f[rs1])}。

VFSGNJX.VF 是浮点算术运算吗?

不是。它是 FSGNJ 类位模式操作,保留 vs2 的非符号位并组合新的符号位,不设置浮点异常标志。

VFSGNJX.VF 的第二源数值大小会参与计算吗?

完成标量 NaN-box 检查后,只使用所得 SEW 位操作数的符号位。若 NaN-box 无效,先替换为 canonical NaN,再使用其符号位。