C.MV

RISC-V C.MV 指令详解

指令手册CR format

16 位寄存器复制:普通形式将非零 rs2 的完整 XLEN 位值写入非零 rd。

指令语法

c.mv rd, rs2
操作数说明
rd:完整 5 位目的字段;普通形式为 x1–x31,旧 rd 不是源。
rs2:完整 5 位源字段;普通形式为 x1–x31,复制完整 XLEN 位值。
rs2=x0、rd≠x0 选择 C.JR;二者均零保留;rd=x0 且 rs2≠x0 是 HINT。
CZca压缩指令

指令行为说明

C.MV 是 16 位 CR 格式指令,使用完整 5 位 rd 和 rs2 字段,将 rs2 的 XLEN 位值复制到 rd,展开为 add rd, x0, rs2。普通形式要求 rd≠x0 且 rs2≠x0。rs2=x0、rd≠x0 的编码是 C.JR;二者均为 x0 的编码保留。rd=x0 且 rs2≠x0 是 HINT。C.MV 可用于 RV32I/RV64I 加 C 或 Zca。

C.MV 指令解析与执行动画

RV32I/RV64I + C(或 Zca);16 位,IALIGN=16。

c.mv rd, rs2

执行环境

假设取指成功、无异步中断及额外扩展检查;同名寄存器共用一份初值。

0 + 0x00000009 = 0x00000009; x10 ← 0x00000009
PC ← 0x00002002
16-位编码0x852E
funct4 [15..12]
1000
rd [11..7]
01010 → x10
rs2 [6..2]
01011 → x11
op [1..0]
10
rd[4:0]=01010 → x10; rs2[4:0]=01011 → x11=0x00000009; C.MV

还原压缩操作数

还原完整寄存器字段或固定操作数;先区分普通编码、HINT 和保留编码。

x10=0x00000007; PC=0x00002000
当前架构状态(提交前)

这是架构效果的教学步骤,不代表处理器流水线或周期。

快速理解与检索要点

16 位寄存器复制:普通形式将非零 rs2 的完整 XLEN 位值写入非零 rd。

funct4=1000、op=10;rd 在 bits 11..7,rs2 在 bits 6..2。
普通复制不读取旧 rd;rd=rs2 时仍使用写回前的源值。
成功普通执行后 PC+2;HINT 只推进 PC 并递增适用性能计数器。

常见使用场景

寄存器操作

RV32I/RV64I + C/Zca,x11=9:c.mv x10, x11 得到 x10=9,成功后 PC+2;旧 x10 不参与计算。

使用前检查清单

语法检查
  • RV32I/RV64I + C 或 Zca;16 位编码,IALIGN=16。
  • CR 的 rd 和 rs2 是完整 5 位字段,普通形式均非零,不是 x8–x15 的紧凑字段。
语义检查
  • 复制完整 XLEN 位 rs2,不读取旧 rd;rs2=x0 选择 C.JR,其中 rd=x0 保留;rd=x0 且 rs2 非零是 HINT。
  • 普通成功执行后 PC+2;C.NOP/HINT 仍推进 PC 和适用性能计数器。

容易混淆 / 常见误区

rd 和 rs2 是完整 5 位字段,不局限于 x8–x15。
rs2=x0、rd≠x0 选择 C.JR;rd=rs2=x0 是保留编码。
rd=x0 且 rs2≠x0 是 HINT,不执行普通寄存器复制。

常见问题

C.MV 和 MV 的展开相同吗?

不相同。C.MV 展开为 add rd, x0, rs2;规范 MV 伪指令展开为 addi rd, rs, 0。两者都复制寄存器值。

rd 和 rs2 可以重叠吗?

可以。非零 rd=rs2 时读取同一个旧值并写回,寄存器位模式不变。