vd 是仅输出寄存器吗?
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。
拓宽融合乘减累加器:f[rs1] 与 vs2[i] 为 SEW 宽乘数,宽 vd[i] 为 2*SEW 加数和结果;(f[rs1] * vs2[i]) - vd[i]。
扩展条件:V 1.0,适用于 RV32/RV64;所需浮点格式和 vtype 必须受支持,VS/FS 必须启用。标准 V 支持此处 SEW=32 到 binary64 的路径;不表示 SEW=64 可生成受支持的 binary128。
VFWMSAC.VF 按官方 RVV 语义覆盖宽加数:f[rs1] 与 vs2[i] 是 SEW 宽乘数,vd[i] 同时是 2*SEW 宽输入和结果。每个活动元素执行 (f[rs1] * vs2[i]) - vd[i],以一次融合浮点运算舍入到宽结果格式。vm=0 时 v0.t 控制元素是否执行;本页面的可交互示例固定展示 SEW=32 到 binary64 的可核验路径。
从 OP-V 编码解码到逐元素拓宽融合乘加:两个 SEW=32 乘数与 2*SEW=64 的宽 vd[i] 在一次 binary64 融合运算中生成结果;第二乘数来自 scalar f[rs1]。
lane 0: fma(1, 1.5, -(0.5)) -> 1
显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
先把 f[rs1] 与 vs2[i] 作为 SEW 宽乘数读取,再与宽 vd[i] 按 (f[rs1] * vs2[i]) - vd[i] 融合;vd[i] 被结果覆盖。
语法 vfwmsac.vf vd, rs1, vs2[, v0.t];32 位 OP-V:opcode=1010111, funct3=101, funct6=111110。vd 同时是宽输入与宽结果。
窄向量源 EEW=SEW、EMUL=LMUL;vd 的 EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留。旧 vd 同时是宽源;窄乘数不得与宽 vd 源组共享寄存器。同名窄源读取相同初值。
每个活动元素计算 (f[rs1] * vs2[i]) - old vd[i],乘积不单独舍入,只在最终双宽结果处融合舍入。真实指令使用动态 frm,vxrm 不参与。rs1 选择 f 寄存器;FLEN>SEW 时无效 NaN-box 提供 canonical NaN,FLEN<SEW 的编码保留。
省略 v0.t 为 vm=1,写出为 vm=0;仅 vstart≤i<vl 且掩码允许的元素执行并累积浮点异常到 fflags。masked 目标不得含 v0;同一寄存器不能同时作为 EEW=1 掩码源和不同 EEW 数据源读取。
prestart 不更新、不产生异常;vl=0 或 vstart≥vl 时包括 tail 在内的全部目标不更新。其余 inactive/tail 按 vma/vta 处理,ta/ma 不保证清零;成功执行复位 vstart=0。
V 1.0 适用于 RV32/RV64,依赖 F/D;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。H 且虚拟化 V=1 时 vsstatus.VS/FS 也须启用。无效 frm 的使用保留(包括 vl=0)。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE、ta/ma 与有限输入,不完整模拟 NaN、无穷或 fflags。
假定 V/VS/FS 已启用、合法 e32,m1、所需格式受支持、frm=RNE、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。浮点标量在 FLEN=64 下有效 NaN-boxed。省略 v0.t,未掩码:old v4/v5(binary64)=[1,2,-3,4], fa0=1.5, v8(binary32)=[2,4,-2,0] → v4/v5=[2,4,0,-4]。tail 按 ta 处理,不保证清零。
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。