Skip to content

vslide1up ​

vslide1up.vx 把整数寄存器中的标量写入 vd[0],并把 vs2[i-1] 写入 vd[i]。它等价于带标量插入的固定偏移 1 上滑。

操作码
OP-V 0x57 · funct6=001110
指令集
RISC-V V 1.0
英文全称
Vector Slide One Up
参考资料
RISC-V ISA
页码
§30.1.16
01vslide1up.vx02vd03vs204rs105vm
01
插入并向上滑动一格vslide1up.vxmnemonic

在最低元素插入整数标量,其余源元素移动到高一个索引。

02
目标寄存器组vddestination

接收插入和滑动结果。

03
源寄存器组vs2source

元素 i 被复制到目标元素 i+1。

04
插入值rs1source

整数寄存器中的最低 XLEN 位标量按照 SEW 截断或符号扩展。

05
可选执行掩码vmmask

掩码操作数逐目标元素控制是否写入;无掩码形式可省略。

RVV REGISTER OPERATIONSLIDE1 UP
li a0, 10 vsetvli t0, a0, e32, m4, tu, mu # VLEN=128 vslide1up.vx v0, v8, a1, v0.t
VLMAXLMUL × VLEN ÷ SEW;派生值,不能直接设置16 个元素
插入值=99(x[a0])
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[8] → vd[9]vs2[7] → vd[8]vs2[6] → vd[7]vs2[5] → vd[6]vs2[4] → vd[5]vs2[3] → vd[4]vs2[2] → vd[3]vs2[1] → vd[2]vs2[0] → vd[1]
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]9vs2[8]
vd[8]8vs2[7]
vd[7]7vs2[6]
vd[6]6vs2[5]
vd[5]5vs2[4]
vd[4]4vs2[3]
vd[3]3vs2[2]
vd[2]2vs2[1]
vd[1]1vs2[0]
vd[0]99x[a0]
body:执行并写入强调背景:本次操作写入tail:tu 下保持旧值图中高索引在左、低索引在右

等价操作 ​

text
for i = vstart .. vl-1:
    if mask[i]:
        vd[i] = (i == 0) ? scalar : vs2[i-1]

浮点对应形式为 vfslide1up.vf vd, vs2, fs1, vm,它从浮点寄存器取得一个 SEW 宽元素;本页演示整数形式。

语义伪代码 ​

VSLIDE1UPRISC-V V 1.0 · PSEUDOCODE
# integer scalar is inserted at element 0
for i = vstart .. vl - 1:
    if vm == 1 or v0.mask[i] == 1:
        vd[i] = i == 0 ? scalar(rs1) : vs2[i - 1]
    else:
        vd[i] = vma ? agnostic : old_vd[i]
for i = vl .. VLMAX - 1:
    vd[i] = vta ? agnostic : old_vd[i]
vstart = 0
agnostic 表示规范允许保留旧值或写全 1;辅助函数名称直接表达其规范动作。

注意点 ​

修改的寄存器 ​

指令修改 vd[vstart .. vl-1] 中启用的元素。被屏蔽元素由 vtype.vma 决定,尾部由 vtype.vta 决定。正常完成后 vstart 重置为 0;vs2、标量源、vl 和 vtype 不变。

寄存器重叠 ​

vd 不能与 vs2 重叠,否则编码保留;掩码形式的 vd 不能与 v0 重叠。

标量宽度 ​

XLEN 小于 SEW 时,插入标量被符号扩展;XLEN 大于 SEW 时,只复制最低 SEW 位。

vstart 与掩码 ​

若 vstart>0,元素 0 不会被重新插入。使用 v0.t 时,掩码位 0 也控制标量是否写入 vd[0]。当 vstart >= vl 时不写入任何元素。

内存对齐 ​

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

标志位 ​

指令不修改整数条件码、vxsat、vxrm 或 fflags。

可汇编示例 ​

asm
.text
.globl slide1up_demo
slide1up_demo:
    vsetivli t0, 6, e32, m2, tu, mu
    vle32.v v10, (a0)
    vslide1up.vx v8, v10, a2
    vse32.v v8, (a1)
    ret

参考 ​

SIGNAL MAINTAINED · BUILT FROM MARKDOWN