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

RISC-V VSUXEI16.V 指令详解

指令手册V-type

以 x[rs1] 为基址,使用 vs2 中 16 位无符号字节偏移把 vs3 活动元素执行无序 indexed store。

指令语法

vsuxei16.v vs3, (rs1), vs2, vm
操作数说明
vs3 是数据源(EEW=SEW、EMUL=LMUL),vs2 是 16 位无符号字节偏移;索引 EMUL=(16/SEW)×LMUL 须在1/8..8。组起点须合法对齐,不同 EEW 的源不可读取同一寄存器。
32 位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=01、width=101;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vs3 在 bits11:7。
活动元素地址=x[rs1]+zero_extend(vs2[i]),不按数据宽度缩放;x0 基址为0。无序访问不保证元素顺序,重复/重叠地址无确定最终值;源不变。未对齐访问可成功或异常,其他活动访问也可能陷入。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW/索引 EEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素访问内存;inactive/tail 无访问。vstart≥vl(含 vl=0)无访问;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。
V向量内存索引向量存储

指令行为说明

VSUXEI16.V 是 RISC-V V 扩展的无序索引向量存储指令。每个活动元素使用 x[rs1] + zero_extend(vs2[i]) 形成地址,并把 vs3[i] 的当前 SEW 位数据写入该地址;ei16 只规定索引 EEW=16。无序形式不保证 store 按元素编号顺序被观察。vm=0 时 v0.t 关闭的元素不写内存。

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

从编码字段解析 16 位索引存储,再逐元素计算 x[rs1] + zero_extend(vs2[i])。

输入的指令
vsuxei16.v
执行环境
执行环境:索引 EEW=16,数据 SEW=32,索引 EEW=16 小于 XLEN=64,所以先零扩展再相加,unordered indexed 访问不保证元素顺序,LMUL=m1,vstart=0(非零时从该元素开始);这些不属于汇编语法操作数。

教学环境:V 1.0、向量状态已启用、合法且受支持 vtype/SEW/索引EEW;固定 VLEN=4096、LMUL=m1、vstart=0,VLMAX=4096/32,索引 EMUL=0.5。索引组须对齐且不越过v31;同一寄存器不能作为不同EEW的源,v0.t 时源组不能读取v0数据。相同EEW的同名vs3/vs2须有相同元素。x0基址为0。假定所有活动访问成功,未对齐访问要求环境支持;地址显示限制0..0xffffffff并非ISA限制。只显示逐元素存储事件(非最终字节内存映像);重复/重叠地址后续存储可能覆盖先前数据。无序存储不保证元素访问顺序或重叠地址的最终值;步骤也不代表实际访问顺序。步骤不是处理器周期。inactive/tail不访问内存,VL=0无访问;源寄存器不变,正常完成后vstart=0。

编码字段vsuxei16.v / STORE-FP
31..29
nf
000
28
mew
0
27..26
mop
01
25
vm
0
24..20
vs2
00100
19..15
rs1
01010
14..12
width
101
11..7
vd/vs3
01100
6..0
opcode
0100111
地址与数据路径addr[i] = 0x8000 + zero_extend(vs2[i])
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
vs2 byte offset
0x0001
0x0004
0x0007
0x000a
0x000d
0x0010
0x0013
0x0016
0x0019
0x001c
0x001f
0x0022
0x0025
0x0028
0x002b
0x002e
addr
0x8001
0x8004
0x8007
0x800a
0x800d
0x8010
0x8013
0x8016
0x8019
0x801c
0x801f
0x8022
0x8025
0x8028
0x802b
0x802e
v12
0x00000101
0x00000202
0x00000303
0x00000404
0x00000505
0x00000606
0x00000707
0x00000808
0x00000909
0x00000a0a
0x00000b0b
0x00000c0c
0x00000d0d
0x00000e0e
0x00000f0f
0x00001010
active
1
1
0
1
1
1
1
0
1
1
1
1
0
1
1
1
memory write
...
...
-
...
...
...
...
-
...
...
...
...
-
...
...
...
步骤 1 / 22

显示向量内存指令编码

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

快速理解与检索要点

VSUXEI16.V 是无序索引 RVV 存储指令,内存写入只发生在活动且未被掩码关闭的元素上。

32 位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=01、width=101。vm=0 使用 v0.t,省略为 vm=1;vs3 是存储数据源。
ei16 只规定索引 EEW=16;数据 EEW=SEW、EMUL=LMUL,索引 EMUL=(16/SEW)×LMUL 须在 1/8..8 且组起点对齐。不同 EEW 源不能读同一寄存器;v0 不可同时提供掩码和数据。
活动地址=x[rs1]+zero_extend(vs2[i]),索引为不缩放的无符号字节偏移。无序访问不保证元素顺序;重复/重叠地址不保证最终值。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/索引 EEW。仅掩码允许的 vstart≤i<vl 元素访问内存;inactive/tail、vstart≥vl(含 vl=0)均无访问。
活动访问可陷入;未对齐访问可成功或产生地址未对齐异常。源寄存器不变,正常完成后 vstart=0;x0 基址为0。

向量执行上下文

vs3 是数据源(EEW=SEW、EMUL=LMUL),vs2 是 16 位无符号字节偏移;索引 EMUL=(16/SEW)×LMUL 须在1/8..8。组起点须合法对齐,不同 EEW 的源不可读取同一寄存器。

32 位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=01、width=101;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vs3 在 bits11:7。

活动元素地址=x[rs1]+zero_extend(vs2[i]),不按数据宽度缩放;x0 基址为0。无序访问不保证元素顺序,重复/重叠地址无确定最终值;源不变。未对齐访问可成功或异常,其他活动访问也可能陷入。

要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW/索引 EEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素访问内存;inactive/tail 无访问。vstart≥vl(含 vl=0)无访问;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。

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

常见使用场景

稀疏数据写入

假定 V/VS 已启用、合法 m1,tu,mu、VLEN=4096、vl=4、vstart=0,v0.mask[0..3]=1101;SEW=32, x10=0x8000, v8=[10,20,30,40], vs2=v4 (EEW=16)=[12,0,8,4]。lane0: [0x800c]=10; lane1: [0x8000]=20; lane3: [0x8004]=40。假定所选地址可写且访问成功;lane2不访问内存,事件列表不表示实际访问顺序,源不变。正常完成后vstart=0。

无顺序要求的 scatter 访问

假定 V/VS 已启用、合法 m1,tu,mu、VLEN=4096、vl=4、vstart=0,v0.mask[0..3]=1101;SEW=32, x10=0x8000, v8=[10,20,30,40], vs2=v4 (EEW=16)=[12,0,8,4]。lane0: [0x800c]=10; lane1: [0x8000]=20; lane3: [0x8004]=40。假定所选地址可写且访问成功;lane2不访问内存,事件列表不表示实际访问顺序,源不变。正常完成后vstart=0。

间接数组存储

假定 V/VS 已启用、合法 m1,tu,mu、VLEN=4096、vl=4、vstart=0,v0.mask[0..3]=1101;SEW=32, x10=0x8000, v8=[10,20,30,40], vs2=v4 (EEW=16)=[12,0,8,4]。lane0: [0x800c]=10; lane1: [0x8000]=20; lane3: [0x8004]=40。假定所选地址可写且访问成功;lane2不访问内存,事件列表不表示实际访问顺序,源不变。正常完成后vstart=0。

使用前检查清单

语法检查
  • vs3 是数据源(EEW=SEW、EMUL=LMUL),vs2 是 16 位无符号字节偏移;索引 EMUL=(16/SEW)×LMUL 须在1/8..8。组起点须合法对齐,不同 EEW 的源不可读取同一寄存器。
  • 32 位 STORE-FP:opcode=0100111、nf=000、mew=0、mop=01、width=101;vm 在 bit25,vs2 在 bits24:20,rs1 在 bits19:15,vs3 在 bits11:7。
语义检查
  • 活动元素地址=x[rs1]+zero_extend(vs2[i]),不按数据宽度缩放;x0 基址为0。无序访问不保证元素顺序,重复/重叠地址无确定最终值;源不变。未对齐访问可成功或异常,其他活动访问也可能陷入。
  • 要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW/索引 EEW。v0.t 为 vm=0,省略为 vm=1;仅掩码允许的 vstart≤i<vl 元素访问内存;inactive/tail 无访问。vstart≥vl(含 vl=0)无访问;v0 不可同时提供 EEW=1 掩码和数据。正常完成后 vstart=0。

容易混淆 / 常见误区

ei16 表示索引 EEW=16,不是被存储数据的 SEW;数据元素宽度仍来自当前 vtype。
vs2[i] 是无符号字节偏移;地址是 x[rs1] + zero_extend(vs2[i]),不是 x[rs1] + i * EEW,也不是元素编号。
无序 indexed store 不保证元素访问顺序;如果地址空间需要元素顺序,应使用 ordered indexed 形式。
vm=0 时 v0.t 关闭的元素不执行内存写入,也不应在动画或示例中当作写 0。

常见问题

ei16 是存储数据的位宽吗?

不是。索引是 16 位无符号字节偏移;存储数据宽度来自当前 SEW。

重复或重叠地址有确定的最终值吗?

没有。无序索引存储不保证元素访问顺序,不能依赖元素编号较大的写入最后发生。