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

RISC-V VMULH.VV 指令详解

指令手册V-type

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

指令语法

vmulh.vv vd, vs2, vs1[, v0.t]
操作数说明
语法:vmulh.vv vd, vs2, vs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=010、funct6=100111。
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向量整数运算乘法

指令行为说明

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

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

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

输入的指令
vmulh.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 encodingvmulh.vv
funct6
100111
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0xfff0
0x0032
0x0043
0xffed
0x0065
0x0076
0xffea
0x0098
*
*
*
*
*
*
*
*
v12
0x0005
0xfff7
0x0017
0xfff5
0x0029
0xfff3
0x003b
0xfff1
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

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

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

向量执行上下文

语法:vmulh.vv vd, vs2, vs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=010、funct6=100111。

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=[0xff,policy,0xfe,0x00]。两个源按有符号解释,写高8位。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=[0xff,policy,0xfe,0x00]。两个源按有符号解释,写高8位。policy 表示保留旧值或全1;tail 不保证清零。

使用前检查清单

语法检查
  • 语法:vmulh.vv vd, vs2, vs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=010、funct6=100111。
  • 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;步骤不是处理器周期。

容易混淆 / 常见误区

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

常见问题

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

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

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

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