Skip to content

vslideup:向高索引滑动元素

vslideupvs2[i-OFFSET] 写入更高索引的 vd[i]。低于偏移量的 body 元素不会被此指令写入。

操作码
OP-V 0x57 · funct6=001110
指令集
RISC-V V 1.0
英文全称
Vector Slide Up
参考资料
RISC-V ISA
页码
§30.1.16
01vslideup.vx02v803v1004a005v0.t
01
向高索引滑动vslideup.vxmnemonic

把 vs2 的元素移动到更高的目标索引;.vx 的偏移量来自整数寄存器。

02
目标寄存器组v8destination

接收结果;在 LMUL=2 时占用 v8–v9,不能与源寄存器组重叠。

03
源寄存器组v10source

提供待滑动元素;在 LMUL=2 时占用 v10–v11。

04
元素偏移a0offset

按照无符号 XLEN 位整数解释,不会截断到 SEW。

05
可选执行掩码v0.tmask

v0[i] 控制目标元素 i;无掩码时省略。

RVV REGISTER OPERATIONSLIDE UP
VLMAXLMUL × VLEN ÷ SEW;派生值,不能直接设置16 个元素
vd · v0–v1–v2–v3(初值)写入前的目标寄存器组
v3[511:384]v2[383:256]v1[255:128]v0[127:0]
vd[15]32SEW=32
vd[14]31SEW=32
vd[13]30SEW=32
vd[12]29SEW=32
vd[11]28SEW=32
vd[10]27SEW=32
vd[9]26SEW=32
vd[8]25SEW=32
vd[7]24SEW=32
vd[6]23SEW=32
vd[5]22SEW=32
vd[4]21SEW=32
vd[3]20SEW=32
vd[2]19SEW=32
vd[1]18SEW=32
vd[0]17SEW=32
vs2 · v8–v9–v10–v11512 BITS / REGISTER GROUP
v11[511:384]v10[383:256]v9[255:128]v8[127:0]
vs2[15]16SEW=32
vs2[14]15SEW=32
vs2[13]14SEW=32
vs2[12]13SEW=32
vs2[11]12SEW=32
vs2[10]11SEW=32
vs2[9]10SEW=32
vs2[8]9SEW=32
vs2[7]8SEW=32
vs2[6]7SEW=32
vs2[5]6SEW=32
vs2[4]5SEW=32
vs2[3]4SEW=32
vs2[2]3SEW=32
vs2[1]2SEW=32
vs2[0]1SEW=32
vs2[7] → vd[9]vs2[6] → vd[8]vs2[5] → vd[7]vs2[4] → vd[6]vs2[3] → vd[5]vs2[2] → vd[4]vs2[1] → vd[3]vs2[0] → vd[2]
vd · v0–v1–v2–v3(结果)目标索引增大
v3[511:384]v2[383:256]v1[255:128]v0[127:0]
vd[15]32tail 保持
vd[14]31tail 保持
vd[13]30tail 保持
vd[12]29tail 保持
vd[11]28tail 保持
vd[10]27tail 保持
vd[9]8vs2[7]
vd[8]7vs2[6]
vd[7]6vs2[5]
vd[6]5vs2[4]
vd[5]4vs2[3]
vd[4]3vs2[2]
vd[3]2vs2[1]
vd[2]1vs2[0]
vd[1]18保持
vd[0]17保持
body:执行并写入强调背景:本次操作写入tail:tu 下保持旧值图中高索引在左、低索引在右

指令形式

形式偏移来源
vslideup.vx vd, vs2, rs1, vm无符号 XLEN 位整数寄存器
vslideup.vi vd, vs2, uimm, vm5 位无符号立即数,范围 0…31
text
for i = max(vstart, OFFSET) .. vl-1:
    if mask[i]: vd[i] = vs2[i-OFFSET]

注意点

修改的寄存器

指令修改 vd[max(vstart, OFFSET) .. vl-1] 中启用的元素。vd 中低于 OFFSET 的 body 元素保持原值;被屏蔽元素由 vtype.vma 决定保持或变为 agnostic,尾部由 vtype.vta 决定。正常完成后 vstart 重置为 0;vs2、偏移来源、vlvtype 不变。

寄存器重叠

vd 不能与 vs2 的寄存器组重叠,否则编码保留;掩码形式的 vd 也不能与 v0 重叠。LMUL 大于 1 时,每个操作数必须满足寄存器组对齐要求。

vstart、vl 与掩码

掩码位控制目标索引,而不是源索引。当 vstart >= vl 时不写入任何元素,连 agnostic 尾部也不更新。

当前演示的 VLEN=128SEW=32LMUL=4,所以 VLMAX=16,实际 vl CSR 始终满足 vl≤16。若程序向 vsetvli 提交的 AVL 大于 16,那是“请求处理的剩余元素数”超过 VLMAX,而不是实际 vl 超过 16:当 16<AVL<32 时实现选择 ceil(AVL/2)≤vl≤16,当 AVL≥32vl=16,剩余元素由后续循环继续处理。

内存对齐

指令不访问内存,因此没有内存对齐要求。

标志位

指令不修改整数条件码、vxsatvxrmfflags

可汇编示例

asm
.text
.globl slideup_demo
slideup_demo:
    vsetivli t0, 8, e32, m2, tu, mu
    vle32.v v10, (a0)
    vsetivli t0, 6, e32, m2, tu, mu
    vslideup.vi v8, v10, 2
    vse32.v v8, (a1)
    ret

参考

SIGNAL MAINTAINED · BUILT FROM MARKDOWN