首页/指令库/VNCLIP-WI
VNCLIP.WI

RISC-V VNCLIP.WI 指令详解

指令手册OPIVI

VNCLIP.WI 是 RVV 有符号定点窄化裁剪指令,把 2*SEW 源按 vxrm 舍入并饱和到 SEW。

指令语法

vnclip.wi vd, vs2, uimm, vm
操作数说明
vd 为 SEW/LMUL 窄目标组;vs2 为 2*SEW/2*LMUL 宽源组。组起点须对齐,EMUL≤8;支持所选源/目标宽度。
移位量来自零扩展 5 位 uimm(0–31);只使用低 lg2(2*SEW) 位。先按 vxrm 的 rnu/rne/rdn/rod 舍入右移,再饱和到有符号 SEW 范围;活动元素饱和会置 sticky vxsat。
vd 仅可在最低寄存器相同处与宽 vs2 重叠,此时 mask/tail 强制 agnostic;.wv 的 vs1 不能与宽源组重叠。同一寄存器不能作为不同 EEW 的多个源。
vm 是可选 v0.t:vm=0 选择活动 body 元素,省略则 vm=1;masked vd 不可包含 v0,v0 不能同时提供 mask 和数据。body 满足 vstart≤i<vl;vstart≥vl(含 vl=0)不更新任何目标元素。
要求 V 1.0、已启用向量状态及合法受支持 vtype。示例假设 LMUL=m1、SEW=16、vl=8、vstart=0,并已准备源数据、vxrm 和 v0。
V向量定点运算窄化/裁剪

指令行为说明

VNCLIP.WI 读取活动 2*SEW 宽 vs2 元素,按来自 5-bit unsigned uimm 的移位量执行定点舍入右移,然后裁剪到有符号 SEW 范围并写回 SEW 宽 vd;任一活动元素饱和会设置 sticky vxsat。

VNCLIP.WI 指令解析与执行动画

从 OP-V 编码字段开始,展示 VNCLIP 如何读取 2*SEW 宽 vs2,按移位量和 vxrm 舍入右移,再有符号饱和到 SEW 宽 vd,并在饱和时设置 vxsat。

输入的指令
vnclip.wi

要求已启用向量状态、合法 vtype 且支持源 2*SEW 与目标 SEW;VL=0 不更新任何目标元素。同起点的窄目标/宽源重叠合法,此时 mask 与 tail 强制 agnostic;这里只展示 body,不为 inactive 或 tail 伪造确定值。

执行环境
立即数值
3 -> shamt 3
5-bit unsigned uimm;移位量取低 lg2(2*SEW) 位

教学模型固定 LMUL=m1、vstart=0、VLEN=4096,VLMAX=4096/16=256,只展示所选 VL=8 的 body 元素;假设实现支持源 2*SEW 和目标 SEW。宽源 vs2 的 EMUL=2,须从偶数寄存器开始;.wv 的 vs1 不可与宽源组重叠。inactive 与 tail 不显示确定结果;合法不同 EEW 重叠时强制采用 agnostic 行为。步骤仅为教学分解,不是处理器周期。

OP-V encodingvnclip.wi
funct6
101111
vm
0
vs2
01000
uimm
00011
funct3
011
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00000123
0x80000010
0x000000ff
0x7fffffff
0xffffffe0
0x00000007
0x00000123
0x80000010
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
imm
0x0003
0x0003
0x0003
0x0003
0x0003
0x0003
0x0003
0x0003
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
lane 饱和
0
0
0
1
0
0
0
1
vxsat[0] 是单个 sticky CSR 位:先前值 0,本条活动 lane出现饱和,写回后为 1。上方 lane 饱和行仅显示每个 lane 是否触发这次置位条件。
当前步骤

显示 OP-V 32 位编码字段

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

动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、2*SEW 到 SEW 窄化裁剪整数有符号窄化裁剪、vxrm 定点舍入和 vd 写回;本示例会设置 sticky vxsat;不模拟流水线、缓存或执行时延。

快速理解与检索要点

VNCLIP.WI 用于把宽定点中间结果缩回 SEW 宽度:先根据 shift amount 和 vxrm 做舍入右移,再按有符号目标范围饱和裁剪,并用 vxsat 记录活动元素是否发生饱和。

WI 形式使用 OP-V 编码;funct6=101111,funct3=011 选择 .wi 操作数形式。
源 vs2 元素按 2*SEW 宽解释,目标 vd 元素为 SEW 宽;移位量来自 5-bit unsigned uimm。 仅使用移位量低 lg2(2*SEW) 位;.wi 的 uimm 范围是 0–31。
舍入由 vxrm 的 rnu、rne、rdn 或 rod 模式控制,随后按有符号目标范围执行饱和裁剪。
只有当前 vl 内且执行掩码允许的 body 元素参与计算;被 v0.t 关闭的元素不参与本条指令的 vxsat 判断。
要求向量状态已启用、合法 vtype 并支持源 2*SEW 和目标 SEW。寄存器组须满足 EMUL、对齐和重叠约束;不同 EEW 的合法源/目标重叠强制采用 mask- 与 tail-agnostic。
示例假设 LMUL=m1、受支持的 SEW=16、vl=8、vstart=0,并已准备好源数据、vxrm 与 v0;vm 表示可选的 v0.t,省略则 vm=1。VL=0 不更新任何目标元素;vxsat 保留先前值,除非活动元素饱和将其置 1。

向量执行上下文

vd 为 SEW/LMUL 窄目标组;vs2 为 2*SEW/2*LMUL 宽源组。组起点须对齐,EMUL≤8;支持所选源/目标宽度。

移位量来自零扩展 5 位 uimm(0–31);只使用低 lg2(2*SEW) 位。先按 vxrm 的 rnu/rne/rdn/rod 舍入右移,再饱和到有符号 SEW 范围;活动元素饱和会置 sticky vxsat。

vd 仅可在最低寄存器相同处与宽 vs2 重叠,此时 mask/tail 强制 agnostic;.wv 的 vs1 不能与宽源组重叠。同一寄存器不能作为不同 EEW 的多个源。

vm 是可选 v0.t:vm=0 选择活动 body 元素,省略则 vm=1;masked vd 不可包含 v0,v0 不能同时提供 mask 和数据。body 满足 vstart≤i<vl;vstart≥vl(含 vl=0)不更新任何目标元素。

要求 V 1.0、已启用向量状态及合法受支持 vtype。示例假设 LMUL=m1、SEW=16、vl=8、vstart=0,并已准备源数据、vxrm 和 v0。

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

常见使用场景

定点结果窄化

结合 «vnclip.wi v8, v12, 3, v0.t» 等实际代码理解该场景。

向量 DSP 缩放输出

结合 «vnclip.wi v8, v12, 3, v0.t» 等实际代码理解该场景。

需要饱和标志的宽到窄转换

结合 «vnclip.wi v8, v12, 3, v0.t» 等实际代码理解该场景。

使用前检查清单

语法检查
  • vd 为 SEW/LMUL 窄目标组;vs2 为 2*SEW/2*LMUL 宽源组。组起点须对齐,EMUL≤8;支持所选源/目标宽度。
  • 移位量来自零扩展 5 位 uimm(0–31);只使用低 lg2(2*SEW) 位。先按 vxrm 的 rnu/rne/rdn/rod 舍入右移,再饱和到有符号 SEW 范围;活动元素饱和会置 sticky vxsat。
语义检查
  • vd 仅可在最低寄存器相同处与宽 vs2 重叠,此时 mask/tail 强制 agnostic;.wv 的 vs1 不能与宽源组重叠。同一寄存器不能作为不同 EEW 的多个源。
  • vm 是可选 v0.t:vm=0 选择活动 body 元素,省略则 vm=1;masked vd 不可包含 v0,v0 不能同时提供 mask 和数据。body 满足 vstart≤i<vl;vstart≥vl(含 vl=0)不更新任何目标元素。
  • 要求 V 1.0、已启用向量状态及合法受支持 vtype。示例假设 LMUL=m1、SEW=16、vl=8、vstart=0,并已准备源数据、vxrm 和 v0。

容易混淆 / 常见误区

VNCLIP.WI 的 vs2 元素是 2*SEW 宽,vd 结果是 SEW 宽;不要按普通单宽右移理解。
舍入模式来自 V 扩展 fixed-point CSR vxrm,不是浮点 frm。
VNCLIP 裁剪到有符号范围;只有活动元素发生饱和才设置 sticky vxsat。混合 EEW 的源/目标寄存器组只能在相同最低寄存器处重叠;其它组约束取决于当前 vtype。

常见问题

VNCLIP.WI 和 VNSRL/VNSRA 有什么区别?

VNCLIP.WI 使用 vxrm 对移出的位舍入,并在结果超出有符号 SEW 范围时饱和且设置 vxsat;VNSRL/VNSRA 是窄化右移,不做饱和裁剪。

VNCLIP.WI 什么时候设置 vxsat?

当任一活动元素的舍入右移结果超出有符号 SEW 范围并被裁剪时,本条指令设置 sticky vxsat。被 v0.t 掩码关闭的元素不参与该判断。