VLM.V

RISC-V VLM.V 指令详解

指令手册V-type

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

指令语法

vlm.v vd, (rs1)
操作数说明
vd:目标向量寄存器组。
vs2/vs1 或标量源:按指令后缀 .vv/.vx/.vi/.vf 决定来源。
vm:若语法包含 vm,vm=0 使用 v0 作为执行掩码,vm=1 为未掩码。
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。,LMUL=m1;这些不属于汇编语法操作数。
编码字段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。

向量执行上下文

阅读 VLM.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 数据

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

向量掩码保存/恢复

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

上下文切换中的掩码状态恢复

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

使用前检查清单

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

容易混淆 / 常见误区

有效传输长度是 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 需要向上取整到完整字节数。