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

RISC-V VWMACC.VX 指令详解

指令手册V-type

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

指令语法

vwmacc.vx vd, rs1, vs2, vm
操作数说明
vd 是读写累加器,EEW=2*SEW、EMUL=2*LMUL≤8;vs2 和标量 rs1 转换后的值是 SEW 位乘数。XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零。
32位 OP-V:opcode=1010111、funct6=111101、funct3=110 (OPMVX);vm 在bit25、vs2 在bits24:20、rs1 在bits19:15、vd 在bits11:7。可选 v0.t 表示vm=0,省略为vm=1。
活动 vd[i]=(旧 vd[i]+signed(转换后的标量)×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 拓宽乘加:rs1 标量按有符号解释,vs2[i] 按有符号解释;SEW×SEW 的完整乘积加到旧宽累加器。仅活动元素计算,不饱和。

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

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

输入的指令
vwmacc.vx

教学环境: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.vx
funct6
111101
vm
0
vs2
01000
rs1
01011
funct3
110
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*
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

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

动画只展示官方 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 和标量 rs1 转换后的值是 SEW 位乘数。XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零。

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

活动 vd[i]=(旧 vd[i]+signed(转换后的标量)×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], x5=255。v8=[0x0002,0x0081,unchanged,0xff82](unchanged表示保持旧值),结果保留低16位。lane2和tail保持旧值;vxsat不变,正常完成后vstart=0。

使用前检查清单

语法检查
  • vd 是读写累加器,EEW=2*SEW、EMUL=2*LMUL≤8;vs2 和标量 rs1 转换后的值是 SEW 位乘数。XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零。
  • 32位 OP-V:opcode=1010111、funct6=111101、funct3=110 (OPMVX);vm 在bit25、vs2 在bits24:20、rs1 在bits19:15、vd 在bits11:7。可选 v0.t 表示vm=0,省略为vm=1。
语义检查
  • 活动 vd[i]=(旧 vd[i]+signed(转换后的标量)×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)时不更新任何目标元素。