首页/指令库/VWMUL.VV
VWMUL.VV

RISC-V VWMUL.VV 指令详解

指令手册V-type

VWMUL.VV 将有符号乘数的完整 2*SEW 乘积写入 vd,不累加旧 vd。

指令语法

vwmul.vv vd, vs2, vs1, vm
操作数说明
RV32/RV64 V 1.0;向量状态启用、vill=0,支持 SEW 和 2*SEW。vd 为 EEW=2*SEW、EMUL=2*LMUL≤8 的宽目标;组起点按 EMUL 对齐。SEW=64 要求额外128位整数元素支持。
32位 OP-V:opcode=1010111、funct6=111011、funct3=010 (OPMVV);vm bit25、vs2 bits24:20、vs1 bits19:15、vd bits11:7。语法源顺序是 vs2, vs1/rs1。可选v0.t表示vm=0,省略为vm=1。
按 signed × signed 得到完整2*SEW乘积,直接写vd。窄源仅在EMUL≥1且最高寄存器相同时可重叠宽目标,此时强制mask/tail-agnostic。同名源使用相同初值。
只对掩码允许的vstart≤i<vl元素计算。prestart不变;inactive/tail按vma/vta保持或agnostic(旧值或全1)。masked vd不含v0,v0不能同时提供mask与数据。vstart≥vl(含vl=0)目标全部不变;正常完成后vstart=0,不饱和、不改变vxsat。
V向量运算整数算术

指令行为说明

RISC-V V 1.0 拓宽整数乘法,使用有符号乘数。完整乘积为 2*SEW 位。要求启用向量状态、合法 vtype 和受支持 SEW/2*SEW。仅更新掩码允许的 vstart≤i<vl 元素;prestart 不变,inactive/tail 按 vma/vta 处理,合法不同 EEW 重叠时强制 agnostic。

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

从 OP-V 编码字段开始,展示 VWMUL 如何按有符号×有符号解释 SEW 源元素,并把完整 2*SEW 乘积写回 vd。

输入的指令
vwmul.vv

教学环境:V 1.0、向量状态已启用、合法受支持 vtype;固定 LMUL=m1、VLEN=4096、vstart=0。要求支持 SEW 与 2*SEW;SEW=64 需要额外128位整数元素支持。输入非负 SEW 位模式,乘法按补码有符号解释;.vx 在 XLEN>SEW 时取低位、XLEN<SEW 时符号扩展,x0 提供0。完整乘积写入2*SEW目标,不累加旧vd,不饱和、不改变vxsat。目标EMUL=2,须偶数起点;窄源只可与目标组最高寄存器重叠,此时强制mask/tail-agnostic。同名源须有相同初值;v0.t 时vd与数据源不可含v0。仅展示body,inactive/tail不显示确定值。VL=0不更新任何目标;正常完成后vstart=0。步骤不是处理器周期。

执行环境
OP-V encodingvwmul.vv
funct6
111011
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
w*
w*
w*
w*
w*
w*
w*
w*
v12
0x0005
0xfff7
0x0017
0xfff5
0x0029
0xfff3
0x003b
0xfff1
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VWMUL.VV 将有符号乘数的完整 2*SEW 乘积写入 vd,不累加旧 vd。

乘数解释:有符号乘数;只写完整乘积,不累加旧 vd。
两个 SEW 位乘数来自向量寄存器;同名源读取相同初值。
VL=0 或 vstart≥vl 时目标全部不更新;正常完成后 vstart=0。不饱和,不改变 vxsat。

向量执行上下文

RV32/RV64 V 1.0;向量状态启用、vill=0,支持 SEW 和 2*SEW。vd 为 EEW=2*SEW、EMUL=2*LMUL≤8 的宽目标;组起点按 EMUL 对齐。SEW=64 要求额外128位整数元素支持。

32位 OP-V:opcode=1010111、funct6=111011、funct3=010 (OPMVV);vm bit25、vs2 bits24:20、vs1 bits19:15、vd bits11:7。语法源顺序是 vs2, vs1/rs1。可选v0.t表示vm=0,省略为vm=1。

按 signed × signed 得到完整2*SEW乘积,直接写vd。窄源仅在EMUL≥1且最高寄存器相同时可重叠宽目标,此时强制mask/tail-agnostic。同名源使用相同初值。

只对掩码允许的vstart≤i<vl元素计算。prestart不变;inactive/tail按vma/vta保持或agnostic(旧值或全1)。masked vd不含v0,v0不能同时提供mask与数据。vstart≥vl(含vl=0)目标全部不变;正常完成后vstart=0,不饱和、不改变vxsat。

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

常见使用场景

拓宽整数乘法

假定 V/VS 已启用、合法 e8,m1,tu,mu、支持16位结果、VLEN=4096、XLEN=64、vl=4、vstart=0,v0.mask[0..3]=1101;v12=[255,128,1,127], v4=[255,2,128,1]。v8=[0x0001,0xff00,unchanged,0x007f](unchanged表示保持旧值)。结果为16位;lane2和tail保持旧值,不改变vxsat;正常完成后vstart=0。

使用前检查清单

语法检查
  • RV32/RV64 V 1.0;向量状态启用、vill=0,支持 SEW 和 2*SEW。vd 为 EEW=2*SEW、EMUL=2*LMUL≤8 的宽目标;组起点按 EMUL 对齐。SEW=64 要求额外128位整数元素支持。
  • 32位 OP-V:opcode=1010111、funct6=111011、funct3=010 (OPMVV);vm bit25、vs2 bits24:20、vs1 bits19:15、vd bits11:7。语法源顺序是 vs2, vs1/rs1。可选v0.t表示vm=0,省略为vm=1。
语义检查
  • 按 signed × signed 得到完整2*SEW乘积,直接写vd。窄源仅在EMUL≥1且最高寄存器相同时可重叠宽目标,此时强制mask/tail-agnostic。同名源使用相同初值。
  • 只对掩码允许的vstart≤i<vl元素计算。prestart不变;inactive/tail按vma/vta保持或agnostic(旧值或全1)。masked vd不含v0,v0不能同时提供mask与数据。vstart≥vl(含vl=0)目标全部不变;正常完成后vstart=0,不饱和、不改变vxsat。

容易混淆 / 常见误区

宽目标 EEW=2*SEW、EMUL=2*LMUL≤8;组起点须按 EMUL 对齐。
窄源与宽目标重叠仅允许源 EMUL≥1 且两组最高寄存器相同;此时强制 mask/tail-agnostic。
v0.t 表示 vm=0,省略表示 vm=1;掩码不能同时作为数据源,masked vd 不可包含 v0。

常见问题

inactive、tail 和 prestart 都一样处理吗?

prestart 始终保持;inactive/tail 分别按 vma/vta 保持或采用 agnostic。agnostic 可保留旧值或写全1,不保证固定值;合法不同 EEW 重叠强制 agnostic。

SEW=64 一定可用吗?

本拓宽运算要求实现支持 128 位整数元素,基础 V 不保证该支持;须确认受支持的 SEW/2*SEW 和合法寄存器组。