VSM.V

RISC-V VSM.V 指令详解

指令手册V-type

把源掩码寄存器的 VL 个 bits 打包为 ceil(vl/8) 个连续字节,并从 x[rs1] 起写入内存。

指令语法

vsm.v vs3, (rs1)
操作数说明
vd:目标向量寄存器组。
vs2/vs1 或标量源:按指令后缀 .vv/.vx/.vi/.vf 决定来源。
vm:若语法包含 vm,vm=0 使用 v0 作为执行掩码,vm=1 为未掩码。
V向量访存掩码操作

指令行为说明

VSM.V 是 RISC-V V 扩展的 unit-stride mask store。它将源 mask register 的第 i 个 mask bit 放入 byte floor(i/8) 的 bit i mod 8,并存储 ceil(vl/8) 个 packed bytes。该指令存储掩码位,不按 SEW 存储普通向量元素。

VSM.V 指令解析与执行动画

从编码字段解析 packed mask 存储,再逐元素计算 x[rs1] + floor(i/8)。

输入的指令
vsm.v
执行环境:packed mask 字节数=ceil(VL/8)=2,mask bit i 位于 byte floor(i/8) 的 bit i mod 8;该形式固定未掩码执行,编码 vm=1。,LMUL=m1;这些不属于汇编语法操作数。
编码字段vsm.v / STORE-FP
31..29
nf
000
28
mew
0
27..26
mop
00
25
vm
1
24..20
sumop
01011
19..15
rs1
01010
14..12
width
000
11..7
vd/vs3
00000
6..0
opcode
0100111
地址与数据路径bytes=2, byte=floor(i/8), addr=0x8000+byte
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=12
i=13
i=14
i=15
byte.bit
b0.0
b0.1
b0.2
b0.3
b0.4
b0.5
b0.6
b0.7
b1.0
b1.1
b1.2
b1.3
b1.4
b1.5
b1.6
b1.7
addr
0x8000
0x8000
0x8000
0x8000
0x8000
0x8000
0x8000
0x8000
0x8001
0x8001
0x8001
0x8001
0x8001
0x8001
0x8001
0x8001
v0 bit
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
memory write
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
byte 0 @ 0x8000
0x7b
byte 1 @ 0x8001
0xef
步骤 1 / 22

显示向量内存指令编码

动画从 32 位向量内存指令编码开始,按官方位段显示 nf、mew、mop、vm、rs2/vs2 或 lumop/sumop、width、寄存器字段和 opcode。

快速理解与检索要点

VSM.V 把 mask register 压缩成内存字节流:VL=16 时只写 2 个字节,每个 lane 贡献一个 bit。

访问长度为 ceil(vl/8) 个连续字节,基址来自 x[rs1]。
源 mask bit i 写入第 floor(i/8) 个字节的 bit i mod 8。
编码使用向量 store 格式,mop=00、width=000、sumop=01011、vm=1。

向量执行上下文

阅读 VSM.V 时,不要只看助记符。官方 V 扩展语义还依赖当前 vl、vtype 和掩码状态。后缀和操作数形式决定源操作数来自向量、标量还是立即数。

先看 vl

当前 vl 决定 body 元素数量。典型代码会先执行 vsetvli、vsetivli 或 vsetvl,再执行本页指令。

再看 vtype

当前 vtype 提供 SEW、LMUL、tail policy 和 mask policy;这些规则影响元素宽度、寄存器组大小以及非活动/尾部目标元素。

最后看 vm/v0

带 vm 的普通向量指令在 vm=0 时用 v0 作为执行掩码,vm=1 表示未掩码。VMERGE 等少数形式会把 v0 当作数据选择输入。

官方来源:RISC-V V Standard Extension for Vector Operations

常见使用场景

保存 packed mask 数据

结合 «vsm.v v0, (a0) # store ceil(vl/8) packed mask bytes» 等实际代码理解该场景。

向量掩码保存/恢复

结合 «vsm.v v0, (a0) # store ceil(vl/8) packed mask bytes» 等实际代码理解该场景。

上下文切换中的掩码状态保存

结合 «vsm.v v0, (a0) # store ceil(vl/8) packed mask bytes» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认当前指令格式为 V-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

有效传输长度是 ceil(vl/8) 字节,与 SEW/LMUL 的普通数据元素宽度无关。
语法中的源寄存器是 vs3 mask register,不限于 v0。
VSM.V 是未掩码形式,编码 vm=1;没有普通 v0.t 执行掩码关闭单个 lane。

常见问题

VSM.V 和 VSE8.V 有什么区别?

VSM.V 存储 packed mask bits,长度为 ceil(vl/8) 字节;VSE8.V 存储 8-bit 数据元素。

VSM.V 只能存 v0 吗?

不是。语法源操作数是 vs3,可以是向量 mask register;v0 只是常见掩码寄存器。