C.ADDI16SP 的立即数范围为何不是连续的每个整数?
该立即数按 16 字节缩放编码,因此只有 -512 到 496 之间的非零 16 字节倍数可编码。
将非零 6 位有符号立即数按 16 缩放后加到 x2/sp。16 位 CI 格式,与 C.LUI 共享编码空间。
C.ADDI16SP 与 C.LUI 共享编码空间,但目标字段固定为 x2/sp。它把分散编码的非零 nzimm[9:4] 符号扩展后加到 x2/sp;该立即数表示 -512 到 496 的 16 字节倍数。它展开为 addi x2, x2, nzimm[9:4];nzimm=0 的编码保留。
固定读写 x2/sp,还原缩放立即数,再计算并提交 XLEN 位结果。
rd/rs1 固定为 00010。inst[12] 和 inst[6:2] 拼回 nzimm[9:4];低四位为零,立即数符号扩展到 XLEN。
假设 C 扩展可用且取指成功。教学步骤不表示处理器流水线或周期;16 的倍数会保持原有 sp 的低四位,不会修正未对齐的 sp。
C.ADDI16SP 是 16 位 C 扩展指令:固定读取并写回 x2/sp,将非零 nzimm[9:4] 符号扩展后相加。它只编码 -512 到 496 的 16 字节倍数。
函数序言或尾声可用非零的 16 倍数调整固定的 x2/sp;例如旧 sp=0x1000、nzimm=-32,成功后 sp=0x0fe0,等效于 addi x2, x2, -32。
该立即数按 16 字节缩放编码,因此只有 -512 到 496 之间的非零 16 字节倍数可编码。
C.ADDI16SP 仅在 nzimm 非零时有效;nzimm=0 的编码保留。