VNCLIPU.WI 和 VNSRL/VNSRA 有什么区别?
VNCLIPU.WI 使用 vxrm 对移出的位舍入,并在结果超出无符号 SEW 范围时饱和且设置 vxsat;VNSRL/VNSRA 是窄化右移,不做饱和裁剪。
VNCLIPU.WI 是 RVV 无符号定点窄化裁剪指令,把 2*SEW 源按 vxrm 舍入并饱和到 SEW。
VNCLIPU.WI 读取活动 2*SEW 宽 vs2 元素,按来自 5-bit unsigned uimm 的移位量执行定点舍入右移,然后裁剪到无符号 SEW 范围并写回 SEW 宽 vd;任一活动元素饱和会设置 sticky vxsat。
从 OP-V 编码字段开始,展示 VNCLIPU 如何读取 2*SEW 宽 vs2,按移位量和 vxrm 舍入右移,再无符号饱和到 SEW 宽 vd,并在饱和时设置 vxsat。
要求已启用向量状态、合法 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 行为。步骤仅为教学分解,不是处理器周期。
vnclipu.wi 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 uimm 字段放在同一条编码带中。
动画只展示官方 V 扩展定义的 ISA 可见关系:OP-V 字段解析、活动元素读取、2*SEW 到 SEW 窄化裁剪整数无符号窄化裁剪、vxrm 定点舍入和 vd 写回;本示例会设置 sticky vxsat;不模拟流水线、缓存或执行时延。
VNCLIPU.WI 用于把宽定点中间结果缩回 SEW 宽度:先根据 shift amount 和 vxrm 做舍入右移,再按无符号目标范围饱和裁剪,并用 vxsat 记录活动元素是否发生饱和。
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=8、vl=4、vstart=0,并已准备源数据、vxrm 和 v0。
假定 V/VS 已启用、合法 m1、VLEN≥128、vl=4、vstart=0、v0.mask[0..3]=1111,源已初始化。SEW=8, vs2=[3,5,511,65535], uimm=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], uimm=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], uimm=1, vxrm=rne, prior vxsat=0 → vd=[2,2,255,255], vxsat=1。示例演示舍入后无符号饱和。inactive/tail 按策略,不假定清零。
VNCLIPU.WI 使用 vxrm 对移出的位舍入,并在结果超出无符号 SEW 范围时饱和且设置 vxsat;VNSRL/VNSRA 是窄化右移,不做饱和裁剪。
当任一活动元素的舍入右移结果超出无符号 SEW 范围并被裁剪时,本条指令设置 sticky vxsat。被 v0.t 掩码关闭的元素不参与该判断。