首页/指令库/VMULHU-VV
VMULHU.VV

RISC-V VMULHU.VV 指令详解

指令手册OPMVV

VMULHU.VV 计算每个活动元素的 2*SEW 整数乘积,并写回乘积的高 SEW 位。

指令语法

vmulhu.vv vd, vs2, vs1[, v0.t]
操作数说明
语法: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向量整数运算乘法

指令行为说明

VMULHU.VV 是 RISC-V V 扩展的单宽整数向量向量乘法指令。每个活动元素读取 vs2 和来自向量寄存器 vs1 的第二源,生成 2*SEW 乘积,并把高 SEW 位写入 vd。两个源操作数都按无符号解释;vm=0 时只处理 v0.t 为 1 的 body 元素,mask-off 与 tail 元素按当前 vtype 策略处理。

VMULHU.VV 指令解析与执行动画

从 OP-V 编码字段开始,展示 VMULHU 如何生成 2*SEW 乘积,并把无符号×无符号的高 SEW 位写回 vd。

输入的指令
vmulhu.vv

要求合法 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。

OP-V encodingvmulhu.vv
funct6
100100
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0xfffe
0x003a
0x004f
0xfffb
0x0079
0x008e
0xfff8
0x00b8
*
*
*
*
*
*
*
*
v12
0x0009
0xfffb
0x001f
0xfff9
0x0035
0xfff7
0x004b
0xfff5
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

vmulhu.vv 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。

动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、2*SEW 乘积高半整数无符号高半乘法、mask 控制和 vd 写回;不模拟流水线、缓存或执行时延。

快速理解与检索要点

VMULHU.VV 不写完整拓宽乘积。它对当前 vl 内活动元素生成 2*SEW 乘积,然后只把高 SEW 位写回 vd;第二源来自向量寄存器 vs1,两个源操作数都按无符号解释。

VMULHU.VV 使用 OP-V 乘法类编码;.vv 形式由 funct3=010 选择,funct6=100100 选择 VMULHU。
每个活动元素先形成 2*SEW 乘积,再写回高 SEW 位;vd 仍是 SEW 宽普通向量目标,不是 2*SEW 拓宽目标。
第二源来自 vs1 的同 lane 元素;本指令不是归约,也不会跨 lane 组合。
两个源操作数都按无符号解释。
活动元素为 vstart≤i<vl 且(vm=1 或 v0.mask[i]=1);prestart 保持,inactive/tail 按 vma/vta 保留旧值或可写全1。
要求 V 1.0、受支持的 SEW/LMUL、vtype.vill=0、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。vstart≥vl(含 vl=0)时包括 tail 在内不更新任何目标元素。
EEW=SEW、EMUL=LMUL;同宽源/目标可重叠,EMUL=2/4/8 按组大小对齐。masked vd 不可包含 v0;v0 不可同时作为 EEW=1 mask 和 SEW 数据源。没有额外缩放、vxrm 舍入或饱和。

向量执行上下文

语法: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;步骤不是处理器周期。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

定点运算

假定 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 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;步骤不是处理器周期。

容易混淆 / 常见误区

VMULHU.VV 写高 SEW 位,不写低半结果;低半乘法使用 VMUL。
两个源操作数都按无符号解释;不要把 VMULH、VMULHU、VMULHSU 的符号组合混用。
vm=0 使用 v0.t 作为执行掩码;mask-off 元素的目标值由当前 vtype.vma 策略决定。
这些指令不是乘加,不读取旧 vd 作为累加器;乘加/累加语义使用 VMACC/VWMACC 等对应指令。

常见问题

VMULHU.VV 和 VWMUL* 有什么区别?

VMULHU.VV 只写高 SEW 位,目标 vd 是 SEW 宽。VWMUL* 写完整 2*SEW 拓宽乘积。

VMULHU.VV 会读取旧 vd 做累加吗?

不会。本指令只写本次乘法选择出的高 SEW 位;需要累加时使用 VMACC/VWMACC 等乘加指令。