先看 vl
当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。
按活动元素的升序将 SEW 宽 vs2 元素提升为 2*SEW 后求和;宽 vs1[0] 是初值,只有宽 vd[0] 承载归约结果,其余目标元素为 tail。
VFWREDOSUM.VS 是 RVV 的拓宽有序浮点归约求和。它把 vl 内活动的 vs2 浮点元素从 SEW 提升到 2*SEW,并从宽 vs1[0] 开始按元素编号升序相加;只有宽 vd[0] 承载归约结果,其他目标元素是按当前 tail policy 管理的 tail。掩码关闭的元素不影响结果或浮点异常标志。vl=0 时不执行操作且不更新目标;vl 非零而没有活动源元素时不做加法,初值写入 vd[0]。
可核验的 FP32 到 FP64 归约示例;不模拟 NaN、无穷或异常标志。
宽标量结果:任意 v0-v31 的元素 0
SEW 窄源;不能和宽 vs1 使用同一寄存器
宽初值:任意寄存器的元素 0;掩码时不能为 v0
有限 FP64 示例值
恰好 4 个可表示为有限 FP32 的值
恰好 4 个 0/1 位
0xcc861257活动且已提升的元素:1, 3, 4
归约过程:
写回
v4[0] = 9
按活动元素的升序执行此演示。
显示 OP-V 指令编码;非法输入不会产生编码。
VFWREDOSUM.VS 把窄 vs2 元素提升后,按活动元素的升序从宽 vs1[0] 开始求和;归约结果在宽 vd[0],其他目标元素为 tail。
阅读 VFWREDOSUM.VS 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。
当前 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 vfwredosum.vs v4, v8, v12, v0.t # vd[0] = (((vs1[0] + vs2[0]) + ...) + vs2[vl-1])» 等实际代码理解该场景。
结合 «vsetvli t0, a0, e32, m1, ta, ma vfwredosum.vs v4, v8, v12, v0.t # vd[0] = (((vs1[0] + vs2[0]) + ...) + vs2[vl-1])» 等实际代码理解该场景。
不使用。普通 RVV 浮点运算和浮点转换使用浮点舍入模式 frm 或指令指定的固定舍入;vxrm 用于定点舍入指令。