vd 是仅输出寄存器吗?
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。
拓宽融合乘加:vs1[i] 与 vs2[i] 为 SEW 宽乘数,宽 vd[i] 为 2*SEW 加数和结果;(vs1[i] * vs2[i]) + vd[i]。
VFWMACC.VV 按官方 RVV 语义覆盖宽加数:vs1[i] 与 vs2[i] 是 SEW 宽乘数,vd[i] 同时是 2*SEW 宽输入和结果。每个活动元素执行 (vs1[i] * vs2[i]) + vd[i],以一次融合浮点运算舍入到宽结果格式。vm=0 时 v0.t 控制元素是否执行;本页面的可交互示例固定展示 SEW=32 到 binary64 的可核验路径。
从 OP-V 编码解码到逐元素拓宽融合乘加:两个 SEW=32 乘数与 2*SEW=64 的宽 vd[i] 在一次 binary64 融合运算中生成结果;第二乘数来自 same-lane vs1。
lane 0: fma(1, 0.5, 0.5) -> 1
显示的 lane 与当前步骤高亮同步;其余逐元素结果位于下方。
V 扩展浮点指令使用 OP-V 主操作码,字段包含 funct6、源寄存器、vm、funct3、vd 和 opcode。
先把 vs1[i] 与 vs2[i] 作为 SEW 宽乘数读取,再与宽 vd[i] 按 (vs1[i] * vs2[i]) + vd[i] 融合;vd[i] 被结果覆盖。
语法 vfwmacc.vv vd, vs1, vs2[, v0.t];32 位 OP-V:opcode=1010111、funct3=001、funct6=111100。先读取旧 vd 宽加数,再覆盖它。
窄向量源 EEW=SEW、EMUL=LMUL;vd 的 EEW=2×SEW、EMUL=2×LMUL。EMUL=2/4/8 的组起点按组大小对齐,EMUL>8 保留。vd 同时是宽源,因此窄乘数不能与宽 vd 组共享寄存器;同名窄源必须读取相同初值。
逐活动元素计算 (vs1[i] * vs2[i]) + old vd[i],乘积不先舍入,只在最终宽结果按动态 frm 舍入。两个窄乘数都是向量源。
省略 v0.t 为 vm=1;写出为 vm=0。活动元素满足 vstart≤i<vl 且掩码允许,仅活动元素异常累积到 fflags。masked 目标不得含 v0;同一寄存器不能同时作为不同 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;无效 frm 使用保留,vxrm 不参与。动画固定 SEW=32、LMUL=m1、VLEN=4096、vstart=0、ta/ma 和有限输入,非完整浮点模拟器。
假定 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=[3,-1,2,5], v12=[2,4,-2,0] → v4/v5=[7,-2,-7,4]。tail 按 ta 处理,不保证清零。
假定 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=[3,-1,2,5], v12=[2,4,-2,0] → v4/v5=[7,-2,-7,4]。tail 按 ta 处理,不保证清零。
不是。官方定义中 vd 是 2*SEW 宽加数,也会被最终结果覆盖;动画将它作为可编辑的累加器输入显示。