首页/指令库/向量有符号拓宽乘加
VWMACC.VV

RISC-V VWMACC.VV 指令详解

指令手册V-type

VWMACC.VV 将有符号完整乘积加到旧 2*SEW 位 vd,结果保留低 2*SEW 位。

指令语法

vwmacc.vv vd, vs1, vs2, vm
操作数说明
vd 是读写累加器,EEW=2*SEW、EMUL=2*LMUL≤8;vs2 和vs1是 SEW 位乘数。同名乘数读取相同初值。
32位 OP-V:opcode=1010111、funct6=111101、funct3=010 (OPMVV);vm 在bit25、vs2 在bits24:20、vs1 在bits19:15、vd 在bits11:7。可选 v0.t 表示vm=0,省略为vm=1。
活动 vd[i]=(旧 vd[i]+signed(vs1[i])×signed(vs2[i])) mod 2^(2*SEW)。完整乘积参与累加,不饱和,不改变vxsat。组起点按EMUL对齐;窄乘数不可与宽累加源vd重叠,以免同一寄存器按不同EEW读取。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 SEW/2*SEW。仅掩码允许的 vstart≤i<vl 元素计算;prestart不变,inactive/tail按vma/vta。masked vd不可含v0,v0不可同时提供掩码与数据。vstart≥vl(含vl=0)不更新任何目标元素;正常完成后vstart=0。
V向量运算整数算术

指令行为说明

V 1.0 拓宽乘加:vs1 向量元素按有符号解释,vs2[i] 按有符号解释;SEW×SEW 的完整乘积加到旧宽累加器。仅活动元素计算,不饱和。

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

从 OP-V 编码字段开始,展示 VWMACC 如何读取旧 2*SEW 宽 vd 累加器,按有符号×有符号生成乘积,并写回累加结果。

输入的指令
vwmacc.vv

教学环境:V 1.0、向量状态已启用、合法受支持 vtype;固定 LMUL=m1、VLEN=4096、vstart=0。要求支持 SEW 和 2*SEW;SEW=64 需额外128位整数元素支持。输入非负位模式;两个乘数按补码有符号解释。读取旧 2*SEW 位 vd,再加上完整乘积,保留低 2*SEW 位;不饱和,不改变 vxsat。标量先按 XLEN/SEW 转换(窄于 SEW 时符号扩展,宽于 SEW 时取低位),x0 提供0。vd 是 EMUL=2 的宽累加源,须偶数起点且不可与窄乘数重叠;同名窄源须有相同初值。v0.t 时 vd 和数据源不可含v0。仅展示 body,inactive/tail 按 vma/vta,不显示确定值。VL=0 不更新任何目标;正常完成后 vstart=0。步骤不是处理器周期。

执行环境
OP-V encodingvwmacc.vv
funct6
111101
vm
0
vs2
01000
vs1
01100
funct3
010
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
old v4
0xffffffdf
0x00000131
0x00000162
0x00000193
0xffffffcb
0x000001f5
0x00000226
0x00000257
v8
0xfff0
0x0032
0x0043
0xffed
0x0065
0x0076
0xffea
0x0098
acc+w*
acc+w*
acc+w*
acc+w*
acc+w*
acc+w*
acc+w*
acc+w*
v12
0x0005
0xfff7
0x0017
0xfff5
0x0029
0xfff3
0x003b
0xfff1
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

vd 先被读取,再加上完整宽乘积,最后以 2*SEW 位写回。

要求合法受支持 vtype、SEW 和 2*SEW,且向量状态已启用。
vd 的 EEW=2*SEW、EMUL=2*LMUL≤8;窄乘数不可与宽累加源重叠。
vm=0 使用 v0.t;省略掩码表示 vm=1。prestart 不变,inactive/tail 按 vma/vta。

向量执行上下文

vd 是读写累加器,EEW=2*SEW、EMUL=2*LMUL≤8;vs2 和vs1是 SEW 位乘数。同名乘数读取相同初值。

32位 OP-V:opcode=1010111、funct6=111101、funct3=010 (OPMVV);vm 在bit25、vs2 在bits24:20、vs1 在bits19:15、vd 在bits11:7。可选 v0.t 表示vm=0,省略为vm=1。

活动 vd[i]=(旧 vd[i]+signed(vs1[i])×signed(vs2[i])) mod 2^(2*SEW)。完整乘积参与累加,不饱和,不改变vxsat。组起点按EMUL对齐;窄乘数不可与宽累加源vd重叠,以免同一寄存器按不同EEW读取。

要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 SEW/2*SEW。仅掩码允许的 vstart≤i<vl 元素计算;prestart不变,inactive/tail按vma/vta。masked vd不可含v0,v0不可同时提供掩码与数据。vstart≥vl(含vl=0)不更新任何目标元素;正常完成后vstart=0。

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;old v8=[1,1,1,1], v12=[255,128,1,127], v4=[255,2,128,1]。v8=[0x0002,0xff01,unchanged,0x0080](unchanged表示保持旧值),结果保留低16位。lane2和tail保持旧值;vxsat不变,正常完成后vstart=0。

使用前检查清单

语法检查
  • vd 是读写累加器,EEW=2*SEW、EMUL=2*LMUL≤8;vs2 和vs1是 SEW 位乘数。同名乘数读取相同初值。
  • 32位 OP-V:opcode=1010111、funct6=111101、funct3=010 (OPMVV);vm 在bit25、vs2 在bits24:20、vs1 在bits19:15、vd 在bits11:7。可选 v0.t 表示vm=0,省略为vm=1。
语义检查
  • 活动 vd[i]=(旧 vd[i]+signed(vs1[i])×signed(vs2[i])) mod 2^(2*SEW)。完整乘积参与累加,不饱和,不改变vxsat。组起点按EMUL对齐;窄乘数不可与宽累加源vd重叠,以免同一寄存器按不同EEW读取。
  • 要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 SEW/2*SEW。仅掩码允许的 vstart≤i<vl 元素计算;prestart不变,inactive/tail按vma/vta。masked vd不可含v0,v0不可同时提供掩码与数据。vstart≥vl(含vl=0)不更新任何目标元素;正常完成后vstart=0。

容易混淆 / 常见误区

vd 是读写累加器,不是只写乘积的目标。
旧 vd 是 2*SEW 源,不能与窄乘数读取同一寄存器。

常见问题

会处理整个寄存器吗?

只计算掩码允许的 vstart≤i<vl 元素。vstart≥vl(含 vl=0)时不更新任何目标元素。