C.LUI

RISC-V C.LUI 指令详解

指令手册C-type

RV32/RV64 C/Zca 的16位 CI 编码:非零6位立即数字段置于 bits17:12,低12位清零,bit17符号扩展到XLEN。

指令语法

c.lui rd, imm
操作数说明
RV32/RV64 C/Zca;16位 CI 格式。普通形式的完整5位 rd 选择 x1–x31,排除 x2。
非零6位字段按有符号 -32–31 理解,置于 bits17:12,低12位补零。
bit17 符号扩展到XLEN;rd=x0 且字段非零为 HINT,rd=x2 且字段非零为 C.ADDI16SP。
零字段对普通 C.LUI 保留;Zcmop 可将 rd=x1,x3,…,x15 的八个编码改为 C.MOP.n。
CZca压缩指令

指令行为说明

普通 C.LUI 的 rd 是完整5位字段,选择 x1–x31 但排除 x2。非零6位字段可按有符号 -32–31 理解:左移12位后符号扩展到 XLEN,对应 LUI。rd=x0 且字段非零是 HINT;rd=x2 且字段非零是 C.ADDI16SP,其立即数布局不同,不能沿用 C.LUI 的计算。字段为零的编码保留;Zcmop 可将 rd=x1、x3、…、x15 的八个零字段编码用作 C.MOP.n。

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

只展示官方定义的 16 位字段、地址/立即数计算和架构状态;不模拟流水线、缓存、端序实现或时序。

c.lui,
执行环境

RV32 / RV64 C / Zca

x10 -> 0x0000000000001000
16 位编码字段
15..13
funct3
011
12
nzimm[17]
0
11..7
rd
01010
6..2
nzimm[16:12]
00001
1..0
op
01
执行数据路径
CI 字段:nzimm=1;rd=01010 -> x10。 inst[12|6:2] -> 000001 -> signed 1; <<12; sext(bit17)
sext(1 << 12) = 0x0000000000001000
尚未提交架构状态。

快速理解与检索要点

RV32/RV64 C/Zca 的16位 CI 编码:非零6位立即数字段置于 bits17:12,低12位清零,bit17符号扩展到XLEN。

CI:inst[12] 给出 nzimm[17],inst[6:2] 给出 nzimm[16:12],低12位补零。
结果按 bit17 符号扩展;例如字段 -32 在 RV32 为0xfffe0000,在 RV64 为0xfffffffffffe0000。

常见使用场景

高位常量生成

RV32/RV64 C/Zca:c.lui x10, 1 将0x1000写入 x10,低12位为零,旧 x10 不参与计算。

使用前检查清单

语法检查
  • RV32/RV64 C/Zca;16位 CI 格式。普通形式的完整5位 rd 选择 x1–x31,排除 x2。
  • 非零6位字段按有符号 -32–31 理解,置于 bits17:12,低12位补零。
语义检查
  • bit17 符号扩展到XLEN;rd=x0 且字段非零为 HINT,rd=x2 且字段非零为 C.ADDI16SP。
  • 零字段对普通 C.LUI 保留;Zcmop 可将 rd=x1,x3,…,x15 的八个编码改为 C.MOP.n。

容易混淆 / 常见误区

普通形式要求 rd≠x0,x2,立即数字段非零。
同一个6位字段在 rd=x2 时按 C.ADDI16SP 的散布布局解释,不是高位立即数。
Zcmop 下的八个零立即数字段编码是 C.MOP.n,不执行普通 C.LUI。

常见问题

为什么 rd 不能是 sp?

rd=x2 选择 C.ADDI16SP,其字段计算栈指针增量;普通 C.LUI 的高位常量公式不适用。

零字段总是保留吗?

普通 C.LUI 的零字段保留。实现 Zcmop 时,八个奇数 rd=x1…x15 的相应编码改为不写寄存器的 C.MOP.n。