VMUL.VX

RISC-V VMUL.VX 指令详解

指令手册V-type

VMUL.VX 计算每个活动元素的 2*SEW 整数乘积,并写回乘积的低 SEW 位。

指令语法

vmul.vx vd, vs2, rs1[, v0.t]
操作数说明
语法:vmul.vx vd, vs2, rs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=110、funct6=100101。
vd 是 SEW 位整数向量目标,不是比较掩码;vs2 提供 SEW 位向量元素。rs1 指定整数 x 寄存器:XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 固定为 0。
写乘积低 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向量整数运算乘法

指令行为说明

VMUL.VX 是 RISC-V V 扩展的单宽整数向量标量乘法指令。每个活动元素读取 vs2 和来自整数标量寄存器 rs1 的第二源,生成 2*SEW 乘积,并把低 SEW 位写入 vd。低半结果与有符号性无关;vm=0 时只处理 v0.t 为 1 的 body 元素,mask-off 与 tail 元素按当前 vtype 策略处理。

VMUL.VX 指令解析与执行动画

从 OP-V 编码字段开始,展示 VMUL 如何生成 2*SEW 乘积,并把低 SEW 位写回 vd。

输入的指令
vmul.vx

要求合法 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 encodingvmul.vx
funct6
100101
vm
0
vs2
01000
rs1
01011
funct3
110
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0xfffe
0x003a
0x004f
0xfffb
0x0079
0x008e
0xfff8
0x00b8
*
*
*
*
*
*
*
*
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VMUL.VX 不写完整拓宽乘积。它对当前 vl 内活动元素生成 2*SEW 乘积,然后只把低 SEW 位写回 vd;第二源来自整数标量寄存器 rs1,低半结果与有符号性无关。

VMUL.VX 使用 OP-V 乘法类编码;.vx 形式由 funct3=110 选择,funct6=100101 选择 VMUL。
每个活动元素先形成 2*SEW 乘积,再写回低 SEW 位;vd 仍是 SEW 宽普通向量目标,不是 2*SEW 拓宽目标。
rs1 指定整数 x 寄存器:XLEN>SEW 时取低 SEW 位,XLEN<SEW 时符号扩展到 SEW;x0/zero 固定为 0。
低半结果与有符号性无关。
活动元素满足 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。
这不是乘加或饱和/舍入乘法;只按模 2^SEW 写回低半结果,不使用 vxrm。

向量执行上下文

语法:vmul.vx vd, vs2, rs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=110、funct6=100101。

vd 是 SEW 位整数向量目标,不是比较掩码;vs2 提供 SEW 位向量元素。rs1 指定整数 x 寄存器:XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 固定为 0。

写乘积低 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], x11=3, v0.mask[0..3]=[1,0,1,1] → v4=[0xfd,policy,0x80,0x15]。只写低8位。policy 表示保留旧值或全1;tail 不保证清零。

定点运算

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=4、vstart=0、ta/ma,源已初始化;示例使用 v0.t。v8=[0xff,2,0x80,7], x11=3, v0.mask[0..3]=[1,0,1,1] → v4=[0xfd,policy,0x80,0x15]。只写低8位。policy 表示保留旧值或全1;tail 不保证清零。

使用前检查清单

语法检查
  • 语法:vmul.vx vd, vs2, rs1[, v0.t]。32 位 OP-V:opcode=1010111、funct3=110、funct6=100101。
  • vd 是 SEW 位整数向量目标,不是比较掩码;vs2 提供 SEW 位向量元素。rs1 指定整数 x 寄存器:XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展;x0 固定为 0。
语义检查
  • 写乘积低 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;步骤不是处理器周期。

容易混淆 / 常见误区

VMUL 只写低 SEW 位,不写完整 2*SEW 乘积;需要完整拓宽结果时使用 VWMUL*。
低半结果对有符号和无符号乘法相同,但高半结果需要选择 VMULH/VMULHU/VMULHSU。
vm=0 使用 v0.t 作为执行掩码;mask-off 元素的目标值由当前 vtype.vma 策略决定。
这些指令不是乘加,不读取旧 vd 作为累加器;乘加/累加语义使用 VMACC/VWMACC 等对应指令。

常见问题

VMUL.VX 和 VWMUL* 有什么区别?

VMUL.VX 只写低 SEW 位,目标 vd 是 SEW 宽。VWMUL* 写完整 2*SEW 拓宽乘积。

VMUL.VX 会读取旧 vd 做累加吗?

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