为什么 rd 不能是 sp?
rd=x2 选择 C.ADDI16SP,其字段计算栈指针增量;普通 C.LUI 的高位常量公式不适用。
RV32/RV64 C/Zca 的16位 CI 编码:非零6位立即数字段置于 bits17:12,低12位清零,bit17符号扩展到XLEN。
普通 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。
只展示官方定义的 16 位字段、地址/立即数计算和架构状态;不模拟流水线、缓存、端序实现或时序。
RV32 / RV64 C / Zca
RV32/RV64 C/Zca 的16位 CI 编码:非零6位立即数字段置于 bits17:12,低12位清零,bit17符号扩展到XLEN。
RV32/RV64 C/Zca:c.lui x10, 1 将0x1000写入 x10,低12位为零,旧 x10 不参与计算。
rd=x2 选择 C.ADDI16SP,其字段计算栈指针增量;普通 C.LUI 的高位常量公式不适用。
普通 C.LUI 的零字段保留。实现 Zcmop 时,八个奇数 rd=x1…x15 的相应编码改为不写寄存器的 C.MOP.n。