VSSRL.VV 和 VSRL 有什么区别?
VSSRL.VV 在右移时按 vxrm 对被移出的位舍入;VSRL 是普通右移,不使用 vxrm。
VSSRL.VV 对活动元素执行按 vxrm 舍入的逻辑右移,移位量来自 vs1[i] 的低 lg2(SEW) 位。
VSSRL.VV 是 V 1.0 的单宽定点缩放逻辑右移。活动元素取 vs2[i],移位量 d 仅取 vs1[i] 的低 lg2(SEW) 位,结果为无符号右移后的值加 vxrm 舍入增量;d=0 保留原值。结果写入 vd,不饱和且不改变 vxsat。
从 OP-V 编码字段开始,展示 VSSRL 如何取移位量低位、按 vxrm 对移出的位舍入,再执行定点逻辑缩放右移。
教学环境: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 不显示确定值。输入非负 SEW 位模式;VSSRA 按补码有符号解释,VSSRL 按无符号解释,再按 vxrm 舍入;不改变 vxsat。d=0 不舍入。x0 提供零;正常完成后 vstart=0。VL=0 不更新目标;步骤不是处理器周期。
vssrl.vv 使用 OP-V 编码。动画把固定字段、寄存器字段、vm 和 vs1 字段放在同一条编码带中。
动画展示 OP-V 解码、移位量低位选择、逐元素右移与目标写回;不模拟流水线或执行时延。
用 vs1[i] 给出的有效位数右移 vs2[i],然后按 vxrm 舍入;并非饱和窄化。
vd/vs2/vs1 是 EEW=SEW、EMUL=LMUL 的向量组,起点须合法对齐;同宽源/目标可重叠,同名源读取相同初值。vs1[i] 提供各元素移位量。
32 位 OP-V:opcode=1010111,funct6=101010,funct3=000;vm 在 bit25,vs2 在 bits24:20,vs1 在 bits19:15,vd 在 bits11:7。省略 v0.t 为 vm=1,给出为 vm=0。
d 仅取移位量低 lg2(SEW) 位;按无符号数逻辑右移,再按 vxrm 计算 (v >> d)+r。rnu 最近向上、rne 最近偶数、rdn 向下、rod 奇数舍入;d=0 保留原值。该操作不饱和、不改变 vxsat。
要求 RV32/RV64 V 1.0、向量状态已启用、vill=0 和受支持 vtype/SEW。仅活动 vstart≤i<vl 元素计算;prestart 保持不变,inactive/tail 按 vma/vta 保留旧值或全1。vstart≥vl(含 vl=0)不更新任何目标元素。masked vd 不可含 v0;v0 不可同时作 EEW=1 掩码和 SEW 数据源。正常完成后 vstart=0;实现可拒绝无法由本实现产生的非零 vstart。
假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],v4=[3,3,3,3]。d=3,最近偶数舍入后 v8=[0,16,16,32];源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。
假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],v4=[3,3,3,3]。d=3,最近偶数舍入后 v8=[0,16,16,32];源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。
假定 V/VS 已启用、合法 e8,m1,tu,mu、VLEN=4096、XLEN=64、vl=4、vstart=0、vxrm=rne,v0.mask[0..3]=1111,v12=[1,127,128,255],v4=[3,3,3,3]。d=3,最近偶数舍入后 v8=[0,16,16,32];源不变,inactive/tail 保持旧值,vxsat 不变,正常完成后 vstart=0。
VSSRL.VV 在右移时按 vxrm 对被移出的位舍入;VSRL 是普通右移,不使用 vxrm。
不会。VSSRL 不做饱和,vxsat 保持原值,不会被清零。