C.SUBW

RISC-V C.SUBW 指令详解

指令手册CA format

RV64C 的 16 位 CA 减法:rd'−rs2' 的低 32 位符号扩展到 64 位,写回 rd'。

指令语法

c.subw rd', rs2'

RV64 C 2.0/Zca;16 位 CA 格式,funct6=100111、funct2=00、op=01。

rd'/rs1' 和 rs2' 的三位字段 000–111 分别选择 x8–x15;rd' 同时是旧值源和目的。

先取旧 x[rd']−旧 x[rs2'] 的低 32 位,再将 bit31 符号扩展到 64 位写回 rd';同名源必须是同一个旧值。RV32 中此编码保留。

C压缩指令

指令行为说明

c.subw 是 RV64C 的 CA 格式指令,对 rd' - rs2' 做 32 位减法,并把 bit31 符号扩展到 XLEN 后写回 rd'。

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

仅展示手册定义的压缩字段、操作数和架构可见状态;不表示流水线、缓存或时序。

执行环境(RV64 C/Zca)
x8 <- sext.w(0x0000000080000000 - 0x0000000000000001) = 0x000000007FFFFFFF
16 位编码字段
15..10
funct6
100111
9..7
rd'/rs1'
000
6..5
funct2
00
4..2
rs2'
001
1..0
op
01
当前计算

rd'/rs1'=000 -> x8; rs2'=001 -> x9

提交步骤会显示架构可见结果。

快速理解与检索要点

c.subw 是 RV64C 的 CA 格式指令,对 rd' - rs2' 做 32 位减法,并把 bit31 符号扩展到 XLEN 后写回 rd'。

压缩指令通常对应一条 32 位基础指令语义,但有寄存器子集、立即数编码或 XLEN 限制。
仅 RV64C 有该 W 形式,RV32C 没有。
不要把 W 后缀读成完整 XLEN 宽减法。
rd' 和 rs2' 使用 x8..x15 压缩寄存器子集。

常见使用场景

RV64专用操作

RV64 C/Zca,旧 x8=0、x9=1:c.subw x8, x9 的低32位差值为0xffffffff,符号扩展后 x8=0xffffffffffffffff。

使用前检查清单

语法检查
  • RV64 C 2.0/Zca;16 位 CA 格式,funct6=100111、funct2=00、op=01。
  • rd'/rs1' 和 rs2' 的三位字段 000–111 分别选择 x8–x15;rd' 同时是旧值源和目的。
语义检查
  • 先取旧 x[rd']−旧 x[rs2'] 的低 32 位,再将 bit31 符号扩展到 64 位写回 rd';同名源必须是同一个旧值。RV32 中此编码保留。

容易混淆 / 常见误区

仅 RV64C 有该 W 形式,RV32C 没有。
不要把 W 后缀读成完整 XLEN 宽减法。
rd' 和 rs2' 使用 x8..x15 压缩寄存器子集。

常见问题

c.subw 为什么有寄存器限制?

多数 C 扩展格式用较短字段编码寄存器,因此部分形式只能访问 x8..x15 或固定寄存器。

c.subw 是否只是汇编伪指令?

不是。它是 C 扩展定义的 16 位编码指令。