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

RISC-V VMADC.VV 指令详解

指令手册OPIVV

计算逐元素加法进位,并把布尔结果写入目标掩码 vd。

指令语法

vmadc.vv vd, vs2, vs1
操作数说明
32 位 OP-V:opcode=1010111、funct6=010001、funct3=000(OPIVV)、vm=1。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。
vs1 提供同 lane 的 SEW 位第二源;同名向量源只有一份初值。
固定 vm=1,没有 carry-in,也没有普通 v0.t 执行掩码。每个 body 元素都执行。
把两个 SEW 位源按无符号值相加;和≥2^SEW 时 vd.mask[i]=1,否则为0。不写 SEW 宽整数和;mask 位 i 位于 vd 的 bit i,与 SEW/LMUL 无关。
目标与源遵循寄存器组重叠限制:mask EEW=1;目标窄于源时须与源组低端同起点。带 carry-in 时 v0 不能同时作为 SEW 数据源,但 mask 目标可为 v0。动画固定 LMUL=m1,因此 vd 可与数据源同名。
要求 V 1.0、向量状态已启用、合法 vtype 及所选宽度受支持。body 为 vstart≤i<vl;prestart 不更新,mask tail 始终 agnostic,不受 vta 控制。VL=0 或 vstart≥vl 不更新任何目标位,包括 tail。动画固定 VLEN=4096、vstart=0,只显示 body 位。
V向量整数运算进位/借位

指令行为说明

VMADC.VV 是 RISC-V V 扩展的向量加法进位输出指令。它不写整数和,而是把 vs2[i] + vs1[i] 的每个元素进位输出写成目标掩码位。不带 m 后缀的形式没有进位输入,且没有普通执行掩码操作数。目标寄存器是掩码寄存器,不能理解为普通 SEW 宽整数结果。

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

从 OP-V 编码字段开始,展示无 m 的 VMADC 形式如何以 vm=1 处理所有 body 元素,不读取 carry-in,并把逐元素 carry-out 写入目标掩码位。

输入的指令
vmadc.vv
vm
1
固定未掩码编码,不是语法操作数
执行环境

教学模型固定 LMUL=m1、vstart=0,只展示所选 VL 的 body 元素。固定 VLEN=4096,VLMAX=4096/16=256,只演示支持所选 SEW 的实现;同名向量源必须具有相同元素。VMADC 的目标 mask 始终采用 tail-agnostic;tail 不保证保留,VL=0 时包括 tail 在内不更新任何目标位。LMUL=m1 下 vd 可以与 SEW 数据源同名;带 carry-in 时 v0 不能同时用作 SEW 数据源,但 vd 可以是 v0。VMADC.VV 固定 vm=1,无 v0 carry-in;若 v0 被指定为 SEW 数据源,仍读取其数据。每个 body 元素产生一个目标 mask bit。

OP-V encodingvmadc.vv
funct6
010001
vm
1
vs2
01000
vs1
01100
funct3
000
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0xffff
0x010b
0x011c
0xfffc
0x013e
0x014f
0xfffe
0x0171
+
+
+
+
+
+
+
+
v12
0x0003
0x0016
0x001f
0x0006
0x0031
0x003a
0x0005
0x004c
active
1
1
1
1
1
1
1
1
v4.mask
...
...
...
...
...
...
...
...
当前步骤

显示 OP-V 32 位编码字段

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

动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、SEW 宽度整数进位输出生成、固定 vm=1、无 carry-in和 vd 写回;不模拟流水线、缓存或执行时延。

快速理解与检索要点

VMADC.VV 固定 vm=1,对每个 body 元素从 vs2[i] + vs1[i] 生成进位掩码;它不读取 v0 carry-in,但 v0 若被指定为 SEW 数据源仍会读取其数据。

目标 vd 保存一位掩码结果,每个元素一位。
该无 m 形式固定 vm=1,不读取 v0 carry-in,也不接受普通执行掩码操作数;v0 仍可作为 SEW 数据源。
与 VADC 的带进位形式配合可实现多字精度加法。
body 为 vstart ≤ i < vl。目标 mask 始终采用 tail-agnostic;VL=0 或 vstart≥vl 时不更新任何目标位,包括 tail。
mask 结果每个元素占一位。目标与源须满足寄存器组重叠限制;带 carry-in 时 v0 不能同时作为 SEW 数据源,但 mask 目标可以是 v0。

向量执行上下文

32 位 OP-V:opcode=1010111、funct6=010001、funct3=000(OPIVV)、vm=1。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。

vs1 提供同 lane 的 SEW 位第二源;同名向量源只有一份初值。

固定 vm=1,没有 carry-in,也没有普通 v0.t 执行掩码。每个 body 元素都执行。

把两个 SEW 位源按无符号值相加;和≥2^SEW 时 vd.mask[i]=1,否则为0。不写 SEW 宽整数和;mask 位 i 位于 vd 的 bit i,与 SEW/LMUL 无关。

目标与源遵循寄存器组重叠限制:mask EEW=1;目标窄于源时须与源组低端同起点。带 carry-in 时 v0 不能同时作为 SEW 数据源,但 mask 目标可为 v0。动画固定 LMUL=m1,因此 vd 可与数据源同名。

要求 V 1.0、向量状态已启用、合法 vtype 及所选宽度受支持。body 为 vstart≤i<vl;prestart 不更新,mask tail 始终 agnostic,不受 vta 控制。VL=0 或 vstart≥vl 不更新任何目标位,包括 tail。动画固定 VLEN=4096、vstart=0,只显示 body 位。

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

常见使用场景

多精度加法

假定 V、合法 e8,m1、vl=1、vstart=0 且源已初始化,vs2[0]=255,第二源为1:和为256,目标 mask bit 0 为1;不写整数和,tail 不保证保留。

大整数运算

假定 V、合法 e8,m1、vl=1、vstart=0 且源已初始化,vs2[0]=255,第二源为1:和为256,目标 mask bit 0 为1;不写整数和,tail 不保证保留。

进位传递

假定 V、合法 e8,m1、vl=1、vstart=0 且源已初始化,vs2[0]=255,第二源为1:和为256,目标 mask bit 0 为1;不写整数和,tail 不保证保留。

使用前检查清单

语法检查
  • 32 位 OP-V:opcode=1010111、funct6=010001、funct3=000(OPIVV)、vm=1。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。
  • vs1 提供同 lane 的 SEW 位第二源;同名向量源只有一份初值。
语义检查
  • 固定 vm=1,没有 carry-in,也没有普通 v0.t 执行掩码。每个 body 元素都执行。
  • 把两个 SEW 位源按无符号值相加;和≥2^SEW 时 vd.mask[i]=1,否则为0。不写 SEW 宽整数和;mask 位 i 位于 vd 的 bit i,与 SEW/LMUL 无关。
  • 目标与源遵循寄存器组重叠限制:mask EEW=1;目标窄于源时须与源组低端同起点。带 carry-in 时 v0 不能同时作为 SEW 数据源,但 mask 目标可为 v0。动画固定 LMUL=m1,因此 vd 可与数据源同名。
  • 要求 V 1.0、向量状态已启用、合法 vtype 及所选宽度受支持。body 为 vstart≤i<vl;prestart 不更新,mask tail 始终 agnostic,不受 vta 控制。VL=0 或 vstart≥vl 不更新任何目标位,包括 tail。动画固定 VLEN=4096、vstart=0,只显示 body 位。

容易混淆 / 常见误区

进位以单个掩码位表示,不是完整SEW数据值
不带 m 后缀的形式无进位入;与vmadc.vvm(带进位入,vm=0)区分

常见问题

VMADC.VV 会写出加法结果吗?

不会。它只写进位输出的掩码位;加法的 SEW 宽结果由 VADC 等数据指令产生。