vslideup.vxmnemonic把 vs2 的元素移动到更高的目标索引;.vx 的偏移量来自整数寄存器。
vslideup 把 vs2[i-OFFSET] 写入更高索引的 vd[i]。低于偏移量的 body 元素不会被此指令写入。
vslideup.vx 02v8, 03v10, 04a0, 05v0.tvslideup.vxmnemonic把 vs2 的元素移动到更高的目标索引;.vx 的偏移量来自整数寄存器。
v8destination接收结果;在 LMUL=2 时占用 v8–v9,不能与源寄存器组重叠。
v10source提供待滑动元素;在 LMUL=2 时占用 v10–v11。
a0offset按照无符号 XLEN 位整数解释,不会截断到 SEW。
v0.tmaskv0[i] 控制目标元素 i;无掩码时省略。
[511:384]v2[383:256]v1[255:128]v0[127:0][511:384]v10[383:256]v9[255:128]v8[127:0][511:384]v2[383:256]v1[255:128]v0[127:0]| 形式 | 偏移来源 |
|---|---|
vslideup.vx vd, vs2, rs1, vm | 无符号 XLEN 位整数寄存器 |
vslideup.vi vd, vs2, uimm, vm | 5 位无符号立即数,范围 0…31 |
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、偏移来源、vl 和 vtype 不变。
vd 不能与 vs2 的寄存器组重叠,否则编码保留;掩码形式的 vd 也不能与 v0 重叠。LMUL 大于 1 时,每个操作数必须满足寄存器组对齐要求。
掩码位控制目标索引,而不是源索引。当 vstart >= vl 时不写入任何元素,连 agnostic 尾部也不更新。
当前演示的 VLEN=128、SEW=32、LMUL=4,所以 VLMAX=16,实际 vl CSR 始终满足 vl≤16。若程序向 vsetvli 提交的 AVL 大于 16,那是“请求处理的剩余元素数”超过 VLMAX,而不是实际 vl 超过 16:当 16<AVL<32 时实现选择 ceil(AVL/2)≤vl≤16,当 AVL≥32 时 vl=16,剩余元素由后续循环继续处理。
指令不访问内存,因此没有内存对齐要求。
指令不修改整数条件码、vxsat、vxrm 或 fflags。
.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