C.LW

RISC-V C.LW 指令详解

指令手册C-type

从内存加载 32 位字并符号扩展到 XLEN 后写入 rd'。CL格式。

指令语法

c.lw rd', offset(rs1')
操作数说明
C.LW 使用 16 位 CL 格式;rd' 和 rs1' 的 3 位字段分别选择 x8-x15。
offset 为 0 到 124 的 4 字节倍数,零扩展;字节偏移已含 ×4 缩放。
基址加偏移形成有效地址;成功加载的 32 位字符号扩展到 XLEN 写入 rd'。非自然对齐结果由 EEI 决定。
C压缩指令

扩展条件:RV32C / RV64C;本页按 C 扩展版本 2.0 说明。

指令行为说明

C.LW (CL格式,rd'和rs1'仅限x8-x15)从 rs1' 加零扩展、按 4 字节缩放偏移形成的地址加载 32 位字,并符号扩展到 XLEN 后写入 rd'。展开为 lw rd',offset(rs1');偏移范围为 0-124 字节。

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

三个学习步骤展示架构规则;不表示处理器流水线或周期。

c.lw,()
执行环境

RV32C / RV64C;C 扩展下 IALIGN=16,PC 为偶数字节地址。地址计算按 XLEN 回绕。 示例假定该内存访问获 EEI 允许;非自然对齐时才应用所选 EEI 结果,自然对齐不保证没有其他访问异常。

c.lw → x8 ← 0xFFFFFFFFFFFFFF80; PC ← 0x0000000000001002

16 位编码字段

0x4900

15..13
funct3
010
12..10
uimm[5:3]
010
9..7
rs1'
010
6
uimm[2]
0
5
uimm[6]
0
4..2
rd'
000
1..0
op
00
操作数与计算
恢复压缩操作数
rs1'=010 → x10; rd'=000 → x8; uimm[5:3]=010; uimm[2]=0; uimm[6]=0; uimm[6:0]=0010000; zero-extend(4) × 4 = 16 B;输入 offset 已是字节偏移,不再缩放。
计算
尚未计算
提交结果
待提交
架构可见结果

尚未提交架构结果。

快速理解与检索要点

C.LW 使用 CL 格式,rs1' 加零扩展且按 4 缩放的偏移形成地址,加载字后符号扩展到 XLEN。

rd' 和 rs1' 都只能编码 x8-x15。
非自然对齐有效地址的完成或异常由 EEI 决定。

常见使用场景

压缩字加载

结合 «c.lw x8, 0(x10) # RV64C; x10=0x2000; EEI permits mem32[0x2000]=0xFFFFFF80 -> x8=0xFFFFFFFFFFFFFF80» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认 RV32C / RV64C 与 16 位指令编码条件。
  • C.LW 使用 16 位 CL 格式;rd' 和 rs1' 的 3 位字段分别选择 x8-x15。
语义检查
  • offset 为 0 到 124 的 4 字节倍数,零扩展;字节偏移已含 ×4 缩放。
  • 基址加偏移形成有效地址;成功加载的 32 位字符号扩展到 XLEN 写入 rd'。非自然对齐结果由 EEI 决定。

容易混淆 / 常见误区

rd'和rs1'仅限x8-x15
偏移量为零扩展(非符号扩展),范围0-124字节且按 4 字节缩放;RV64 仍对加载的 32 位字做符号扩展
有效地址非自然对齐时,是否完成或引发 address-misaligned/access-fault 由 EEI 决定

常见问题

RV64 上 C.LW 会零扩展吗?

不会;它与 LW 一样把加载的 32 位字符号扩展到 XLEN。