VMULHU.VV 和 VWMUL* 有什么区别?
VMULHU.VV 只写高 SEW 位,目标 vd 是 SEW 宽。VWMUL* 写完整 2*SEW 拓宽乘积。
VMULHU.VV 计算每个活动元素的 2*SEW 整数乘积,并写回乘积的高 SEW 位。
VMULHU.VV 是 RISC-V V 扩展的单宽整数向量向量乘法指令。每个活动元素读取 vs2 和来自向量寄存器 vs1 的第二源,生成 2*SEW 乘积,并把高 SEW 位写入 vd。两个源操作数都按无符号解释;vm=0 时只处理 v0.t 为 1 的 body 元素,mask-off 与 tail 元素按当前 vtype 策略处理。
从 OP-V 编码字段开始,展示 VMULHU 如何生成 2*SEW 乘积,并把无符号×无符号的高 SEW 位写回 vd。
要求合法 vtype、已启用 VS 与受支持 SEW;VL=0 时包括 tail 在内均不更新。普通 masked vd 不可为 v0,v0 也不能同时提供 mask 与 SEW 数据;同宽源/目标可重叠。步骤仅为教学分解,不是处理器周期。
教学模型固定 LMUL=m1、vstart=0,只展示所选 VL 的 body 元素。固定 VLEN=4096,VLMAX=4096/16=256,只演示支持所选 SEW 的实现;同名向量源必须具有相同元素。普通掩码形式的 inactive 与 tail 元素按 vtype.vma/vta 处理,不在结果行中伪造确定值;VADC/VMADC/VSBC/VMSBC 则对所有 body 元素执行,v0 位仅作 carry/borrow-in。
vmulhu.vv 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。
动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、2*SEW 乘积高半整数无符号高半乘法、mask 控制和 vd 写回;不模拟流水线、缓存或执行时延。
VMULHU.VV 不写完整拓宽乘积。它对当前 vl 内活动元素生成 2*SEW 乘积,然后只把高 SEW 位写回 vd;第二源来自向量寄存器 vs1,两个源操作数都按无符号解释。
语法:vmulhu.vv vd, vs2, vs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=010、funct6=100100。
vd 是 SEW 位整数向量目标,不是比较掩码;vs2 提供 SEW 位向量元素。vs1 提供同索引 SEW 位向量元素;同名源读取相同初值。
两个源均按无符号解释,写 2×SEW 乘积的高 SEW 位。不是乘加,也不使用 vxrm 舍入或饱和。
活动元素满足 vstart≤i<vl 且 vm=1 或 v0.mask[i]=1;prestart 保持,inactive/tail 按 vma/vta 保留旧值或可写全1。vstart≥vl(含 vl=0)不更新任何目标元素。
同宽源/目标可重叠。EEW=SEW、EMUL=LMUL;EMUL=2/4/8 按组大小对齐。普通 masked vd 不可包含 v0,v0 不能同时提供 EEW=1 掩码和 SEW 数据。要求扩展、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。动画固定 LMUL=m1、VLEN=4096、vstart=0,仅展示 body;步骤不是处理器周期。
假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;示例使用 v0.t。v8=[0xff,2,0x80,7], v12=[3,3,3,3], v0.mask[0..3]=[1,0,1,1] → v4=[0x02,policy,0x01,0x00]。两个源均无符号。policy 表示保留旧值或全1;tail 不保证清零。
假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;示例使用 v0.t。v8=[0xff,2,0x80,7], v12=[3,3,3,3], v0.mask[0..3]=[1,0,1,1] → v4=[0x02,policy,0x01,0x00]。两个源均无符号。policy 表示保留旧值或全1;tail 不保证清零。
VMULHU.VV 只写高 SEW 位,目标 vd 是 SEW 宽。VWMUL* 写完整 2*SEW 拓宽乘积。
不会。本指令只写本次乘法选择出的高 SEW 位;需要累加时使用 VMACC/VWMACC 等乘加指令。