VMV.S.X

RISC-V VMV.S.X 指令详解

指令手册OPMVX

把整数标量 x[rs1] 移入向量寄存器元素 0。

指令语法

vmv.s.x vd, rs1
操作数说明
vd 是单个向量寄存器,rs1 是整数 x 寄存器;忽略 LMUL 和向量寄存器组。
32 位 OP-V:opcode=1010111、funct6=010000、funct3=110、vm=1、vs2=00000;没有 v0.t。
vstart<vl 时写 vd[0]:XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零;寄存器内其余元素按 vta 处理。
vstart≥vl(含 vl=0)不更新任何目标元素,成功执行结束时 vstart 复位为0。要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。
V向量数据移动标量-向量传输

指令行为说明

VMV.S.X 是 RISC-V V 扩展的整数标量到向量元素移动指令。它把 x[rs1] 写入 vd[0],不是全向量广播或内存访问。SEW 小于 XLEN 时只复制低 SEW 位;SEW 大于 XLEN 时把标量符号扩展到 SEW 位。

VMV.S.X 指令解析与执行动画

从 OP-V 字段解析开始,展示整数标量如何在条件满足时写入向量元素 0。

输入的指令

固定 vm 与 vs2 字段仅在下方编码区显示,不是汇编语法操作数。

执行环境

教学环境:VLEN=4096,支持所选 SEW;忽略 LMUL 和向量寄存器组,只呈现元素 0;步骤不表示处理器周期。

funct6=010000vm=1vs2=00000rs1=01010funct3=110vd=01000opcode=1010111
架构可见状态
vd[0] <- 0xffffff80

发生写入时,单个目的寄存器内元素 1 至 VLEN/SEW−1 按 vta 保留旧值或可写全1;vstart≥vl 时整个目的寄存器保持。成功执行结束时 vstart 复位为 0。

解码

OP-V 的固定字段识别该标量写入元素 0 的形式:vm=1、vs2=00000,masked vm=0 编码保留。

快速理解与检索要点

VMV.S.X 把整数标量写入 vd[0]。它不做算术、不访问内存,也不广播到整个向量。

该指令固定 vm=1、vs2=0;其 masked(vm=0)编码保留,语法没有 v0.t 执行掩码。
它只写 vd[0]:SEW<XLEN 时复制 x[rs1] 的低 SEW 位;SEW>XLEN 时把 x[rs1] 符号扩展到 SEW 位。LMUL 和向量寄存器组不影响该标量元素传输。
元素 1 及以后按当前 tail agnostic/undisturbed policy 处理。若 vstart>=vl(因此也包括 vl=0),不更新目的寄存器。
要求 V 1.0、受支持的 SEW/LMUL、vtype.vill=0、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。vstart≥vl(含 vl=0)时包括 tail 在内不更新任何目标元素。

向量执行上下文

vd 是单个向量寄存器,rs1 是整数 x 寄存器;忽略 LMUL 和向量寄存器组。

32 位 OP-V:opcode=1010111、funct6=010000、funct3=110、vm=1、vs2=00000;没有 v0.t。

vstart<vl 时写 vd[0]:XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零;寄存器内其余元素按 vta 处理。

vstart≥vl(含 vl=0)不更新任何目标元素,成功执行结束时 vstart 复位为0。要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Version 20260120, Chapter 31

常见使用场景

向量初始化

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=4、vstart=0;XLEN=64, x10=0x123456789abcdef0 → v8[0]=0xf0。其余单寄存器元素按 vta 处理。不假定 tail 清零;vl=0 时整个目标不更新。

设置元素 0

假定 V/VS 已启用、合法 e8,m1、VLEN≥128、vl=4、vstart=0;XLEN=64, x10=0x123456789abcdef0 → v8[0]=0xf0。其余单寄存器元素按 vta 处理。不假定 tail 清零;vl=0 时整个目标不更新。

使用前检查清单

语法检查
  • vd 是单个向量寄存器,rs1 是整数 x 寄存器;忽略 LMUL 和向量寄存器组。
  • 32 位 OP-V:opcode=1010111、funct6=010000、funct3=110、vm=1、vs2=00000;没有 v0.t。
语义检查
  • vstart<vl 时写 vd[0]:XLEN>SEW 取低位,XLEN<SEW 符号扩展,x0 提供零;寄存器内其余元素按 vta 处理。
  • vstart≥vl(含 vl=0)不更新任何目标元素,成功执行结束时 vstart 复位为0。要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。

容易混淆 / 常见误区

仅写元素 0;元素 1 及以后按当前 tail policy 处理。
当 vstart >= vl(包括 vl=0)时不更新目的向量寄存器。
与 vmv.v.x 不同:.s.x 只写元素 0,.v.x 广播到活动 body 元素。

常见问题

VMV.S.X 如何处理掩码?

它固定 vm=1、vs2=0,vm=0 的对应编码保留,没有 v0.t。VMERGE 按 v0 选择所有 body 元素的源,不等价于本指令的单元素传输。