首页/指令库/VLSE16-V
VLSE16.V

RISC-V VLSE16.V 指令详解

指令手册V-type

按 x[rs2] 字节跨步从 x[rs1] 装入 16 位向量元素到 vd。

指令语法

vlse16.v vd, (rs1), rs2, vm
操作数说明
语法 vlse16.v vd, (rs1), rs2[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。vd 是向量组,rs1 是整数基址,rs1=x0 时基址为 0。
固定数据 EEW=16,EMUL=(16/SEW)×LMUL 须在 1/8..8 内且组起点合法。rs2 选整数寄存器,x[rs2] 为有符号字节 stride,不按 2 缩放。
地址为 x[rs1]+i×x[rs2],允许负/零跨步,元素访问无序。rs2=x0 可少于每个活动元素一次访问;rs2≠x0 但值为 0 时须每个活动元素各访问一次。
要求 V/VS 已启用、合法 vtype。仅 vstart≤i<vl 且掩码开启的元素访问内存;masked vd 不能与 v0 重叠。prestart 保持不变,inactive/tail 按 vma/vta;不同 EEW 的合法重叠强制 ma/ta。VL=0 或 vstart≥vl 不更新目标;正常完成后 vstart=0,vl 不变。
V向量内存向量装载

指令行为说明

VLSE16.V 是 RISC-V V 扩展的 16 位跨步向量装载指令。活动 body 元素使用地址 x[rs1] 加 lane index 乘以 x[rs2];x[rs2] 是字节数 stride,可表示正、负或零跨步。vm=0 时由 v0.t 选择元素,被掩码关闭的元素不访问内存。

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

从编码字段解析 16 位跨步装载,再逐元素计算 x[rs1] + i * x[rs2] (16 bytes)。

输入的指令
vlse16.v
执行环境:EEW=16,stride=x[rs2]=16 字节,示例 SEW=16,LMUL=m1,vstart=0(非零时从该元素开始);这些不属于汇编语法操作数。

教学环境:XLEN=64,VLEN=4096,SEW=16,LMUL=m1,VLMAX=256,数据 EMUL=m1,合法 vtype,VS 已启用,vstart=0,ta/ma。假定所选访问均成功,未建模陷入;未对齐访问仅在环境支持时适用。rs1=x0 的基址固定为 0。memory elements 输入表示每次活动读取观察到的值,允许内存随访问变化,并非静态字节内存映像。rs2=x0 示例选择每个活动元素各读取一次的许可执行。逐元素步骤不表示处理器周期或实际访问顺序,跨步访问无序。inactive/tail 的“-”表示结果未显示,可保留旧值或写全 1;VL=0 不更新目标,正常完成后 vstart=0。

编码字段vlse16.v / LOAD-FP
31..29
nf
000
28
mew
0
27..26
mop
10
25
vm
0
24..20
rs2
00101
19..15
rs1
01010
14..12
width
101
11..7
vd/vs3
01000
6..0
opcode
0000111
地址与数据路径addr[i] = 0x8000 + i * 16
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
addr
0x8000
0x8010
0x8020
0x8030
0x8040
0x8050
0x8060
0x8070
0x8080
0x8090
0x80a0
0x80b0
0x80c0
0x80d0
0x80e0
0x80f0
mem
0x0011
0x0022
0x0033
0x0044
0x0055
0x0066
0x0077
0x0088
0x0099
0x00aa
0x00bb
0x00cc
0x00dd
0x00ee
0x00ff
0x0110
active
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
v8
...
...
-
...
...
...
...
-
...
...
...
...
-
...
...
...
步骤 1 / 22

显示向量内存指令编码

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

快速理解与检索要点

VLSE16.V 是 RVV 16 位跨步向量装载:每个活动元素的内存地址是 x[rs1] 加 lane index 乘以 x[rs2],其中 x[rs2] 是字节 stride。vl 和 v0.t 掩码决定哪些 body 元素参与内存访问。

指令名固定内存元素宽度 EEW=16;stride 来自整数寄存器 x[rs2],单位是字节,不按 EEW 隐式缩放。
跨步访问使用同一个标量 stride 生成地址序列;indexed gather/scatter 使用 vluxei/vloxei 或 vsuxei/vsoxei 等其他指令族。
x[rs2] 可以表示正、负或零 stride;当编码字段 rs2=x0 时,x0 恒为 0,官方允许实现对该 zero-stride 形式执行少于每个 active 元素一次的内存操作。
vm=0 时 v0.t 选择参与的 body 元素,vm=1 时所有 body 元素参与;被掩码关闭的元素不发起内存访问。
装载只更新活动目标元素;非活动和尾部目标元素按当前 vtype 的 mask/tail policy 处理。

向量执行上下文

语法 vlse16.v vd, (rs1), rs2[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。vd 是向量组,rs1 是整数基址,rs1=x0 时基址为 0。

固定数据 EEW=16,EMUL=(16/SEW)×LMUL 须在 1/8..8 内且组起点合法。rs2 选整数寄存器,x[rs2] 为有符号字节 stride,不按 2 缩放。

地址为 x[rs1]+i×x[rs2],允许负/零跨步,元素访问无序。rs2=x0 可少于每个活动元素一次访问;rs2≠x0 但值为 0 时须每个活动元素各访问一次。

要求 V/VS 已启用、合法 vtype。仅 vstart≤i<vl 且掩码开启的元素访问内存;masked vd 不能与 v0 重叠。prestart 保持不变,inactive/tail 按 vma/vta;不同 EEW 的合法重叠强制 ma/ta。VL=0 或 vstart≥vl 不更新目标;正常完成后 vstart=0,vl 不变。

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

常见使用场景

结构体字段访问

假定 V/VS 已启用、所需数据/索引宽度受支持、VLEN≥128、x10=0x8000、x11=4,内存访问均成功;vsetvli 后 vl=4、vstart=0、ta/ma。e16,m1; x5=8; v0.mask=[1,0,1,1]; addresses=[0x8000,0x8008,0x8010,0x8018]; active reads (i=0,2,3)=[10,30,40] → v8=[10,agnostic,30,40]。被关闭的元素不读取内存;agnostic 可保留旧值或写全 1,tail 不保证清零。

矩阵列或行跨距访问

假定 V/VS 已启用、所需数据/索引宽度受支持、VLEN≥128、x10=0x8000、x11=4,内存访问均成功;vsetvli 后 vl=4、vstart=0、ta/ma。e16,m1; x5=8; v0.mask=[1,0,1,1]; addresses=[0x8000,0x8008,0x8010,0x8018]; active reads (i=0,2,3)=[10,30,40] → v8=[10,agnostic,30,40]。被关闭的元素不读取内存;agnostic 可保留旧值或写全 1,tail 不保证清零。

非连续向量读取

假定 V/VS 已启用、所需数据/索引宽度受支持、VLEN≥128、x10=0x8000、x11=4,内存访问均成功;vsetvli 后 vl=4、vstart=0、ta/ma。e16,m1; x5=8; v0.mask=[1,0,1,1]; addresses=[0x8000,0x8008,0x8010,0x8018]; active reads (i=0,2,3)=[10,30,40] → v8=[10,agnostic,30,40]。被关闭的元素不读取内存;agnostic 可保留旧值或写全 1,tail 不保证清零。

使用前检查清单

语法检查
  • 语法 vlse16.v vd, (rs1), rs2[, v0.t];省略 v0.t 为 vm=1,给出为 vm=0。vd 是向量组,rs1 是整数基址,rs1=x0 时基址为 0。
  • 固定数据 EEW=16,EMUL=(16/SEW)×LMUL 须在 1/8..8 内且组起点合法。rs2 选整数寄存器,x[rs2] 为有符号字节 stride,不按 2 缩放。
语义检查
  • 地址为 x[rs1]+i×x[rs2],允许负/零跨步,元素访问无序。rs2=x0 可少于每个活动元素一次访问;rs2≠x0 但值为 0 时须每个活动元素各访问一次。
  • 要求 V/VS 已启用、合法 vtype。仅 vstart≤i<vl 且掩码开启的元素访问内存;masked vd 不能与 v0 重叠。prestart 保持不变,inactive/tail 按 vma/vta;不同 EEW 的合法重叠强制 ma/ta。VL=0 或 vstart≥vl 不更新目标;正常完成后 vstart=0,vl 不变。

容易混淆 / 常见误区

指令名中的 16 是内存元素宽度 EEW;地址增量来自 x[rs2] 字节,不会再按 2 自动缩放。
跨步可以为正、负或零;rs2=x0 是官方 zero-stride 编码形式,x0 恒为 0,且实现可对该形式执行少于每个 active 元素一次的内存操作。
被掩码关闭的元素不发起内存读取,目标元素按当前 mask policy 处理。
不要依赖元素访问顺序来表达有副作用内存或重叠地址的程序语义。
未自然对齐的 16 位向量元素访问可以成功传输或在该元素产生地址未对齐异常;向量与标量对未对齐访问的支持相互独立。

常见问题

VLSE16.V 的 stride 单位是什么?

stride 是 x[rs2] 中的字节数。它不是元素个数,也不会按 EEW 再隐式乘一次;若编码为 rs2=x0,则 x0 恒为 0。

VLSE16.V 和单位步长 VLE16.V 有什么区别?

单位步长按连续 2 字节访问;VLSE16.V 使用 x[rs2] 给出的字节 stride,因此可以访问结构体字段、矩阵列或反向序列。

VLSE16.V 的 rs2=x0 和 x[rs2]=0 有区别吗?

有。rs2=x0 是编码字段直接选择 x0 的 zero-stride 形式;官方允许实现对该形式执行少于每个 active 元素一次的内存操作。rs2 不是 x0 但寄存器值为 0 时,仍按普通跨步访问语义处理。

被 v0.t 关闭的元素会访问内存吗?

不会。vm=0 且对应 v0.t 位为 0 的 body 元素不会执行该元素的装载读取内存访问。