首页/指令库/VNCLIPU-WV
VNCLIPU.WV

RISC-V VNCLIPU.WV 指令详解

指令手册OPIVV

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

指令语法

vnclipu.wv vd, vs2, vs1, vm
操作数说明
vd 为 SEW/LMUL 窄目标组;vs2 为 2*SEW/2*LMUL 宽源组。组起点须对齐,EMUL≤8;支持所选源/目标宽度。
移位量来自同 lane 的 SEW 宽 vs1 元素;只使用低 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=8、vl=4、vstart=0,并已准备源数据、vxrm 和 v0。
V向量定点运算窄化/裁剪

指令行为说明

VNCLIPU.WV 读取活动 2*SEW 宽 vs2 元素,按来自同 lane vs1 元素的移位量执行定点舍入右移,然后裁剪到无符号 SEW 范围并写回 SEW 宽 vd;任一活动元素饱和会设置 sticky vxsat。

VNCLIPU.WV 指令解析与执行动画

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

输入的指令
vnclipu.wv

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

执行环境

教学模型固定 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 encodingvnclipu.wv
funct6
101110
vm
0
vs2
01000
vs1
01100
funct3
000
vd
00100
opcode
1010111
lane
0
1
2
3
4
5
6
7
v8
0x00000123
0x00001ff0
0x000000ff
0x7fffffff
0x00000100
0x00000007
0x00000123
0x00001ff0
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
clip>>
v12
0x0001
0x0004
0x0000
0x0008
0x0002
0x0013
0x0001
0x0004
v0.t
1
0
1
1
1
0
1
1
v4
...
-
...
...
...
-
...
...
lane 饱和
0
0
0
1
0
0
0
0
vxsat[0] 是单个 sticky CSR 位:先前值 0,本条活动 lane出现饱和,写回后为 1。上方 lane 饱和行仅显示每个 lane 是否触发这次置位条件。
当前步骤

显示 OP-V 32 位编码字段

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

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

快速理解与检索要点

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

WV 形式使用 OP-V 编码;funct6=101110,funct3=000 选择 .wv 操作数形式。
源 vs2 元素按 2*SEW 宽解释,目标 vd 元素为 SEW 宽;移位量来自同 lane vs1 元素。
每个 vs1 移位量只使用低 lg2(2*SEW) 位。
舍入由 vxrm 的 rnu、rne、rdn 或 rod 模式控制,随后按无符号目标范围执行饱和裁剪。
仅 vstart≤i<vl 且掩码开启的活动元素参与计算;inactive/tail 按 vma/vta,不参与本条指令的 vxsat 判断。
要求 V、已启用向量状态、合法 vtype 与受支持的源/目标宽度;VL=0 不更新目标,也不新置 vxsat。

向量执行上下文

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

移位量来自同 lane 的 SEW 宽 vs1 元素;只使用低 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=8、vl=4、vstart=0,并已准备源数据、vxrm 和 v0。

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

常见使用场景

定点结果窄化

假定 V/VS 已启用、合法 m1、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, vs2=[3,5,511,65535], vs1=[1,1,1,1], vxrm=rne, prior vxsat=0 → vd=[2,2,255,255], vxsat=1。示例演示舍入后无符号饱和。inactive/tail 按策略,不假定清零。

定点缩放与舍入输出

假定 V/VS 已启用、合法 m1、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, vs2=[3,5,511,65535], vs1=[1,1,1,1], vxrm=rne, prior vxsat=0 → vd=[2,2,255,255], vxsat=1。示例演示舍入后无符号饱和。inactive/tail 按策略,不假定清零。

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

假定 V/VS 已启用、合法 m1、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, vs2=[3,5,511,65535], vs1=[1,1,1,1], vxrm=rne, prior vxsat=0 → vd=[2,2,255,255], vxsat=1。示例演示舍入后无符号饱和。inactive/tail 按策略,不假定清零。

使用前检查清单

语法检查
  • vd 为 SEW/LMUL 窄目标组;vs2 为 2*SEW/2*LMUL 宽源组。组起点须对齐,EMUL≤8;支持所选源/目标宽度。
  • 移位量来自同 lane 的 SEW 宽 vs1 元素;只使用低 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=8、vl=4、vstart=0,并已准备源数据、vxrm 和 v0。

容易混淆 / 常见误区

VNCLIPU.WV 的 vs2 元素是 2*SEW 宽,vd 结果是 SEW 宽;不要按普通单宽右移理解。
舍入模式来自 V 扩展 fixed-point CSR vxrm,不是浮点 frm。
VNCLIPU 裁剪到无符号范围;只有活动元素发生饱和才设置 sticky vxsat。

常见问题

VNCLIPU.WV 和 VNSRL/VNSRA 有什么区别?

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

VNCLIPU.WV 什么时候设置 vxsat?

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