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

RISC-V VMSBC.VXM 指令详解

指令手册OPIVX

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

指令语法

vmsbc.vxm vd, vs2, rs1, v0
操作数说明
语法 vmsbc.vxm vd, vs2, rs1, v0;vd 为单个 mask 寄存器,vs2 为 SEW 数据源,rs1 为整数标量源。
32 位 OP-V:opcode=1010111、funct6=010011、funct3=100 (OPIVX)。固定 vm=0。
按无符号位模式计算 vs2[i]-scalar-v0.mask[i];截断前差值为负写1,否则写0。XLEN>SEW 取标量低 SEW 位,XLEN<SEW 符号扩展。v0 为借位输入,0 位仍执行。
mask 目标可为 v0;与 SEW 源重叠须位于源组最低寄存器,合法不同 EEW 重叠强制 ma/ta。m1 下可同名。读取 v0 mask/借位时,v0 不可同时作为 SEW 数据源。
需 RV32/RV64 V 1.0、合法 vtype、VS 已启用及受支持 SEW;body 为 vstart≤i<vl,prestart 不变。所有 body 写借位位,mask tail 始终 agnostic。VL=0 不更新任何目标(含 tail);动画只展示固定合法配置的 body,步骤不是处理器周期。
V向量整数运算进位/借位

指令行为说明

VMSBC.VXM 是 RISC-V V 扩展的向量-标量减法借位输出指令。对每个 body 元素,将 vs2[i] 与按 SEW 处理的 x[rs1] 作为无符号数相减,再减去 v0.mask[i];截断前差值为负时,vd.mask[i] 写 1,否则写 0。它只写借位掩码,不写整数差值。固定 vm=0,v0 是借位输入,不是 v0.t 执行掩码;所有 body 元素均计算。

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

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

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

要求合法 vtype、VS 已启用与受支持 SEW;VL=0 不更新任何目标(含 tail)。VMSBC 每个 body 元素写一个 mask bit,tail 始终 agnostic;m1 下 vd 可与数据源同名,也可为 v0。带 borrow-in 时 v0 不可同时作 SEW 数据源。

执行环境

教学模型固定 LMUL=m1、vstart=0,只展示所选 VL 的 body 元素。固定 VLEN=4096,VLMAX=4096/16=256,只演示支持所选 SEW 的实现;同名向量源必须具有相同元素。普通掩码形式的 inactive 与 tail 元素按 vtype.vma/vta 处理,不在结果行中伪造确定值;VADC/VMADC/VSBC/VMSBC 则对所有 body 元素执行,v0 位仅作 carry/borrow-in。

OP-V encodingvmsbc.vxm
funct6
010011
vm
0
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x0000
0x003b
0x004c
0x0003
0x006e
0x007f
0x0002
0x00a1
-bin
-bin
-bin
-bin
-bin
-bin
-bin
-bin
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
bin
1
0
1
1
1
0
1
1
v4.mask
...
...
...
...
...
...
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

VMSBC.VXM 只生成借位掩码:vd.mask[i] = (unsigned(vs2[i]) - unsigned(scalar) - v0.mask[i] < 0)。

OP-V:opcode=1010111、funct6=010011、funct3=100 (OPIVX),vm=0。
标量 x[rs1] 在 XLEN>SEW 时取低 SEW 位,在 XLEN<SEW 时符号扩展到 SEW,再按无符号位模式参与减法。
目标 vd 每元素一位,tail 始终 agnostic;VL=0 时包括 tail 在内不更新任何目标位。
LMUL=m1 时,vd 可与 SEW 数据源同名,也可为 v0。但 v0 不能同时作为 EEW=1 借位源和 SEW 数据源。

向量执行上下文

语法 vmsbc.vxm vd, vs2, rs1, v0;vd 为单个 mask 寄存器,vs2 为 SEW 数据源,rs1 为整数标量源。

32 位 OP-V:opcode=1010111、funct6=010011、funct3=100 (OPIVX)。固定 vm=0。

按无符号位模式计算 vs2[i]-scalar-v0.mask[i];截断前差值为负写1,否则写0。XLEN>SEW 取标量低 SEW 位,XLEN<SEW 符号扩展。v0 为借位输入,0 位仍执行。

mask 目标可为 v0;与 SEW 源重叠须位于源组最低寄存器,合法不同 EEW 重叠强制 ma/ta。m1 下可同名。读取 v0 mask/借位时,v0 不可同时作为 SEW 数据源。

需 RV32/RV64 V 1.0、合法 vtype、VS 已启用及受支持 SEW;body 为 vstart≤i<vl,prestart 不变。所有 body 写借位位,mask tail 始终 agnostic。VL=0 不更新任何目标(含 tail);动画只展示固定合法配置的 body,步骤不是处理器周期。

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

常见使用场景

多精度减法

假定 RV32/RV64 V 1.0、VS 已启用、合法 e32,m1、VLEN≥128、vl=4、vstart=0,源已初始化;v0 是借位输入,所有 body 均执行。v2=[0,7,0xffffffff,4], x11=7, v0.mask=[0,1,0,1] → v1.mask[0..3]=[1,1,0,1]。只写 mask bit,tail 始终 agnostic,不假定清零。

大整数运算

假定 RV32/RV64 V 1.0、VS 已启用、合法 e32,m1、VLEN≥128、vl=4、vstart=0,源已初始化;v0 是借位输入,所有 body 均执行。v2=[0,7,0xffffffff,4], x11=7, v0.mask=[0,1,0,1] → v1.mask[0..3]=[1,1,0,1]。只写 mask bit,tail 始终 agnostic,不假定清零。

使用前检查清单

语法检查
  • 语法 vmsbc.vxm vd, vs2, rs1, v0;vd 为单个 mask 寄存器,vs2 为 SEW 数据源,rs1 为整数标量源。
  • 32 位 OP-V:opcode=1010111、funct6=010011、funct3=100 (OPIVX)。固定 vm=0。
语义检查
  • 按无符号位模式计算 vs2[i]-scalar-v0.mask[i];截断前差值为负写1,否则写0。XLEN>SEW 取标量低 SEW 位,XLEN<SEW 符号扩展。v0 为借位输入,0 位仍执行。
  • mask 目标可为 v0;与 SEW 源重叠须位于源组最低寄存器,合法不同 EEW 重叠强制 ma/ta。m1 下可同名。读取 v0 mask/借位时,v0 不可同时作为 SEW 数据源。
  • 需 RV32/RV64 V 1.0、合法 vtype、VS 已启用及受支持 SEW;body 为 vstart≤i<vl,prestart 不变。所有 body 写借位位,mask tail 始终 agnostic。VL=0 不更新任何目标(含 tail);动画只展示固定合法配置的 body,步骤不是处理器周期。

容易混淆 / 常见误区

借位看截断前的无符号差值是否为负,不是截断后结果的符号位。
v0 是借位输入,0 位仍执行当前 body 元素。
目标是每元素一位的掩码,tail 不保证保留;VL=0 时目标保持不变。

常见问题

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

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

VMSBC.VXM 写什么结果?

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