VMV.X.S

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

指令手册OPMVV

把向量寄存器元素 0 移入整数寄存器 rd。

指令语法

vmv.x.s rd, vs2
操作数说明
rd 为整数寄存器,vs2 为单个向量寄存器;忽略 LMUL。
32 位 OP-V,opcode=1010111、funct6=010000、funct3=010、vm=1;vs1=00000 为固定字段,没有 v0.t。
只读 vs2[0],SEW<XLEN 符号扩展,SEW>XLEN 取低 XLEN 位;vl=0 或 vstart≥vl 仍执行,rd=x0 丢弃写入。
要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。成功执行后 vstart 复位为0。
V向量数据移动向量-标量传输

指令行为说明

VMV.X.S 是 RISC-V V 扩展的向量到标量移动指令。它从 vs2 的元素 0 向整数寄存器 rd 传送一个整数位模式;它不是全向量广播或内存访问。

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

从 OP-V 字段解析开始,读取向量元素 0 并按 SEW/XLEN 规则写入整数寄存器。

输入的指令

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

执行环境

教学环境:VLEN=4096,支持所选 SEW;忽略 LMUL 和寄存器组。VMV.X.S 即使 vl=0 或 vstart>=vl 也执行。

funct6=010000vm=1vs2=01000vs1=00000funct3=010rd=01010opcode=1010111
架构可见状态
尚未读取或写回
解码

OP-V 固定字段识别从 vs2 的元素 0 读取到整数 rd 的形式:vm=1、vs1=00000;vm=0 的 masked 编码保留。

快速理解与检索要点

VMV.X.S 只把 vs2 的元素 0 传送到整数 rd;它不广播、不访问内存,也不执行算术。若 rd=x0,传送结果被丢弃。

该指令使用 OPMVV 编码,固定 vm=1 与 vs1=0;vm=0 的 masked 编码保留,汇编语法没有 v0.t 执行掩码。
它从 vs2[0] 读取一个 SEW 宽元素并写入 rd:SEW>XLEN 时传送低 XLEN 位;SEW<XLEN 时符号扩展到 XLEN 位;两者相等时直接传送位模式。LMUL 和向量寄存器组不影响此传输。
VMV.X.S 即使 vstart>=vl 或 vl=0 也执行,因此它不同于普通按 body 元素写回的向量指令。

向量执行上下文

rd 为整数寄存器,vs2 为单个向量寄存器;忽略 LMUL。

32 位 OP-V,opcode=1010111、funct6=010000、funct3=010、vm=1;vs1=00000 为固定字段,没有 v0.t。

只读 vs2[0],SEW<XLEN 符号扩展,SEW>XLEN 取低 XLEN 位;vl=0 或 vstart≥vl 仍执行,rd=x0 丢弃写入。

要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。成功执行后 vstart 复位为0。

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

常见使用场景

读取向量元素 0

假定 V/VS 已启用、合法 m1、VLEN≥128、源已初始化、vstart=0;XLEN=64, e8, v8[0]=0x80, vl=0 → x10=0xffffffffffffff80。成功执行后 vstart=0。

提取向量标量结果

假定 V/VS 已启用、合法 m1、VLEN≥128、源已初始化、vstart=0;XLEN=64, e8, v8[0]=0x80, vl=0 → x10=0xffffffffffffff80。成功执行后 vstart=0。

使用前检查清单

语法检查
  • rd 为整数寄存器,vs2 为单个向量寄存器;忽略 LMUL。
  • 32 位 OP-V,opcode=1010111、funct6=010000、funct3=010、vm=1;vs1=00000 为固定字段,没有 v0.t。
语义检查
  • 只读 vs2[0],SEW<XLEN 符号扩展,SEW>XLEN 取低 XLEN 位;vl=0 或 vstart≥vl 仍执行,rd=x0 丢弃写入。
  • 要求 V 1.0、合法受支持 vtype、mstatus.VS 非 Off;H 且虚拟化 V=1 时 vsstatus.VS 也须非 Off。成功执行后 vstart 复位为0。

容易混淆 / 常见误区

即使 vl=0 或 vstart>=vl 也执行;它始终读取元素 0。
SEW>XLEN 时只传送低 XLEN 位;SEW<XLEN 时把元素 0 符号扩展到 XLEN。
vm=0 的 masked 编码保留;语法没有 v0.t 操作数。

常见问题

VMV.X.S 在 vl=0 时会执行吗?

会。官方规定 VMV.X.S 即使 vstart>=vl 或 vl=0 也执行,并从 vs2 的元素 0 传送数据。