C.ADDIW

RISC-V C.ADDIW 指令详解

指令手册C-type

RV64 专用:rd 加有符号 6 位立即数,取低 32 位并符号扩展到 64 位写回;rd=x0 保留。

指令语法

c.addiw rd, imm
操作数说明
仅 RV64,C 2.0 或 Zca;16 位 CI 格式。
完整五位 rd/rs1 选 x1–x31,立即数为 -32–31;rd=x0 保留。
取 rd+imm 的低32位并符号扩展到64位;imm=0 合法,执行字符号扩展。
C压缩指令

指令行为说明

C.ADDIW(C 2.0 / Zca,CI)仅RV64,rd为x1–x31且同时作为源和目标,imm为-32–31。取rd+imm低32位,再把bit31符号扩展到64位;溢出无算术异常。等价addiw rd, rd, imm;imm=0合法,执行sext.w rd, rd,非HINT。

C.ADDIW 压缩编码学习实验

展示 16 位编码、操作数、计算和架构结果。

c.addiw,

RV64C / Zca, XLEN=64

XLEN
64 (RV64 only)
0x0000000080000000 + (-1), sext32 x10 <- 0x000000007FFFFFFF

16 位编码字段

15..13: funct3
001
12: imm[5]
1
11..7: rd/rs1
01010
6..2: imm[4:0]
11111
1..0: op
01
rd/rs1 = 01010 -> x10
imm[5|4:0] = 111111 -> 符号扩展 -1
0x0000000080000000 + (-1) -> low32 = 0x7FFFFFFF
sext32(0x7FFFFFFF) = 0x000000007FFFFFFF
尚未提交架构状态。

快速理解与检索要点

RV64 专用:rd 加有符号 6 位立即数,取低 32 位并符号扩展到 64 位写回;rd=x0 保留。

CI:funct3=001,op=01;imm[5] 位于 bit12,rd/rs1 位于 [11:7],imm[4:0] 位于 [6:2]。
同一主要编码在 RV32C 对应 C.JAL;C.ADDIW 仅适用于 RV64。

常见使用场景

RV64专用操作

RV64,x10=0x0000000080000000:c.addiw x10, -1 得到 x10=0x000000007fffffff;保留低32位再符号扩展。

使用前检查清单

语法检查
  • 仅 RV64,C 2.0 或 Zca;16 位 CI 格式。
  • 完整五位 rd/rs1 选 x1–x31,立即数为 -32–31;rd=x0 保留。
语义检查
  • 取 rd+imm 的低32位并符号扩展到64位;imm=0 合法,执行字符号扩展。

容易混淆 / 常见误区

仅 RV64;rd=x0 是保留编码。
立即数为 -32–31;imm=0 合法,执行字符号扩展。
仅取加法结果低32位,再符号扩展到64位。

常见问题

立即数为零是不是空操作?

不是。imm=0 仍将 rd 的低32位符号扩展到64位。例如 0x0000000080000000 变为 0xFFFFFFFF80000000。

rd=x0 是 HINT 吗?

不是,C.ADDIW 的 rd=x0 码点是保留编码。合法 rd 为 x1–x31。