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

RISC-V VMADC.VXM 指令详解

指令手册OPIVX

VMADC 计算每个 body 元素的进位输出,并把布尔结果写入目标掩码寄存器。

指令语法

vmadc.vxm vd, vs2, rs1, v0
操作数说明
32 位 OP-V:opcode=1010111、funct6=010001、funct3=100(OPIVX)、vm=0。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。
rs1 是整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展到 SEW。x0 提供 0。
固定 vm=0,v0 的 bit i 是 carry-in 算术输入;所有 body 元素都执行,v0[i]=0 也不关闭该元素。语法用 v0,不是 v0.t。
把两个 SEW 位源按无符号值相加,再加 v0[i];和≥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.VXM 是 RISC-V V 扩展的向量-标量加法进位输出指令。它固定编码 vm=0,不写 SEW 宽整数结果;对每个 body 元素计算 vs2[i] + x[rs1] + v0[i] 的进位输出,并写成目标 mask 的一位。若 XLEN 大于 SEW,标量取低 SEW 位;若 XLEN 小于 SEW,标量符号扩展到 SEW。v0 是 carry-in 算术输入,不是普通 v0.t 执行掩码;即使 v0[i] 为 0,该 body 元素也执行。

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

从 OP-V 编码字段开始,展示 VMADC 如何把 v0 对应 bit 作为 carry-in,并把逐元素 carry-out 写成目标 mask bit。

输入的指令
vmadc.vxm
v0
v0
算术输入,不是执行掩码
执行环境

教学模型固定 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。普通掩码形式的 inactive 与 tail 元素按 vtype.vma/vta 处理,不在结果行中伪造确定值;VADC/VMADC/VSBC/VMSBC 则对所有 body 元素执行,v0 位仅作 carry/borrow-in。

OP-V encodingvmadc.vxm
funct6
010001
vm
0
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0xffff
0x010b
0x011c
0xfffc
0x013e
0x014f
0xfffe
0x0171
+cin
+cin
+cin
+cin
+cin
+cin
+cin
+cin
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
cin
1
0
1
1
1
0
1
1
v4.mask
...
...
...
...
...
...
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VMADC 是多字精度加法的进位生成指令:v0 提供输入位,vd.mask[i] 保存输出位。

OP-V 编码使用 funct6=010001,并通过 funct3 区分 .vv/.vx/.vi 形式。
VMADC.VXM 固定使用 v0 的对应 mask bit 作为 carry-in;这不是普通 v0.t 执行掩码。
目标 vd 是 mask 结果,每个 body 元素写一位。
VMADC 可与 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=100(OPIVX)、vm=0。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。

rs1 是整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展到 SEW。x0 提供 0。

固定 vm=0,v0 的 bit i 是 carry-in 算术输入;所有 body 元素都执行,v0[i]=0 也不关闭该元素。语法用 v0,不是 v0.t。

把两个 SEW 位源按无符号值相加,再加 v0[i];和≥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,v0.mask[0]=1:和为257,目标 mask bit 0 为1;不写整数和,tail 不保证保留。

大整数运算

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

进位传递

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

使用前检查清单

语法检查
  • 32 位 OP-V:opcode=1010111、funct6=010001、funct3=100(OPIVX)、vm=0。vd 是单个 mask 目标寄存器,每个元素一位;vs2 是 SEW 数据源。
  • rs1 是整数寄存器;XLEN>SEW 取低 SEW 位,XLEN<SEW 符号扩展到 SEW。x0 提供 0。
语义检查
  • 固定 vm=0,v0 的 bit i 是 carry-in 算术输入;所有 body 元素都执行,v0[i]=0 也不关闭该元素。语法用 v0,不是 v0.t。
  • 把两个 SEW 位源按无符号值相加,再加 v0[i];和≥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 位。

容易混淆 / 常见误区

v0 在 VMADC.VXM 中是 carry-in 算术输入,不是普通 masked execution 的元素开关。
VMADC 写目标掩码位,不写普通 SEW 宽整数向量元素。
VMADC 的每个 mask 结果是一位 predicate,不要按 SEW 宽整数解释。

常见问题

v0 在 VMADC.VXM 中是执行掩码吗?

不是。v0 的对应 bit 是 carry-in 算术输入。

VMADC.VXM 写什么结果?

它写目标 mask 的一位 carry-out 结果。