vd 是仅输出寄存器吗?
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。
拓宽负融合乘减累加器:vs1[i] 与 vs2[i] 为 SEW 宽乘数,宽 vd[i] 为 2*SEW 加数和结果;-(vs1[i] * vs2[i]) + vd[i]。
扩展条件:V 1.0,RV32/RV64;要求受支持的浮点格式、合法 vtype、VS/FS 已启用。标准 V 支持 SEW=32 到 FP64;不保证 SEW=64 到 FP128。
VFWNMSAC.VV 读取 SEW 宽乘数和 2*SEW 宽旧 vd,按 -(vs1[i] * vs2[i]) + old vd[i] 融合舍入到宽结果并覆盖 vd。仅活动元素执行;动画展示有限 FP32 到 FP64 的 RNE 路径。
从 OP-V 编码解码到逐元素拓宽融合乘加:两个 SEW=32 乘数与 2*SEW=64 的宽 vd[i] 在一次 binary64 融合运算中生成结果;第二乘数来自 same-lane vs1。
lane 0: fma(-(1), 0.5, 0.5) -> 0
显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
先把 vs1[i] 与 vs2[i] 作为 SEW 宽乘数读取,再与宽 vd[i] 按 -(vs1[i] * vs2[i]) + vd[i] 融合;vd[i] 被结果覆盖。
语法 vfwnmsac.vv vd, vs1, vs2[, v0.t];32 位 OP-V:opcode=1010111, funct3=001, funct6=111111。
窄向量乘数 EEW=SEW、EMUL=LMUL;vd 既是宽源也是宽结果,EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 按组大小对齐,EMUL>8 保留;窄乘数不得与宽 vd 源组共享寄存器,同名窄源须读取相同初值。
活动元素计算 -(vs1[i] * vs2[i]) + old vd[i];乘积不单独舍入,只在最终宽结果融合舍入。两个乘数来自同索引向量元素。
省略 v0.t 为 vm=1,写出为 vm=0;掩码关闭源不产生浮点异常,活动异常累积到 fflags。同一寄存器不能同时作为 EEW=1 掩码与不同 EEW 数据源。masked 目标不能含 v0。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),vxrm 不参与。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、RNE 和有限输入,不完整模拟 NaN、无穷或 fflags。
假定 V/VS/FS 已启用、合法 e32,m1、所需格式受支持、frm=RNE、VLMAX≥4、a0=4;vsetvli 后 vl=4、vstart=0。省略 v0.t,未掩码;old v4/v5(binary64)=[1,2,-3,4], v8(binary32)=[3,-1,2,5], v12(binary32)=[2,4,-2,0] → v4/v5=[-5,6,1,4]。tail 按 ta 处理,不保证清零。
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。