VLM.V

RISC-V VLM.V 指令详解

指令手册V-type

从 x[rs1] 起连续装入 ceil(vl/8) 个字节,并把这些 packed bits 写入目标掩码寄存器。

指令语法

vlm.v vd, (rs1)
操作数说明
语法 vlm.v vd, (rs1),没有 v0.t 执行掩码;vm=1。32 位 LOAD-FP:opcode=0000111、nf=000、mew=0、mop=00、width=000、lumop=01011。
vd 是任意单个 v0–v31,固定 EEW=8、EMUL=1。基址来自 x[rs1],x0 恒为 0;从该地址读取 ceil(vl/8) 个连续字节,包括完整的最后一个字节。
mask bit i 对应 byte floor(i/8) 的 bit i mod 8。字节传输范围外的 tail 强制 tail-agnostic,与 vta 无关;不保证清零。
需要 V/VS 已启用、合法 vtype;仍遵守 vill 和 vtype 对 vl 的约束。vstart 以字节计,先前字节保持不变;vstart≥ceil(vl/8) 或 vl=0 不更新目标。正常完成后 vstart=0。
V向量访存掩码操作

指令行为说明

VLM.V 是 RISC-V V 扩展的 unit-stride mask load。它按字节读取紧凑掩码表示,访问字节数为 ceil(vl/8),第 i 个 mask bit 来自 byte floor(i/8) 的 bit i mod 8。该指令装载掩码位,不按当前 SEW 装载普通向量数据元素。

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

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

输入的指令
vlm.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 定义的访问异常或陷入结果不在此示例中建模。

教学环境:VLEN=4096,SEW=8,LMUL=m1,VLMAX=512,合法 vtype、VS 已启用、vstart=0,无访问异常。固定 EEW=8、EMUL=1;rs1=x0 时基址为 0。VL=0 不更新目标;否则完整装入 ceil(VL/8) 字节(包括最后一个字节的所有位),字节传输范围外的 tail 按 tail-agnostic 处理,不保证清零。逐 bit 步骤只解释映射,不表示实际访问顺序或处理器周期。

编码字段vlm.v / LOAD-FP
31..29
nf
000
28
mew
0
27..26
mop
00
25
vm
1
24..20
lumop
01011
19..15
rs1
01010
14..12
width
000
11..7
vd/vs3
00000
6..0
opcode
0000111
地址与数据路径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
mem bit
1
1
0
0
0
0
0
0
0
1
1
0
0
0
0
0
v0
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
byte 0 @ 0x8000
0x03
byte 1 @ 0x8001
0x06
步骤 1 / 22

显示向量内存指令编码

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

快速理解与检索要点

VLM.V 把内存中的紧凑位图还原成 mask register:VL=16 时只读 2 个字节,每个 lane 取一个 bit。

访问长度为 ceil(vl/8) 个连续字节,基址来自 x[rs1]。
mask bit i 来自第 floor(i/8) 个字节的 bit i mod 8。
编码使用向量 load 格式,mop=00、width=000、lumop=01011、vm=1。
传输前需要 V/VS 已启用、合法 vtype(vill=0)和合适的 vl;该形式仍依赖 vtype 对 vl 的约束。vstart 以字节为单位;正常完成后复位为 0。
固定 EEW=8、EMUL=1;目标为任意单个 v0–v31。完整传输 ceil(vl/8) 字节,最后一个字节也整体装入;字节传输范围之外的目标 tail 按 tail-agnostic 处理,与 vta 无关。vl=0 不更新目标。

向量执行上下文

语法 vlm.v vd, (rs1),没有 v0.t 执行掩码;vm=1。32 位 LOAD-FP:opcode=0000111、nf=000、mew=0、mop=00、width=000、lumop=01011。

vd 是任意单个 v0–v31,固定 EEW=8、EMUL=1。基址来自 x[rs1],x0 恒为 0;从该地址读取 ceil(vl/8) 个连续字节,包括完整的最后一个字节。

mask bit i 对应 byte floor(i/8) 的 bit i mod 8。字节传输范围外的 tail 强制 tail-agnostic,与 vta 无关;不保证清零。

需要 V/VS 已启用、合法 vtype;仍遵守 vill 和 vtype 对 vl 的约束。vstart 以字节计,先前字节保持不变;vstart≥ceil(vl/8) 或 vl=0 不更新目标。正常完成后 vstart=0。

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

常见使用场景

恢复 packed mask 数据

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=9、vstart=0、a0=0x8000,内存可读,两个字节为 [0x81,0x03]。VLM.V 读取 ceil(9/8)=2 字节并整体写入 v0:mask bits 0、7、8、9 为 1,其他已载入位为 0;bit 9 超出 vl 但仍属于实际装入的最后字节。字节范围之外 tail-agnostic,不保证清零。

向量掩码保存/恢复

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=9、vstart=0、a0=0x8000,内存可读,两个字节为 [0x81,0x03]。VLM.V 读取 ceil(9/8)=2 字节并整体写入 v0:mask bits 0、7、8、9 为 1,其他已载入位为 0;bit 9 超出 vl 但仍属于实际装入的最后字节。字节范围之外 tail-agnostic,不保证清零。

掩码 spill/fill

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=9、vstart=0、a0=0x8000,内存可读,两个字节为 [0x81,0x03]。VLM.V 读取 ceil(9/8)=2 字节并整体写入 v0:mask bits 0、7、8、9 为 1,其他已载入位为 0;bit 9 超出 vl 但仍属于实际装入的最后字节。字节范围之外 tail-agnostic,不保证清零。

使用前检查清单

语法检查
  • 语法 vlm.v vd, (rs1),没有 v0.t 执行掩码;vm=1。32 位 LOAD-FP:opcode=0000111、nf=000、mew=0、mop=00、width=000、lumop=01011。
  • vd 是任意单个 v0–v31,固定 EEW=8、EMUL=1。基址来自 x[rs1],x0 恒为 0;从该地址读取 ceil(vl/8) 个连续字节,包括完整的最后一个字节。
语义检查
  • mask bit i 对应 byte floor(i/8) 的 bit i mod 8。字节传输范围外的 tail 强制 tail-agnostic,与 vta 无关;不保证清零。
  • 需要 V/VS 已启用、合法 vtype;仍遵守 vill 和 vtype 对 vl 的约束。vstart 以字节计,先前字节保持不变;vstart≥ceil(vl/8) 或 vl=0 不更新目标。正常完成后 vstart=0。

容易混淆 / 常见误区

有效传输长度是 ceil(vl/8) 字节,不是 VLEN 字节,也不是 vl 个 SEW 元素。
第 i 个 mask bit 映射到 byte floor(i/8) 的 bit i mod 8;不要把 packed byte 顺序理解成元素宽度访问。
VLM.V 是未掩码形式,编码 vm=1;它没有普通 v0.t 执行掩码。

常见问题

VLM.V 会装载 SEW 宽元素吗?

不会。它装载 packed mask bytes,并把每一位映射到一个 mask element。

VLM.V 的访问长度为什么是 ceil(vl/8)?

因为每个 mask element 只占 1 bit,VL 个 mask bits 需要向上取整到完整字节数。