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

RISC-V VSSE16.V 指令详解

指令手册V-type

把 vs3 的 16 位向量元素按 x[rs2] 字节跨步存到 x[rs1] 地址序列。

指令语法

vsse16.v vs3, (rs1), rs2, vm
操作数说明
vs3提供存储数据,rs1提供基址,rs2提供字节stride;x0恒为0。EEW=16固定,EMUL=(EEW/SEW)×LMUL须在1/8..8,组起点对齐;不是要求SEW必须等于EEW。
32位STORE-FP:opcode=0100111,nf=000、mew=0、mop=10、width=101;vm在bit25、rs2在bits24:20、rs1在bits19:15、vs3在bits11:7。vm=0使用v0.t,省略为vm=1。
活动元素地址=x[rs1]+i×x[rs2],stride不按EEW缩放,支持正、负、零值。rs2=x0允许少于每个活动元素一次访问;非x0寄存器值为0时,每个活动元素仍须一次访问。所有跨步元素访问无序,不保证重叠地址最终值。
要求V 1.0、已启用向量状态、vill=0和受支持vtype/EEW。v0不能同时作为EEW=1掩码和数据源。仅vstart≤i<vl且掩码允许的元素访问内存;inactive/tail无访问,vstart≥vl(含vl=0)无访问。未对齐访问可成功或异常,活动访问仍可能陷入。源寄存器不变;正常完成后vstart=0。
V向量内存向量存储

指令行为说明

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

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

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

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

教学环境:V 1.0、向量状态已启用、合法受支持 vtype;固定 XLEN=64、VLEN=4096、SEW=EEW=16、LMUL=EMUL=m1、vstart=0,VLMAX=256。rs1=x0 时基址为0;同名 rs1/rs2 必须具有相同值。v0 提供 EEW=1 掩码时不能同时作数据源。假定活动写入均成功;未对齐访问要求环境支持,未建模陷入。只显示逐元素存储事件,不表示最终字节内存映像;访问无序,重叠地址不保证最终值。rs2=x0 只展示候选访问,允许合并;非x0零stride仍要求每个活动元素一次访问。VL=0、inactive和tail不访问内存;源寄存器不变,正常完成后vstart=0。步骤是教学分解,不是处理器周期。

编码字段vsse16.v / STORE-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
0100111
地址与数据路径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
v8
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
memory write
...
...
-
...
...
...
...
-
...
...
...
...
-
...
...
...
步骤 1 / 22

显示向量内存指令编码

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

快速理解与检索要点

VSSE16.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 元素参与;被掩码关闭的元素不发起内存访问。
存储只对活动元素产生内存写;非活动和尾部元素不产生该元素的存储访问。

向量执行上下文

vs3提供存储数据,rs1提供基址,rs2提供字节stride;x0恒为0。EEW=16固定,EMUL=(EEW/SEW)×LMUL须在1/8..8,组起点对齐;不是要求SEW必须等于EEW。

32位STORE-FP:opcode=0100111,nf=000、mew=0、mop=10、width=101;vm在bit25、rs2在bits24:20、rs1在bits19:15、vs3在bits11:7。vm=0使用v0.t,省略为vm=1。

活动元素地址=x[rs1]+i×x[rs2],stride不按EEW缩放,支持正、负、零值。rs2=x0允许少于每个活动元素一次访问;非x0寄存器值为0时,每个活动元素仍须一次访问。所有跨步元素访问无序,不保证重叠地址最终值。

要求V 1.0、已启用向量状态、vill=0和受支持vtype/EEW。v0不能同时作为EEW=1掩码和数据源。仅vstart≤i<vl且掩码允许的元素访问内存;inactive/tail无访问,vstart≥vl(含vl=0)无访问。未对齐访问可成功或异常,活动访问仍可能陷入。源寄存器不变;正常完成后vstart=0。

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

常见使用场景

结构体字段访问

假定V/VS已启用、合法e16,m1,ta,ma、VLEN=4096、XLEN=64、a0=0x8000、a2=4、v8=[10,20,30,40]、v0.mask[0..3]=1011,内存可写且访问成功。示例vsetvli后vl=4、vstart=0,li设置t0=8字节;活动元素0、2、3分别写入[0x8000,0x8010,0x8018]=[10,30,40]。元素1和tail不访问内存;源不变。地址列表不表示实际访问顺序;正常完成后vstart=0。

矩阵列或行跨距访问

假定V/VS已启用、合法e16,m1,ta,ma、VLEN=4096、XLEN=64、a0=0x8000、a2=4、v8=[10,20,30,40]、v0.mask[0..3]=1011,内存可写且访问成功。示例vsetvli后vl=4、vstart=0,li设置t0=8字节;活动元素0、2、3分别写入[0x8000,0x8010,0x8018]=[10,30,40]。元素1和tail不访问内存;源不变。地址列表不表示实际访问顺序;正常完成后vstart=0。

非连续向量写回

假定V/VS已启用、合法e16,m1,ta,ma、VLEN=4096、XLEN=64、a0=0x8000、a2=4、v8=[10,20,30,40]、v0.mask[0..3]=1011,内存可写且访问成功。示例vsetvli后vl=4、vstart=0,li设置t0=8字节;活动元素0、2、3分别写入[0x8000,0x8010,0x8018]=[10,30,40]。元素1和tail不访问内存;源不变。地址列表不表示实际访问顺序;正常完成后vstart=0。

使用前检查清单

语法检查
  • vs3提供存储数据,rs1提供基址,rs2提供字节stride;x0恒为0。EEW=16固定,EMUL=(EEW/SEW)×LMUL须在1/8..8,组起点对齐;不是要求SEW必须等于EEW。
  • 32位STORE-FP:opcode=0100111,nf=000、mew=0、mop=10、width=101;vm在bit25、rs2在bits24:20、rs1在bits19:15、vs3在bits11:7。vm=0使用v0.t,省略为vm=1。
语义检查
  • 活动元素地址=x[rs1]+i×x[rs2],stride不按EEW缩放,支持正、负、零值。rs2=x0允许少于每个活动元素一次访问;非x0寄存器值为0时,每个活动元素仍须一次访问。所有跨步元素访问无序,不保证重叠地址最终值。
  • 要求V 1.0、已启用向量状态、vill=0和受支持vtype/EEW。v0不能同时作为EEW=1掩码和数据源。仅vstart≤i<vl且掩码允许的元素访问内存;inactive/tail无访问,vstart≥vl(含vl=0)无访问。未对齐访问可成功或异常,活动访问仍可能陷入。源寄存器不变;正常完成后vstart=0。

容易混淆 / 常见误区

指令名中的 16 是内存元素宽度 EEW;地址增量来自 x[rs2] 字节,不会再按 2 自动缩放。
跨步可以为正、负或零;rs2=x0 是官方 zero-stride 编码形式,x0 恒为 0,且实现可对该形式执行少于每个 active 元素一次的内存操作。
被掩码关闭的元素不发起内存写入,也不会因为该元素产生内存异常。
不要依赖元素访问顺序来表达有副作用内存或重叠地址的程序语义。

常见问题

VSSE16.V 的 stride 单位是什么?

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

VSSE16.V 和单位步长 VSE16.V 有什么区别?

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

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

有。rs2=x0 时,允许实现执行少于活动元素数量的内存操作;rs2 不是 x0 但 x[rs2]=0 时,每个活动元素仍须执行一次访问。两种形式均不保证元素访问顺序。

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

不会。vm=0 且对应 v0.t 位为 0 的 body 元素不会执行该元素的存储写入内存访问。