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

RISC-V VMSBC.VX 指令详解

指令手册OPIVX

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

指令语法

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

指令行为说明

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

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

从 OP-V 编码字段开始,展示无 m 的 VMSBC 如何以 vm=1 处理所有 body 元素,不读取 borrow-in,并写逐元素借位掩码。

输入的指令
vmsbc.vx
vm
1
固定未掩码编码,不是语法操作数

要求合法 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 的实现;同名向量源必须具有相同元素。VMSBC.VX 固定 vm=1,无 v0 borrow-in;若 v0 被指定为 SEW 数据源,仍读取其数据。每个 body 元素产生一个目标 mask bit。

OP-V encodingvmsbc.vx
funct6
010011
vm
1
vs2
01000
rs1
01011
funct3
100
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
-
-
-
-
-
-
-
-
x11
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
0x0013
active
1
1
1
1
1
1
1
1
v4.mask
...
...
...
...
...
...
...
...
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

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

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

向量执行上下文

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

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

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

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

需 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,源已初始化;示例未掩码。v2=[0,7,0xffffffff,4], x11=7 → v1.mask[0..3]=[1,0,0,1]。只写 mask bit,tail 始终 agnostic,不假定清零。

大整数运算

假定 RV32/RV64 V 1.0、VS 已启用、合法 e32,m1、VLEN≥128、vl=4、vstart=0,源已初始化;示例未掩码。v2=[0,7,0xffffffff,4], x11=7 → v1.mask[0..3]=[1,0,0,1]。只写 mask bit,tail 始终 agnostic,不假定清零。

使用前检查清单

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

容易混淆 / 常见误区

借位看截断前的无符号差值是否为负,不是截断后结果的符号位。
无 m 后缀形式固定 vm=1,不读取 v0 借位输入。
目标是每元素一位的掩码,tail 不保证保留;VL=0 时目标保持不变。

常见问题

VMSBC.VX 会写出加法/减法结果吗?

不会。它只写借位掩码位;整数差值由 VSBC 等数据指令产生。