VSLL.VV

RISC-V VSLL.VV 指令详解

指令手册OPIVV

逐元素逻辑左移。

指令语法

vsll.vv vd, vs2, vs1, vm
操作数说明
vd/vs2 是 SEW/LMUL 向量组;vs1 提供逐元素移位量;同名源必须读取相同初值。
32位 OP-V:opcode=1010111、funct6=100101、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。
活动 vd[i]=(vs2[i]<<shamt) mod 2^SEW;shamt 仅取低 log2(SEW) 位。低位补0,不舍入、不饱和。同宽源/目标可重叠;masked vd 不可包含 v0,v0 不可同时提供 EEW=1 掩码与 SEW 数据。
可选 v0.t 对应vm=0,省略为vm=1。仅 vstart≤i<vl 且掩码允许的元素计算;prestart不变,inactive/tail分别按vma/vta处理。vstart≥vl(含vl=0)不更新任何目标。示例假设SEW=16、LMUL=m1、vl=8、vstart=0,源和掩码已初始化。
要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。
V向量运算

指令行为说明

VSLL.VV 对活动元素计算 vd[i]=(vs2[i]<<shamt) mod 2^SEW,shamt 取 vs1[i] 的低 log2(SEW) 位。vm=0 时由 v0.t 选择 body 元素;inactive/tail 分别按 vma/vta 处理。

VSLL.VV 指令解析与执行动画

从 OP-V 编码字段开始,展示 VSLL 如何取移位量低位、对活动元素逻辑左移,并写回低 SEW 位结果。

输入的指令
vsll.vv

教学环境:V 1.0、向量状态已启用、合法受支持 vtype/SEW,LMUL=m1、VLEN=4096、vstart=0,VLMAX=4096/16。同宽源/目标可重叠;同名源须有相同元素。v0.t 时 vd/vs2/vs1 不可为 v0。只取移位量低 log2(SEW) 位,结果保留低 SEW 位;inactive/tail 不显示确定值。VL=0 不更新目标;步骤不是处理器周期。

执行环境
移位量规则:只使用 对应 vs1 元素的低 lg2(SEW) 位。
OP-V encodingvsll.vv
funct6
100101
vm
0
vs2
01000
vs1
01100
funct3
000
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00fa
0x010b
0x011c
0x012d
0x013e
0x014f
0x0160
0x0171
<<
<<
<<
<<
<<
<<
<<
<<
v12
0x000d
0x0016
0x001f
0x0028
0x0031
0x003a
0x0043
0x004c
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
当前步骤

显示 OP-V 32 位编码字段

vsll.vv 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。

动画展示 OP-V 解码、移位量低位选择、逐元素逻辑左移与目标写回;不模拟流水线或执行时延。

快速理解与检索要点

左移并低位补零,结果仅保留低 SEW 位。vstart≥vl(包括 vl=0)时,整个目标保持不变。

VSLL 属于 OP-V 向量算术编码,funct6=100101;.vv 形式由 funct3=000 选择。
VV 形式从每个 vs1[i] 元素取得对应 lane 的移位量来源。 实际移位量只取低 log2(SEW) 位。
VSLL.VV 左移并低位补零,保留低 SEW 位;普通 VSLL/VSRL/VSRA 不使用 vxrm 舍入,也不设置 vxsat。
vm=0 使用 v0 mask,vm=1 为未掩码形式;mask-off body 元素和 tail 元素的目标结果由当前 mask/tail policy 决定。
同 EEW 源/目标可重叠;masked vd 不可为 v0,v0 也不可同时作为 EEW=1 掩码与 SEW 数据源。

向量执行上下文

vd/vs2 是 SEW/LMUL 向量组;vs1 提供逐元素移位量;同名源必须读取相同初值。

32位 OP-V:opcode=1010111、funct6=100101、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。

活动 vd[i]=(vs2[i]<<shamt) mod 2^SEW;shamt 仅取低 log2(SEW) 位。低位补0,不舍入、不饱和。同宽源/目标可重叠;masked vd 不可包含 v0,v0 不可同时提供 EEW=1 掩码与 SEW 数据。

可选 v0.t 对应vm=0,省略为vm=1。仅 vstart≤i<vl 且掩码允许的元素计算;prestart不变,inactive/tail分别按vma/vta处理。vstart≥vl(含vl=0)不更新任何目标。示例假设SEW=16、LMUL=m1、vl=8、vstart=0,源和掩码已初始化。

要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。

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

常见使用场景

位操作与掩码

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且v0.t允许全部body。SEW=8, vl=4, v4=[3,3,3,3], v12=[1,31,128,255] → v8=[8,248,0,248]。inactive/tail按vma/vta;成功后vstart=0。

向量运算

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且v0.t允许全部body。SEW=8, vl=4, v4=[3,3,3,3], v12=[1,31,128,255] → v8=[8,248,0,248]。inactive/tail按vma/vta;成功后vstart=0。

乘以2的幂

假定 V/VS 已启用、合法受支持 m1、VLEN=4096、XLEN=64、vstart=0,源已初始化且v0.t允许全部body。SEW=8, vl=4, v4=[3,3,3,3], v12=[1,31,128,255] → v8=[8,248,0,248]。inactive/tail按vma/vta;成功后vstart=0。

使用前检查清单

语法检查
  • vd/vs2 是 SEW/LMUL 向量组;vs1 提供逐元素移位量;同名源必须读取相同初值。
  • 32位 OP-V:opcode=1010111、funct6=100101、funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。
语义检查
  • 活动 vd[i]=(vs2[i]<<shamt) mod 2^SEW;shamt 仅取低 log2(SEW) 位。低位补0,不舍入、不饱和。同宽源/目标可重叠;masked vd 不可包含 v0,v0 不可同时提供 EEW=1 掩码与 SEW 数据。
  • 可选 v0.t 对应vm=0,省略为vm=1。仅 vstart≤i<vl 且掩码允许的元素计算;prestart不变,inactive/tail分别按vma/vta处理。vstart≥vl(含vl=0)不更新任何目标。示例假设SEW=16、LMUL=m1、vl=8、vstart=0,源和掩码已初始化。
  • 要求 V 1.0、向量状态已启用及合法受支持 vtype/SEW;正常完成后 vstart=0。动画是教学分解,不代表处理器周期。

容易混淆 / 常见误区

不要把 VSLL.VV 的移位量理解为完整源值;实际移位量只取按 SEW 规定的低位。
VSLL.VV 是普通整数移位,不使用 vxrm 舍入,也不会因为移出位而设置 vxsat。
mask-off body 元素不是确定写 0;目标元素按当前 mask policy 处理。

常见问题

VSLL.VV 的移位量可以大于 SEW 吗?

源值可大于 SEW,但只取低 log2(SEW) 位,因此实际移位量范围为 0..SEW-1。

VSLL.VV 与相邻移位指令有什么区别?

VSLL 是左移,右侧空出的低位补 0;VSRL 是逻辑右移,高位补 0;VSRA 是算术右移,按有符号元素复制符号位。