VSM.V

RISC-V VSM.V 指令详解

指令手册Vector Store

从 x[rs1] 起存储源寄存器的 ceil(vl/8) 个完整字节。

指令语法

vsm.v vs3, (rs1)
操作数说明
vs3 是单个源向量寄存器(v0–v31);rs1 是整数基址寄存器,x0 提供地址0。
32位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=00、vm=1、sumop=01011、width=000;vs3 在 bits11:7,rs1 在 bits19:15。无 v0.t 操作数。
EEW=8、EMUL=1,evl=ceil(vl/8)。从字节 vstart 起存储完整源字节;源位 i 对应地址 x[rs1]+floor(i/8) 的 bit i mod 8,末字节中 i≥vl 的源位也会写入。
vstart 以字节计;vstart≥evl(含vl=0)不访问内存。单位步长不保证各字节访问顺序;访问可能陷入。示例假设vstart=0、内存可写,源寄存器不变。
要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。
V向量访存掩码操作

指令行为说明

VSM.V 是未掩码的单位步长 mask store,EEW=8、EMUL=1。源位 i 对应字节 floor(i/8) 的位 i mod 8;末字节中索引≥vl 的源位也会被存储,不自动清零。

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,动画固定 vstart=0(掩码 load/store 的 vstart 单位是字节)。,LMUL=m1;这些不属于汇编语法操作数。
教学范围:此动画仅展示 vstart=0 的无异常 packed mask 传输。掩码 load/store 的 vstart 以字节计;EEI 定义的访问异常或陷入结果不在此示例中建模。

教学环境:V 1.0、VS已启用、合法vtype,VLEN=4096、SEW=8、LMUL=m1、vstart=0,无访问异常。EEW=8、EMUL=1,vm=1;rs1=x0 时基址为0。VL=0 不访问内存;否则存储完整 ceil(VL/8) 字节,末字节中的所有源位也会写入。逐bit步骤仅解释映射,不表示访问顺序或处理器周期。

编码字段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。

快速理解与检索要点

VL=9、vstart=0 时写 2 个完整字节,即源寄存器的位 0..15;源寄存器本身不变。

访问长度为 ceil(vl/8) 个连续字节,基址来自 x[rs1]。
源 mask bit i 写入第 floor(i/8) 个字节的 bit i mod 8。
编码使用向量 store 格式,mop=00、width=000、sumop=01011、vm=1。
依赖合法 vtype(vill=0)对 vl 的约束;VL=0 不访问内存,正常完成后 vstart=0。

向量执行上下文

vs3 是单个源向量寄存器(v0–v31);rs1 是整数基址寄存器,x0 提供地址0。

32位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=00、vm=1、sumop=01011、width=000;vs3 在 bits11:7,rs1 在 bits19:15。无 v0.t 操作数。

EEW=8、EMUL=1,evl=ceil(vl/8)。从字节 vstart 起存储完整源字节;源位 i 对应地址 x[rs1]+floor(i/8) 的 bit i mod 8,末字节中 i≥vl 的源位也会写入。

vstart 以字节计;vstart≥evl(含vl=0)不访问内存。单位步长不保证各字节访问顺序;访问可能陷入。示例假设vstart=0、内存可写,源寄存器不变。

要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。

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

常见使用场景

保存 packed mask 数据

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且内存写入成功。VL=9, v0 bits[0..15]=1000000000000001, a0=0x8000 → [0x8000]=0x01, [0x8001]=0x80。按索引递增书写bit串;完整末字节包含VL之外的源位。

向量掩码保存/恢复

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且内存写入成功。VL=9, v0 bits[0..15]=1000000000000001, a0=0x8000 → [0x8000]=0x01, [0x8001]=0x80。按索引递增书写bit串;完整末字节包含VL之外的源位。

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

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且内存写入成功。VL=9, v0 bits[0..15]=1000000000000001, a0=0x8000 → [0x8000]=0x01, [0x8001]=0x80。按索引递增书写bit串;完整末字节包含VL之外的源位。

使用前检查清单

语法检查
  • vs3 是单个源向量寄存器(v0–v31);rs1 是整数基址寄存器,x0 提供地址0。
  • 32位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=00、vm=1、sumop=01011、width=000;vs3 在 bits11:7,rs1 在 bits19:15。无 v0.t 操作数。
语义检查
  • EEW=8、EMUL=1,evl=ceil(vl/8)。从字节 vstart 起存储完整源字节;源位 i 对应地址 x[rs1]+floor(i/8) 的 bit i mod 8,末字节中 i≥vl 的源位也会写入。
  • vstart 以字节计;vstart≥evl(含vl=0)不访问内存。单位步长不保证各字节访问顺序;访问可能陷入。示例假设vstart=0、内存可写,源寄存器不变。
  • 要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。

容易混淆 / 常见误区

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

常见问题

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

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

VSM.V 只能存 v0 吗?

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